home *** CD-ROM | disk | FTP | other *** search
/ C Programming Starter Kit 2.0 / SamsPublishing-CProgrammingStarterKit-v2.0-Win31.iso / bc45 / geninc32.pak / VDMDBG.H < prev    next >
C/C++ Source or Header  |  1997-07-23  |  12KB  |  472 lines

  1. /*++ BUILD Version: 0001    // Increment this if a change has global effects
  2.  
  3. Copyright (c) 1985-1995, 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. #include <pshpack4.h>
  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. #include <poppack.h>
  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_
  472.