2011-09-15 11 views
1

私は、Windows7 64ビットで別のプロセスのEBPレジスタの値を取得しようとしています。このため
私はこのようなGetThreadContextを使用しています:私も使ってみましたWOW64_GetThreadContextが、それは... のGetLastError()が復帰を助けなかったEIP値はOKらしいGetThreadContextはEBP = 0を返す

static CONTEXT threadContext; 
memset(&threadContext, 0, sizeof(CONTEXT)); 
threadContext.ContextFlags = CONTEXT_FULL; 
bool contextOk = GetThreadContext(threadHandle, &threadContext); 

が、EBP = 0 0なので、それは大丈夫であるはずです。 このスレッドをSuspendThreadで中断します。スレッドをサンプリングするたびにこのスレッドは実行されません。

この原因は何ですか?

+0

あなたは知っています「あなたは実行中のスレッドのための有効なコンテキストを取得することはできません。 'GetThreadContext'を呼び出す前に、スレッドを一時停止するために' SuspendThread'関数を使用しますか。」? MSDN –

+0

はい、私は、あなたがプロセス(あるいは少なくともスレッド)を持っているので、私は:) – Idov

+0

をした中断は、多分あなたはそれに本当のデバッガをアタッチし、それ*はEBPが言っている*見ることができました。 –

答えて

2

考えられる原因の1つは、レジスタの値が検査時に実際にゼロであることが考えられます。これは汎用レジスタなので、プログラムは必要な値に設定することができます。

+0

関数の開始を保持するはずですか? – Idov

+1

x86では、基本的に2つのスタックフレームレイアウトがあります。EBPフレームとFPOフレームです。 EBPフレームでは、EBPは前のEBPを指し、EBP + 4はリターンアドレスを指し、EBP + 8は最初のスタック渡し引数を指します。 FPOフレームでは、EBPは「フレームポインタ」として使用されず、代わりに汎用レジスタです。したがって、実際にはターゲット関数に依存します。 – snoone

+0

しかし、私はスレッドコンテキストを読み込んだプロジェクトは、 "フレームポインタを省略"最適化を使用していません。 – Idov

関連する問題