日頃お世話になっております。シャノンです。
よろしくお願いいたします。
Toolhelp API などを使うことで、現在マシン上で動いているスレッドを列挙することが
出来ます。
この、他プロセスに属する任意のスレッドの、スタックメモリのアドレスを取得する方法
を、どなたかご存知ありませんでしょうか。
自プロセスの自スレッドのスタックは、以下の方法で取得できました。
NT_TIB * pTIB = NULL;
__asm
{
mov eax, dword ptr FS:[18H];
mov pTIB, eax;
}
任意のスレッドの FS は、GetThreadContext で取得できるのですが、アセンブリの知識
が乏しいため、そこから FS:[18H] を得る方法がわかりません。
もし、ご存知の方がいらっしゃいましたら、どうかご教示いただけませんでしょうか。
すいません、自己解決してしまいました。
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 );