|
|
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.