5

WinDbgを使用してダンプファイルをデバッグしてきました。
x86ネイティブプログラムで機能する優れた「トリック」があり、スタックをスキャンしてCONTEXT_ALLフラグ(0x1003f)を探すことができます。

x64では、フラグに0x1003fCONTEXT_ALLが含まれていないようです...

ここで問題となるのは、ネイティブコードとマネージコードを組み合わせると、例外を見つける通常の方法(.excや.lasteventなど)が発生する場合があることです。

x64でこの0x1003fに相当するものは何ですか?そのような定数はありますか?

編集:

ところで、あなたが疑問に思っているなら、理論的には、定義のために10003fであるはずです:

#define CONTEXT_I386    0x00010000
#define CONTEXT_AMD64   0x00100000

#define CONTEXT_CONTROL             0x00000001L // SS:SP, CS:IP, FLAGS, BP
#define CONTEXT_INTEGER             0x00000002L // AX, BX, CX, DX, SI, DI
#define CONTEXT_SEGMENTS            0x00000004L // DS, ES, FS, GS
#define CONTEXT_FLOATING_POINT      0x00000008L // 387 state
#define CONTEXT_DEBUG_REGISTERS     0x00000010L // DB 0-3,6,7
#define CONTEXT_EXTENDED_REGISTERS  0x00000020L // cpu specific extensions
#define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_SEGMENTS)
#define CONTEXT_ALL (CONTEXT_FULL | CONTEXT_FLOATING_POINT | CONTEXT_DEBUG_REGISTERS | CONTEXT_EXTENDED_REGISTERS)

#define CONTEXT_I386_FULL CONTEXT_I386 | CONTEXT_FULL
#define CONTEXT_I386_ALL  CONTEXT_I386 | CONTEXT_ALL
#define CONTEXT_AMD64_FULL CONTEXT_AMD64 | CONTEXT_FULL
#define CONTEXT_AMD64_ALL  CONTEXT_AMD64 | CONTEXT_ALL

しかし、そうではありません...

4

1 に答える 1

2

私は通常、コンテキスト レコードを検索するためのキーとしてセグメント レジスタ値を使用します (ES と DS は同じ値を持ち、CONTEXT 構造内で隣り合っています)。フラグのトリックもいいけど。

テスト アプリケーションで例外を強制してから、コンテキスト レコード構造をスタックから掘り出すと、私の場合の魔法の値は 0x10001f になるように見えます。

0:000> dt ntdll!_context 000df1d0
...
   +0x030 ContextFlags     : 0x10001f
...
   +0x03a SegDs            : 0x2b
   +0x03c SegEs            : 0x2b
...

また、ContextFlags 値は構造体の先頭にないため、その値が見つかった場合は、コンテキストのベースを取得するために @@c++(#FIELD_OFFSET(ntdll!_CONTEXT, ContextFlags)) を減算する必要があります。構造。

また、明らかでない場合に備えて、この値はサンプル サイズがちょうど 1 から得られます。あなたの環境では正しくない可能性があり、もちろん変更される可能性があります (このような実装固有のものと同様)。

于 2012-05-07T14:43:35.380 に答える