source: trunk/include/win/vdmdbg.h@ 10367

Last change on this file since 10367 was 5983, checked in by bird, 24 years ago

Initial coding.

File size: 15.3 KB
Line 
1/* $Id: vdmdbg.h,v 1.1 2001-06-13 04:29:47 bird Exp $
2 *
3 * VDMDbg - Virtual Dos Machine Debug interface.
4 *
5 * Copyright (c) 2001 knut st. osmundsen (knut.stange.osmundsen@mynd.no)
6 *
7 * Project Odin Software License can be found in LICENSE.TXT
8 *
9 */
10
11#ifndef _vdmdbg_h_
12#define _vdmdbg_h_
13
14#ifdef __cplusplus
15extern "C" {
16#endif
17
18/*******************************************************************************
19* Defined Constants And Macros *
20*******************************************************************************/
21#define STATUS_VDM_EVENT STATUS_SEGMENT_NOTIFICATION
22
23/*
24 * Debug event identifiers.
25 */
26#ifndef DBG_SEGLOAD
27#define DBG_SEGLOAD 0
28#define DBG_SEGMOVE 1
29#define DBG_SEGFREE 2
30#define DBG_MODLOAD 3
31#define DBG_MODFREE 4
32#define DBG_SINGLESTEP 5
33#define DBG_BREAK 6
34#define DBG_GPFAULT 7
35#define DBG_DIVOVERFLOW 8
36#define DBG_INSTRFAULT 9
37#define DBG_TASKSTART 10
38#define DBG_TASKSTOP 11
39#define DBG_DLLSTART 12
40#define DBG_DLLSTOP 13
41#define DBG_ATTACH 14
42#define DBG_TOOLHELP 15
43#define DBG_STACKFAULT 16
44#define DBG_WOWINIT 17
45#define DBG_TEMPBP 18
46#define DBG_MODMOVE 19
47#define DBG_INIT 20
48#define DBG_GPFAULT2 21
49#endif
50
51
52/*
53 * These flags are set in the same WORD as the DBG_ event ids (above).
54 */
55#define VDMEVENT_NEEDS_INTERACTIVE 0x8000
56#define VDMEVENT_VERBOSE 0x4000
57#define VDMEVENT_PE 0x2000
58#define VDMEVENT_ALLFLAGS 0xe000
59
60/*
61 * These flags are set in the second WORD of the exception event
62 * parameters.
63 */
64#define VDMEVENT_V86 0x0001
65#define VDMEVENT_PM16 0x0002
66
67/*
68 * The following flags control the contents of the CONTEXT structure.
69 */
70#define VDMCONTEXT_i386 0x00010000 /* this assumes that i386 and */
71#define VDMCONTEXT_i486 0x00010000 /* i486 have identical context records */
72
73#define VDMCONTEXT_CONTROL (VDMCONTEXT_i386 | 0x00000001L) /* SS:SP, CS:IP, FLAGS, BP */
74#define VDMCONTEXT_INTEGER (VDMCONTEXT_i386 | 0x00000002L) /* AX, BX, CX, DX, SI, DI */
75#define VDMCONTEXT_SEGMENTS (VDMCONTEXT_i386 | 0x00000004L) /* DS, ES, FS, GS */
76#define VDMCONTEXT_FLOATING_POINT (VDMCONTEXT_i386 | 0x00000008L) /* 387 state */
77#define VDMCONTEXT_DEBUG_REGISTERS (VDMCONTEXT_i386 | 0x00000010L) /* DB 0-3,6,7 */
78
79#define VDMCONTEXT_FULL (VDMCONTEXT_CONTROL | VDMCONTEXT_INTEGER |\
80 VDMCONTEXT_SEGMENTS)
81
82
83/*
84 * More CONTEXT stuff.
85 */
86#define VDMCONTEXT_TO_PROGRAM_COUNTER(Context) (PVOID)((Context)->Eip)
87
88#define VDMCONTEXT_LENGTH (sizeof(VDMCONTEXT))
89#define VDMCONTEXT_ALIGN (sizeof(ULONG))
90#define VDMCONTEXT_ROUND (VDMCONTEXT_ALIGN - 1)
91
92#define V86FLAGS_CARRY 0x00001
93#define V86FLAGS_PARITY 0x00004
94#define V86FLAGS_AUXCARRY 0x00010
95#define V86FLAGS_ZERO 0x00040
96#define V86FLAGS_SIGN 0x00080
97#define V86FLAGS_TRACE 0x00100
98#define V86FLAGS_INTERRUPT 0x00200
99#define V86FLAGS_DIRECTION 0x00400
100#define V86FLAGS_OVERFLOW 0x00800
101#define V86FLAGS_IOPL 0x03000
102#define V86FLAGS_IOPL_BITS 0x12
103#define V86FLAGS_RESUME 0x10000
104#define V86FLAGS_V86 0x20000 /* Used to detect RealMode v. ProtMode */
105#define V86FLAGS_ALIGNMENT 0x40000
106
107/*
108 * Sizes within the module structures.
109 */
110#define MAX_MODULE_NAME 8 + 1
111#define MAX_PATH16 255
112
113/*
114 * Seginfo flags.
115 */
116#define SN_CODE 0 /* Protect mode code segment */
117#define SN_DATA 1 /* Protect mode data segment */
118#define SN_V86 2 /* V86 mode segment */
119
120
121/*
122 * GlobalFirst/GlobalNext flags
123 */
124#define GLOBAL_ALL 0
125#define GLOBAL_LRU 1
126#define GLOBAL_FREE 2
127
128/*
129 * GLOBALENTRY.wType entries
130 */
131#define GT_UNKNOWN 0
132#define GT_DGROUP 1
133#define GT_DATA 2
134#define GT_CODE 3
135#define GT_TASK 4
136#define GT_RESOURCE 5
137#define GT_MODULE 6
138#define GT_FREE 7
139#define GT_INTERNAL 8
140#define GT_SENTINEL 9
141#define GT_BURGERMASTER 10
142
143/*
144 * If GLOBALENTRY.wType==GT_RESOURCE Then
145 * The following is GLOBALENTRY.wData:
146 */
147#define GD_USERDEFINED 0
148#define GD_CURSORCOMPONENT 1
149#define GD_BITMAP 2
150#define GD_ICONCOMPONENT 3
151#define GD_MENU 4
152#define GD_DIALOG 5
153#define GD_STRING 6
154#define GD_FONTDIR 7
155#define GD_FONT 8
156#define GD_ACCELERATORS 9
157#define GD_RCDATA 10
158#define GD_ERRTABLE 11
159#define GD_CURSOR 12
160#define GD_ICON 14
161#define GD_NAMETABLE 15
162#define GD_MAX_RESOURCE 15
163
164/*
165 * Macros to access the VDM_EVENT parameters.
166 */
167#define W1(x) ((USHORT)(x.ExceptionInformation[0]))
168#define W2(x) ((USHORT)(x.ExceptionInformation[0] >> 16))
169#define W3(x) ((USHORT)(x.ExceptionInformation[1]))
170#define W4(x) ((USHORT)(x.ExceptionInformation[1] >> 16))
171#define DW3(x) (x.ExceptionInformation[2])
172#define DW4(x) (x.ExceptionInformation[3])
173
174/*
175 * Used with VDMEnumProcessWOW I guess.
176 */
177#define WOW_SYSTEM (DWORD)0x0001
178
179/*
180 * ???
181 */
182#define VDMADDR_V86 2
183#define VDMADDR_PM16 4
184#define VDMADDR_PM32 16
185
186/*
187 * ??
188 */
189#define VDMDBG_BREAK_DOSTASK 0x00000001
190#define VDMDBG_BREAK_WOWTASK 0x00000002
191#define VDMDBG_BREAK_LOADDLL 0x00000004
192#define VDMDBG_BREAK_EXCEPTIONS 0x00000008
193#define VDMDBG_BREAK_DEBUGGER 0x00000010
194#define VDMDBG_TRACE_HISTORY 0x00000080
195
196
197/*******************************************************************************
198* Structures and Typedefs *
199*******************************************************************************/
200#pragma pack(4)
201typedef BOOL (WIN32API *PROCESSENUMPROC)( DWORD dwProcessId, DWORD dwAttributes, LPARAM lpUserDefined );
202typedef BOOL (WIN32API *TASKENUMPROC)( DWORD dwThreadId, WORD hMod16, WORD hTask16, LPARAM lpUserDefined );
203typedef BOOL (WIN32API *TASKENUMPROCEX)( DWORD dwThreadId, WORD hMod16, WORD hTask16,
204 LPSTR pszModName, LPSTR pszFileName, LPARAM lpUserDefined );
205typedef struct _CONTEXT VDMCONTEXT;
206typedef struct _LDT_ENTRY VDMLDT_ENTRY;
207typedef VDMCONTEXT *LPVDMCONTEXT;
208typedef VDMLDT_ENTRY *LPVDMLDT_ENTRY;
209
210
211typedef struct _SEGMENT_NOTE {
212 WORD Selector1; /* Selector of operation */
213 WORD Selector2; /* Dest. Sel. for moving segments */
214 WORD Segment; /* Segment within Module */
215 CHAR Module[MAX_MODULE_NAME + 1]; /* Module name */
216 CHAR FileName[MAX_PATH16 + 1]; /* PathName to executable image */
217 WORD Type; /* Code / Data, etc. */
218 DWORD Length; /* Length of image */
219} SEGMENT_NOTE;
220
221typedef struct _IMAGE_NOTE {
222 CHAR Module[MAX_MODULE_NAME + 1]; /* Module */
223 CHAR FileName[MAX_PATH16 + 1]; /* Path to executable image */
224 WORD hModule; /* 16-bit hModule */
225 WORD hTask; /* 16-bit hTask */
226} IMAGE_NOTE;
227
228typedef struct {
229 DWORD dwSize;
230 char szModule[MAX_MODULE_NAME + 1];
231 HANDLE hModule;
232 WORD wcUsage;
233 char szExePath[MAX_PATH16 + 1];
234 WORD wNext;
235} MODULEENTRY, *LPMODULEENTRY;
236
237typedef struct _TEMP_BP_NOTE {
238 WORD Seg; /* Dest. Segment or Selector */
239 DWORD Offset; /* Dest. Offset */
240 BOOL bPM; /* TRUE for PM, FALSE for V86 */
241} TEMP_BP_NOTE;
242
243typedef struct _VDM_SEGINFO {
244 WORD Selector; /* Selector or RM segment */
245 WORD SegNumber; /* Logical segment number in executable */
246 DWORD Length; /* Length of segment */
247 WORD Type; /* Type (0=v86, 1=PM) */
248 CHAR ModuleName[MAX_MODULE_NAME]; /* Module */
249 CHAR FileName[MAX_PATH16]; /* Path to executable image */
250} VDM_SEGINFO;
251
252typedef struct {
253 DWORD dwSize;
254 DWORD dwAddress;
255 DWORD dwBlockSize;
256 HANDLE hBlock;
257 WORD wcLock;
258 WORD wcPageLock;
259 WORD wFlags;
260 BOOL wHeapPresent;
261 HANDLE hOwner;
262 WORD wType;
263 WORD wData;
264 DWORD dwNext;
265 DWORD dwNextAlt;
266} GLOBALENTRY, *LPGLOBALENTRY;
267
268typedef DWORD (CALLBACK* DEBUGEVENTPROC)( LPDEBUG_EVENT, LPVOID );
269
270/*
271 * Typedefinitions for the entry points.
272 */
273typedef BOOL (WIN32API *VDMPROCESSEXCEPTIONPROC)(LPDEBUG_EVENT);
274typedef BOOL (WIN32API *VDMGETTHREADSELECTORENTRYPROC)(HANDLE, HANDLE, DWORD, LPVDMLDT_ENTRY);
275typedef ULONG (WIN32API *VDMGETPOINTERPROC)(HANDLE, HANDLE, WORD, DWORD, BOOL);
276typedef BOOL (WIN32API *VDMGETCONTEXTPROC)(HANDLE, HANDLE, LPVDMCONTEXT);
277typedef BOOL (WIN32API *VDMSETCONTEXTPROC)(HANDLE, HANDLE, LPVDMCONTEXT);
278typedef BOOL (WIN32API *VDMKILLWOWPROC)(VOID);
279typedef BOOL (WIN32API *VDMDETECTWOWPROC)(VOID);
280typedef BOOL (WIN32API *VDMBREAKTHREADPROC)(HANDLE);
281typedef BOOL (WIN32API *VDMGETSELECTORMODULEPROC)(HANDLE, HANDLE, WORD, PUINT, LPSTR, UINT, LPSTR, UINT);
282typedef BOOL (WIN32API *VDMGETMODULESELECTORPROC)(HANDLE, HANDLE, UINT, LPSTR, LPWORD);
283typedef BOOL (WIN32API *VDMMODULEFIRSTPROC)(HANDLE, HANDLE, LPMODULEENTRY, DEBUGEVENTPROC, LPVOID);
284typedef BOOL (WIN32API *VDMMODULENEXTPROC)(HANDLE, HANDLE, LPMODULEENTRY, DEBUGEVENTPROC, LPVOID);
285typedef BOOL (WIN32API *VDMGLOBALFIRSTPROC)(HANDLE, HANDLE, LPGLOBALENTRY, WORD, DEBUGEVENTPROC, LPVOID);
286typedef BOOL (WIN32API *VDMGLOBALNEXTPROC)(HANDLE, HANDLE, LPGLOBALENTRY, WORD, DEBUGEVENTPROC, LPVOID);
287
288typedef INT (WIN32API *VDMENUMPROCESSWOWPROC)(PROCESSENUMPROC, LPARAM);
289typedef INT (WIN32API *VDMENUMTASKWOWPROC)(DWORD, TASKENUMPROC, LPARAM);
290typedef INT (WIN32API *VDMENUMTASKWOWEXPROC)(DWORD, TASKENUMPROCEX, LPARAM);
291typedef BOOL (WIN32API *VDMTERMINATETASKINWOWPROC)(DWORD, WORD);
292typedef BOOL (WIN32API *VDMSTARTTASKINWOWPROC)(DWORD, LPSTR, WORD);
293
294typedef DWORD (WIN32API *VDMGETDBGFLAGSPROC)(HANDLE);
295typedef BOOL (WIN32API *VDMSETDBGFLAGSPROC)(HANDLE, DWORD);
296typedef BOOL (WIN32API *VDMISMODULELOADEDPROC)(LPSTR);
297typedef BOOL (WIN32API *VDMGETSEGMENTINFOPROC)(WORD, ULONG, BOOL, VDM_SEGINFO);
298typedef BOOL (WIN32API *VDMGETSYMBOLPROC)(LPSTR, WORD, DWORD, BOOL, BOOL, LPSTR, PDWORD);
299typedef BOOL (WIN32API *VDMGETADDREXPRESSIONPROC)(LPSTR, LPSTR, LPWORD, PDWORD, LPWORD);
300
301#pragma pack()
302
303
304BOOL WIN32API VDMProcessException(
305 LPDEBUG_EVENT lpDebugEvent
306 );
307
308BOOL WIN32API VDMGetThreadSelectorEntry(
309 HANDLE hProcess,
310 HANDLE hThread,
311 WORD wSelector,
312 LPVDMLDT_ENTRY lpSelectorEntry
313 );
314
315ULONG WIN32API VDMGetPointer(
316 HANDLE hProcess,
317 HANDLE hThread,
318 WORD wSelector,
319 DWORD dwOffset,
320 BOOL fProtMode
321 );
322
323BOOL WIN32API VDMGetThreadContext(
324 LPDEBUG_EVENT lpDebugEvent,
325 LPVDMCONTEXT lpVDMContext
326 );
327
328BOOL WIN32API VDMSetThreadContext(
329 LPDEBUG_EVENT lpDebugEvent,
330 LPVDMCONTEXT lpVDMContext
331 );
332
333BOOL WIN32API VDMGetContext(
334 HANDLE hProcess,
335 HANDLE hThread,
336 LPVDMCONTEXT lpVDMContext
337 );
338
339BOOL WIN32API VDMSetContext(
340 HANDLE hProcess,
341 HANDLE hThread,
342 LPVDMCONTEXT lpVDMContext
343 );
344
345BOOL WIN32API VDMGetSelectorModule(
346 HANDLE hProcess,
347 HANDLE hThread,
348 WORD wSelector,
349 PUINT lpSegmentNumber,
350 LPSTR lpModuleName,
351 UINT nNameSize,
352 LPSTR lpModulePath,
353 UINT nPathSize
354 );
355
356BOOL WIN32API VDMGetModuleSelector(
357 HANDLE hProcess,
358 HANDLE hThread,
359 UINT wSegmentNumber,
360 LPSTR lpModuleName,
361 LPWORD lpSelector
362 );
363
364BOOL WIN32API VDMModuleFirst(
365 HANDLE hProcess,
366 HANDLE hThread,
367 LPMODULEENTRY lpModuleEntry,
368 DEBUGEVENTPROC lpEventProc,
369 LPVOID lpData
370 );
371
372BOOL WIN32API VDMModuleNext(
373 HANDLE hProcess,
374 HANDLE hThread,
375 LPMODULEENTRY lpModuleEntry,
376 DEBUGEVENTPROC lpEventProc,
377 LPVOID lpData
378 );
379
380BOOL WIN32API VDMGlobalFirst(
381 HANDLE hProcess,
382 HANDLE hThread,
383 LPGLOBALENTRY lpGlobalEntry,
384 WORD wFlags,
385 DEBUGEVENTPROC lpEventProc,
386 LPVOID lpData
387 );
388
389BOOL WIN32API VDMGlobalNext(
390 HANDLE hProcess,
391 HANDLE hThread,
392 LPGLOBALENTRY lpGlobalEntry,
393 WORD wFlags,
394 DEBUGEVENTPROC lpEventProc,
395 LPVOID lpData
396 );
397
398INT WIN32API VDMEnumProcessWOW(
399 PROCESSENUMPROC fp,
400 LPARAM lparam
401 );
402
403INT WIN32API VDMEnumTaskWOW(
404 DWORD dwProcessId,
405 TASKENUMPROC fp,
406 LPARAM lparam
407 );
408
409INT WIN32API VDMEnumTaskWOWEx(
410 DWORD dwProcessId,
411 TASKENUMPROCEX fp,
412 LPARAM lparam
413 );
414
415BOOL WIN32API VDMTerminateTaskWOW(
416 DWORD dwProcessId,
417 WORD htask
418 );
419
420BOOL WIN32API VDMStartTaskInWOW(
421 DWORD dwProcessId,
422 LPSTR lpCommandLine,
423 WORD wShow
424 );
425
426BOOL WIN32API VDMKillWOW(VOID);
427
428BOOL WIN32API VDMDetectWOW(VOID);
429
430BOOL WIN32API VDMBreakThread(
431 HANDLE hProcess,
432 HANDLE hThread
433 );
434
435DWORD WIN32API VDMGetDbgFlags(
436 HANDLE hProcess
437 );
438
439BOOL WIN32API VDMSetDbgFlags(
440 HANDLE hProcess,
441 DWORD dwFlags
442 );
443
444//
445// VDMIsModuleLoaded can be used to determine if the 16-bit
446// executable referenced by the full path name parameter is
447// loaded in ntvdm.
448//
449// Note that this function uses an internal table in vdmdbg.dll
450// to determine a module's existence. One important usage of this
451// function is to print a message when a particular module is
452// loaded for the first time. To accomplish this, call this
453// routine during a DBG_SEGLOAD notification BEFORE the entry
454// point VDMProcessException has been called. If it returns FALSE,
455// then the module has not yet been loaded.
456//
457BOOL WIN32API VDMIsModuleLoaded(
458 LPSTR szPath
459 );
460
461BOOL WIN32API VDMGetSegmentInfo(
462 WORD Selector,
463 ULONG Offset,
464 BOOL bProtectMode,
465 VDM_SEGINFO *pSegInfo
466 );
467
468//
469// VDMGetSymbol
470//
471// This routine reads the standard .SYM file format.
472//
473// szModule - module name (max 9 chars)
474// SegNumber - logical segment number of segment (see VDM_SEGINFO)
475// Offset - offset in segment
476// bProtectMode - TRUE for PM, FALSE for V86 mode
477// bNextSymbol - FALSE to find nearest sym BEFORE offset, TRUE for AFTER
478// szSymbolName - receives symbol name (must point to 256 byte buffer)
479// pDisplacement - distance in bytes from nearest symbol
480//
481
482BOOL WIN32API VDMGetSymbol(
483 LPSTR szModule,
484 WORD SegNumber,
485 DWORD Offset,
486 BOOL bProtectMode,
487 BOOL bNextSymbol,
488 LPSTR szSymbolName,
489 PDWORD pDisplacement
490 );
491
492BOOL WIN32API VDMGetAddrExpression(
493 LPSTR szModule,
494 LPSTR szSymbol,
495 LPWORD Selector,
496 PDWORD Offset,
497 LPWORD Type
498 );
499
500
501#ifdef __cplusplus
502}
503#endif
504
505#endif
Note: See TracBrowser for help on using the repository browser.