任意のスレッドのスタックメモリを取得 – プログラミング – Home

任意のスレッドのスタックメモリを取得
 
通知
すべてクリア

[解決済] 任意のスレッドのスタックメモリを取得


aetos
(@aetos)
Noble Member
結合: 5年前
投稿: 1480
Topic starter  

日頃お世話になっております。シャノンです。
よろしくお願いいたします。

Toolhelp API などを使うことで、現在マシン上で動いているスレッドを列挙することが
出来ます。
この、他プロセスに属する任意のスレッドの、スタックメモリのアドレスを取得する方法
を、どなたかご存知ありませんでしょうか。

自プロセスの自スレッドのスタックは、以下の方法で取得できました。

NT_TIB * pTIB = NULL;
__asm
{
mov eax, dword ptr FS:[18H];
mov pTIB, eax;
}

任意のスレッドの FS は、GetThreadContext で取得できるのですが、アセンブリの知識
が乏しいため、そこから FS:[18H] を得る方法がわかりません。
もし、ご存知の方がいらっしゃいましたら、どうかご教示いただけませんでしょうか。


引用
トピックタグ
aetos
(@aetos)
Noble Member
結合: 5年前
投稿: 1480
Topic starter  

すいません、自己解決してしまいました。
GetThreadSelectorEntry 関数を使えば、セグメントアドレスをリニアアドレスに変換で
きるのですね。

参考までに、任意のスレッドのスタックアドレスとサイズを取得するコードを載せておき
ます。

CONTEXT context;
context.ContextFlags = CONTEXT_SEGMENTS;
GetThreadContext( hThread, &context );

LDT_ENTRY ldtEntry;
GetThreadSelectorEntry( hThread, context.SegFs, &ldtEntry );
NT_TIB * pTIB = reinterpret_cast< NT_TIB * >
( ldtEntry.BaseLow +
( ldtEntry.HighWord.Bytes.BaseMid << 16 ) +
( ldtEntry.HighWord.Bytes.BaseHi << 24 ) );

NT_TIB realTIB;
DWORD cbRead = 0;
ReadProcessMemory( hProcess, pTIB, &realTIB, sizeof( NT_TIB ), &cbRead );


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました