|
|
1.1 ! root 1: /*++ BUILD Version: 0001 // Increment this if a change has global effects ! 2: ! 3: Copyright (c) 1985-1993, Microsoft Corporation ! 4: ! 5: Module Name: ! 6: ! 7: vdmdbg.h ! 8: ! 9: Abstract: ! 10: ! 11: Prodecure declarations, constant definitions, type definition and macros ! 12: for the VDMDBG.DLL VDM Debugger interface. ! 13: ! 14: --*/ ! 15: ! 16: #ifndef _VDMDBG_ ! 17: #define _VDMDBG_ ! 18: ! 19: #ifdef __cplusplus ! 20: extern "C" { ! 21: #endif ! 22: ! 23: #pragma pack(4) ! 24: ! 25: #define STATUS_VDM_EVENT STATUS_SEGMENT_NOTIFICATION ! 26: ! 27: #ifndef DBG_SEGLOAD ! 28: #define DBG_SEGLOAD 0 ! 29: #define DBG_SEGMOVE 1 ! 30: #define DBG_SEGFREE 2 ! 31: #define DBG_MODLOAD 3 ! 32: #define DBG_MODFREE 4 ! 33: #define DBG_SINGLESTEP 5 ! 34: #define DBG_BREAK 6 ! 35: #define DBG_GPFAULT 7 ! 36: #define DBG_DIVOVERFLOW 8 ! 37: #define DBG_INSTRFAULT 9 ! 38: #define DBG_TASKSTART 10 ! 39: #define DBG_TASKSTOP 11 ! 40: #define DBG_DLLSTART 12 ! 41: #define DBG_DLLSTOP 13 ! 42: #define DBG_ATTACH 14 ! 43: #endif ! 44: ! 45: // ! 46: // The following flags control the contents of the CONTEXT structure. ! 47: // ! 48: ! 49: #define VDMCONTEXT_i386 0x00010000 // this assumes that i386 and ! 50: #define VDMCONTEXT_i486 0x00010000 // i486 have identical context records ! 51: ! 52: #define VDMCONTEXT_CONTROL (VDMCONTEXT_i386 | 0x00000001L) // SS:SP, CS:IP, FLAGS, BP ! 53: #define VDMCONTEXT_INTEGER (VDMCONTEXT_i386 | 0x00000002L) // AX, BX, CX, DX, SI, DI ! 54: #define VDMCONTEXT_SEGMENTS (VDMCONTEXT_i386 | 0x00000004L) // DS, ES, FS, GS ! 55: #define VDMCONTEXT_FLOATING_POINT (VDMCONTEXT_i386 | 0x00000008L) // 387 state ! 56: #define VDMCONTEXT_DEBUG_REGISTERS (VDMCONTEXT_i386 | 0x00000010L) // DB 0-3,6,7 ! 57: ! 58: #define VDMCONTEXT_FULL (VDMCONTEXT_CONTROL | VDMCONTEXT_INTEGER |\ ! 59: VDMCONTEXT_SEGMENTS) ! 60: ! 61: ! 62: #ifdef _X86_ ! 63: ! 64: // On x86 machines, just copy the definition of the CONTEXT and LDT_ENTRY ! 65: // structures. ! 66: typedef struct _CONTEXT VDMCONTEXT; ! 67: typedef struct _LDT_ENTRY VDMLDT_ENTRY; ! 68: ! 69: #else // _X86_ ! 70: ! 71: // ! 72: // Define the size of the 80387 save area, which is in the context frame. ! 73: // ! 74: ! 75: #define SIZE_OF_80387_REGISTERS 80 ! 76: ! 77: typedef struct _FLOATING_SAVE_AREA { ! 78: ULONG ControlWord; ! 79: ULONG StatusWord; ! 80: ULONG TagWord; ! 81: ULONG ErrorOffset; ! 82: ULONG ErrorSelector; ! 83: ULONG DataOffset; ! 84: ULONG DataSelector; ! 85: UCHAR RegisterArea[SIZE_OF_80387_REGISTERS]; ! 86: ULONG Cr0NpxState; ! 87: } FLOATING_SAVE_AREA; ! 88: ! 89: // ! 90: // Simulated context structure for the 16-bit environment ! 91: // ! 92: ! 93: typedef struct _VDMCONTEXT { ! 94: ! 95: // ! 96: // The flags values within this flag control the contents of ! 97: // a CONTEXT record. ! 98: // ! 99: // If the context record is used as an input parameter, then ! 100: // for each portion of the context record controlled by a flag ! 101: // whose value is set, it is assumed that that portion of the ! 102: // context record contains valid context. If the context record ! 103: // is being used to modify a threads context, then only that ! 104: // portion of the threads context will be modified. ! 105: // ! 106: // If the context record is used as an IN OUT parameter to capture ! 107: // the context of a thread, then only those portions of the thread's ! 108: // context corresponding to set flags will be returned. ! 109: // ! 110: // The context record is never used as an OUT only parameter. ! 111: // ! 112: // CONTEXT_FULL on some systems (MIPS namely) does not contain the ! 113: // CONTEXT_SEGMENTS definition. VDMDBG assumes that CONTEXT_INTEGER also ! 114: // includes CONTEXT_SEGMENTS to account for this. ! 115: // ! 116: ! 117: ULONG ContextFlags; ! 118: ! 119: // ! 120: // This section is specified/returned if CONTEXT_DEBUG_REGISTERS is ! 121: // set in ContextFlags. Note that CONTEXT_DEBUG_REGISTERS is NOT ! 122: // included in CONTEXT_FULL. ! 123: // ! 124: ! 125: ULONG Dr0; ! 126: ULONG Dr1; ! 127: ULONG Dr2; ! 128: ULONG Dr3; ! 129: ULONG Dr6; ! 130: ULONG Dr7; ! 131: ! 132: // ! 133: // This section is specified/returned if the ! 134: // ContextFlags word contians the flag CONTEXT_FLOATING_POINT. ! 135: // ! 136: ! 137: FLOATING_SAVE_AREA FloatSave; ! 138: ! 139: // ! 140: // This section is specified/returned if the ! 141: // ContextFlags word contians the flag CONTEXT_SEGMENTS. ! 142: // ! 143: ! 144: ULONG SegGs; ! 145: ULONG SegFs; ! 146: ULONG SegEs; ! 147: ULONG SegDs; ! 148: ! 149: // ! 150: // This section is specified/returned if the ! 151: // ContextFlags word contians the flag CONTEXT_INTEGER. ! 152: // ! 153: ! 154: ULONG Edi; ! 155: ULONG Esi; ! 156: ULONG Ebx; ! 157: ULONG Edx; ! 158: ULONG Ecx; ! 159: ULONG Eax; ! 160: ! 161: // ! 162: // This section is specified/returned if the ! 163: // ContextFlags word contians the flag CONTEXT_CONTROL. ! 164: // ! 165: ! 166: ULONG Ebp; ! 167: ULONG Eip; ! 168: ULONG SegCs; // MUST BE SANITIZED ! 169: ULONG EFlags; // MUST BE SANITIZED ! 170: ULONG Esp; ! 171: ULONG SegSs; ! 172: ! 173: } VDMCONTEXT; ! 174: ! 175: // ! 176: // LDT descriptor entry ! 177: // ! 178: ! 179: typedef struct _VDMLDT_ENTRY { ! 180: USHORT LimitLow; ! 181: USHORT BaseLow; ! 182: union { ! 183: struct { ! 184: UCHAR BaseMid; ! 185: UCHAR Flags1; // Declare as bytes to avoid alignment ! 186: UCHAR Flags2; // Problems. ! 187: UCHAR BaseHi; ! 188: } Bytes; ! 189: struct { ! 190: ULONG BaseMid : 8; ! 191: ULONG Type : 5; ! 192: ULONG Dpl : 2; ! 193: ULONG Pres : 1; ! 194: ULONG LimitHi : 4; ! 195: ULONG Sys : 1; ! 196: ULONG Reserved_0 : 1; ! 197: ULONG Default_Big : 1; ! 198: ULONG Granularity : 1; ! 199: ULONG BaseHi : 8; ! 200: } Bits; ! 201: } HighWord; ! 202: } VDMLDT_ENTRY; ! 203: ! 204: ! 205: #endif // _X86_ ! 206: ! 207: typedef VDMCONTEXT *LPVDMCONTEXT; ! 208: typedef VDMLDT_ENTRY *LPVDMLDT_ENTRY; ! 209: ! 210: #define VDMCONTEXT_TO_PROGRAM_COUNTER(Context) (PVOID)((Context)->Eip) ! 211: ! 212: #define VDMCONTEXT_LENGTH (sizeof(VDMCONTEXT)) ! 213: #define VDMCONTEXT_ALIGN (sizeof(ULONG)) ! 214: #define VDMCONTEXT_ROUND (VDMCONTEXT_ALIGN - 1) ! 215: ! 216: #define V86FLAGS_CARRY 0x00001 ! 217: #define V86FLAGS_PARITY 0x00004 ! 218: #define V86FLAGS_AUXCARRY 0x00010 ! 219: #define V86FLAGS_ZERO 0x00040 ! 220: #define V86FLAGS_SIGN 0x00080 ! 221: #define V86FLAGS_TRACE 0x00100 ! 222: #define V86FLAGS_INTERRUPT 0x00200 ! 223: #define V86FLAGS_DIRECTION 0x00400 ! 224: #define V86FLAGS_OVERFLOW 0x00800 ! 225: #define V86FLAGS_IOPL 0x03000 ! 226: #define V86FLAGS_IOPL_BITS 0x12 ! 227: #define V86FLAGS_RESUME 0x10000 ! 228: #define V86FLAGS_V86 0x20000 // Used to detect RealMode v. ProtMode ! 229: #define V86FLAGS_ALIGNMENT 0x40000 ! 230: ! 231: #define MAX_MODULE_NAME 8 + 1 ! 232: #define MAX_PATH16 255 ! 233: ! 234: typedef struct _SEGMENT_NOTE { ! 235: WORD Selector1; // Selector of operation ! 236: WORD Selector2; // Dest. Sel. for moving segments ! 237: WORD Segment; // Segment within Module ! 238: CHAR Module[MAX_MODULE_NAME+1]; // Module name ! 239: CHAR FileName[MAX_PATH16+1]; // PathName to executable image ! 240: WORD Type; // Code / Data, etc. ! 241: DWORD Length; // Length of image ! 242: } SEGMENT_NOTE; ! 243: ! 244: typedef struct _IMAGE_NOTE { ! 245: CHAR Module[MAX_MODULE_NAME+1]; // Module ! 246: CHAR FileName[MAX_PATH16+1]; // Path to executable image ! 247: WORD hModule; // 16-bit hModule ! 248: WORD hTask; // 16-bit hTask ! 249: } IMAGE_NOTE; ! 250: ! 251: typedef struct { ! 252: DWORD dwSize; ! 253: char szModule[MAX_MODULE_NAME+1]; ! 254: HANDLE hModule; ! 255: WORD wcUsage; ! 256: char szExePath[MAX_PATH16+1]; ! 257: WORD wNext; ! 258: } MODULEENTRY, *LPMODULEENTRY; ! 259: ! 260: /* GlobalFirst()/GlobalNext() flags */ ! 261: #define GLOBAL_ALL 0 ! 262: #define GLOBAL_LRU 1 ! 263: #define GLOBAL_FREE 2 ! 264: ! 265: /* GLOBALENTRY.wType entries */ ! 266: #define GT_UNKNOWN 0 ! 267: #define GT_DGROUP 1 ! 268: #define GT_DATA 2 ! 269: #define GT_CODE 3 ! 270: #define GT_TASK 4 ! 271: #define GT_RESOURCE 5 ! 272: #define GT_MODULE 6 ! 273: #define GT_FREE 7 ! 274: #define GT_INTERNAL 8 ! 275: #define GT_SENTINEL 9 ! 276: #define GT_BURGERMASTER 10 ! 277: ! 278: /* If GLOBALENTRY.wType==GT_RESOURCE, the following is GLOBALENTRY.wData: */ ! 279: #define GD_USERDEFINED 0 ! 280: #define GD_CURSORCOMPONENT 1 ! 281: #define GD_BITMAP 2 ! 282: #define GD_ICONCOMPONENT 3 ! 283: #define GD_MENU 4 ! 284: #define GD_DIALOG 5 ! 285: #define GD_STRING 6 ! 286: #define GD_FONTDIR 7 ! 287: #define GD_FONT 8 ! 288: #define GD_ACCELERATORS 9 ! 289: #define GD_RCDATA 10 ! 290: #define GD_ERRTABLE 11 ! 291: #define GD_CURSOR 12 ! 292: #define GD_ICON 14 ! 293: #define GD_NAMETABLE 15 ! 294: #define GD_MAX_RESOURCE 15 ! 295: ! 296: typedef struct { ! 297: DWORD dwSize; ! 298: DWORD dwAddress; ! 299: DWORD dwBlockSize; ! 300: HANDLE hBlock; ! 301: WORD wcLock; ! 302: WORD wcPageLock; ! 303: WORD wFlags; ! 304: BOOL wHeapPresent; ! 305: HANDLE hOwner; ! 306: WORD wType; ! 307: WORD wData; ! 308: DWORD dwNext; ! 309: DWORD dwNextAlt; ! 310: } GLOBALENTRY, *LPGLOBALENTRY; ! 311: ! 312: typedef DWORD (CALLBACK* DEBUGEVENTPROC)( LPDEBUG_EVENT, LPVOID ); ! 313: ! 314: // Macros to access VDM_EVENT parameters ! 315: #define W1(x) ((USHORT)(x.ExceptionInformation[0])) ! 316: #define W2(x) ((USHORT)(x.ExceptionInformation[0] >> 16)) ! 317: #define W3(x) ((USHORT)(x.ExceptionInformation[1])) ! 318: #define W4(x) ((USHORT)(x.ExceptionInformation[1] >> 16)) ! 319: #define DW3(x) (x.ExceptionInformation[2]) ! 320: #define DW4(x) (x.ExceptionInformation[3]) ! 321: ! 322: #pragma pack() ! 323: ! 324: BOOL ! 325: WINAPI ! 326: VDMProcessException( ! 327: LPDEBUG_EVENT lpDebugEvent ! 328: ); ! 329: ! 330: BOOL ! 331: WINAPI ! 332: VDMGetThreadSelectorEntry( ! 333: HANDLE hProcess, ! 334: HANDLE hThread, ! 335: WORD wSelector, ! 336: LPVDMLDT_ENTRY lpSelectorEntry ! 337: ); ! 338: ! 339: ULONG ! 340: WINAPI ! 341: VDMGetPointer( ! 342: HANDLE hProcess, ! 343: HANDLE hThread, ! 344: WORD wSelector, ! 345: DWORD dwOffset, ! 346: BOOL fProtMode ! 347: ); ! 348: ! 349: BOOL ! 350: WINAPI ! 351: VDMGetThreadContext( ! 352: LPDEBUG_EVENT lpDebugEvent, ! 353: LPVDMCONTEXT lpVDMContext ! 354: ); ! 355: ! 356: BOOL ! 357: WINAPI ! 358: VDMSetThreadContext( ! 359: LPDEBUG_EVENT lpDebugEvent, ! 360: LPVDMCONTEXT lpVDMContext ! 361: ); ! 362: ! 363: BOOL ! 364: WINAPI ! 365: VDMGetSelectorModule( ! 366: HANDLE hProcess, ! 367: HANDLE hThread, ! 368: WORD wSelector, ! 369: PUINT lpSegmentNumber, ! 370: LPSTR lpModuleName, ! 371: UINT nNameSize, ! 372: LPSTR lpModulePath, ! 373: UINT nPathSize ! 374: ); ! 375: ! 376: BOOL ! 377: WINAPI ! 378: VDMGetModuleSelector( ! 379: HANDLE hProcess, ! 380: HANDLE hThread, ! 381: UINT wSegmentNumber, ! 382: LPSTR lpModuleName, ! 383: LPWORD lpSelector ! 384: ); ! 385: ! 386: BOOL ! 387: WINAPI ! 388: VDMModuleFirst( ! 389: HANDLE hProcess, ! 390: HANDLE hThread, ! 391: LPMODULEENTRY lpModuleEntry, ! 392: DEBUGEVENTPROC lpEventProc, ! 393: LPVOID lpData ! 394: ); ! 395: ! 396: BOOL ! 397: WINAPI ! 398: VDMModuleNext( ! 399: HANDLE hProcess, ! 400: HANDLE hThread, ! 401: LPMODULEENTRY lpModuleEntry, ! 402: DEBUGEVENTPROC lpEventProc, ! 403: LPVOID lpData ! 404: ); ! 405: ! 406: BOOL ! 407: WINAPI ! 408: VDMGlobalFirst( ! 409: HANDLE hProcess, ! 410: HANDLE hThread, ! 411: LPGLOBALENTRY lpGlobalEntry, ! 412: WORD wFlags, ! 413: DEBUGEVENTPROC lpEventProc, ! 414: LPVOID lpData ! 415: ); ! 416: ! 417: BOOL ! 418: WINAPI ! 419: VDMGlobalNext( ! 420: HANDLE hProcess, ! 421: HANDLE hThread, ! 422: LPGLOBALENTRY lpGlobalEntry, ! 423: WORD wFlags, ! 424: DEBUGEVENTPROC lpEventProc, ! 425: LPVOID lpData ! 426: ); ! 427: ! 428: typedef BOOL (WINAPI *PROCESSENUMPROC)( DWORD dwProcessId, DWORD dwAttributes, LPARAM lpUserDefined ); ! 429: typedef BOOL (WINAPI *TASKENUMPROC)( DWORD dwThreadId, WORD hMod16, WORD hTask16, LPARAM lpUserDefined ); ! 430: ! 431: #define WOW_SYSTEM (DWORD)0x0001 ! 432: ! 433: INT ! 434: WINAPI ! 435: VDMEnumProcessWOW( ! 436: PROCESSENUMPROC fp, ! 437: LPARAM lparam ! 438: ); ! 439: ! 440: INT ! 441: WINAPI ! 442: VDMEnumTaskWOW( ! 443: DWORD dwProcessId, ! 444: TASKENUMPROC fp, ! 445: LPARAM lparam ! 446: ); ! 447: ! 448: BOOL ! 449: WINAPI ! 450: VDMKillWOW( ! 451: VOID ! 452: ); ! 453: ! 454: BOOL ! 455: WINAPI ! 456: VDMDetectWOW( ! 457: VOID ! 458: ); ! 459: ! 460: BOOL ! 461: WINAPI ! 462: VDMBreakThread( ! 463: HANDLE hProcess, ! 464: HANDLE hThread ! 465: ); ! 466: ! 467: #ifdef __cplusplus ! 468: } ! 469: #endif ! 470: ! 471: #endif // _VDMDBG_
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.