任意のスレッドのスタックメモリを取得

[戻る]
シャノン 2005/03/01(火) 20:35:06
日頃お世話になっております。シャノンです。
よろしくお願いいたします。

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

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

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

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

シャノン 2005/03/01(火) 21:14:33
[[解決]]
すいません、自己解決してしまいました。
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 );

古いスレッドには追加発言できません。