Używam WinDbg do debugowania plików zrzutu od jakiegoś czasu.
Istnieje niezła "sztuczka", która działa z natywnymi programami x86, można zeskanować stos dla flag CONTEXT_ALL
(0x1003f).Jak znaleźć natywne wyjątki w stosie x64?
W x64 na CONTEXT_ALL
flagi najwyraźniej nie zawierają 0x1003f ...
Teraz problemem jest to, że czasami, kiedy rodzimy wymieszać z kodu zarządzanego, regularnych sposobów znajdowania wyjątków (jak .exc lub. ostatnie wydarzenie).
Jaki jest odpowiednik tego 0x1003f w x64? czy jest taka stała?
EDIT:
BTW, jeśli zastanawiasz się, w teorii powinno być 10003f ponieważ z definicji:
#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
ale to nie jest ...
który wydaje się działać, ale jakie jest przesunięcie z powrotem do początku struktury? Nie mogłem jeszcze zdobyć mojego stacka. –
Wartość, na którą polujesz, prawdopodobnie oznacza pole ContextFlags struktury _CONTEXT. Po znalezieniu magicznej wartości na stosie adres wskaźnika stosu wskazuje adres pola ContextFlags struktury. Tak więc, aby uzyskać podstawę struktury, należy odjąć przesunięcie pola ContextFlags. – snoone