summaryrefslogtreecommitdiffstats
path: root/public/sdk/inc/vdmdbg.h
diff options
context:
space:
mode:
Diffstat (limited to 'public/sdk/inc/vdmdbg.h')
-rw-r--r--public/sdk/inc/vdmdbg.h529
1 files changed, 529 insertions, 0 deletions
diff --git a/public/sdk/inc/vdmdbg.h b/public/sdk/inc/vdmdbg.h
new file mode 100644
index 000000000..0999b6fc8
--- /dev/null
+++ b/public/sdk/inc/vdmdbg.h
@@ -0,0 +1,529 @@
+/*++ BUILD Version: 0001 // Increment this if a change has global effects
+
+Copyright (c) 1985-1996, Microsoft Corporation
+
+Module Name:
+
+ vdmdbg.h
+
+Abstract:
+
+ Prodecure declarations, constant definitions, type definition and macros
+ for the VDMDBG.DLL VDM Debugger interface.
+
+--*/
+
+#ifndef _VDMDBG_
+#define _VDMDBG_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <pshpack4.h>
+
+#define STATUS_VDM_EVENT STATUS_SEGMENT_NOTIFICATION
+
+#ifndef DBG_SEGLOAD
+#define DBG_SEGLOAD 0
+#define DBG_SEGMOVE 1
+#define DBG_SEGFREE 2
+#define DBG_MODLOAD 3
+#define DBG_MODFREE 4
+#define DBG_SINGLESTEP 5
+#define DBG_BREAK 6
+#define DBG_GPFAULT 7
+#define DBG_DIVOVERFLOW 8
+#define DBG_INSTRFAULT 9
+#define DBG_TASKSTART 10
+#define DBG_TASKSTOP 11
+#define DBG_DLLSTART 12
+#define DBG_DLLSTOP 13
+#define DBG_ATTACH 14
+#endif
+
+//
+// The following flags control the contents of the CONTEXT structure.
+//
+
+#define VDMCONTEXT_i386 0x00010000 // this assumes that i386 and
+#define VDMCONTEXT_i486 0x00010000 // i486 have identical context records
+
+#define VDMCONTEXT_CONTROL (VDMCONTEXT_i386 | 0x00000001L) // SS:SP, CS:IP, FLAGS, BP
+#define VDMCONTEXT_INTEGER (VDMCONTEXT_i386 | 0x00000002L) // AX, BX, CX, DX, SI, DI
+#define VDMCONTEXT_SEGMENTS (VDMCONTEXT_i386 | 0x00000004L) // DS, ES, FS, GS
+#define VDMCONTEXT_FLOATING_POINT (VDMCONTEXT_i386 | 0x00000008L) // 387 state
+#define VDMCONTEXT_DEBUG_REGISTERS (VDMCONTEXT_i386 | 0x00000010L) // DB 0-3,6,7
+
+#define VDMCONTEXT_FULL (VDMCONTEXT_CONTROL | VDMCONTEXT_INTEGER |\
+ VDMCONTEXT_SEGMENTS)
+
+
+#ifdef _X86_
+
+// On x86 machines, just copy the definition of the CONTEXT and LDT_ENTRY
+// structures.
+typedef struct _CONTEXT VDMCONTEXT;
+typedef struct _LDT_ENTRY VDMLDT_ENTRY;
+
+#else // _X86_
+
+//
+// Define the size of the 80387 save area, which is in the context frame.
+//
+
+#define SIZE_OF_80387_REGISTERS 80
+
+typedef struct _FLOATING_SAVE_AREA {
+ ULONG ControlWord;
+ ULONG StatusWord;
+ ULONG TagWord;
+ ULONG ErrorOffset;
+ ULONG ErrorSelector;
+ ULONG DataOffset;
+ ULONG DataSelector;
+ UCHAR RegisterArea[SIZE_OF_80387_REGISTERS];
+ ULONG Cr0NpxState;
+} FLOATING_SAVE_AREA;
+
+//
+// Simulated context structure for the 16-bit environment
+//
+
+typedef struct _VDMCONTEXT {
+
+ //
+ // The flags values within this flag control the contents of
+ // a CONTEXT record.
+ //
+ // If the context record is used as an input parameter, then
+ // for each portion of the context record controlled by a flag
+ // whose value is set, it is assumed that that portion of the
+ // context record contains valid context. If the context record
+ // is being used to modify a threads context, then only that
+ // portion of the threads context will be modified.
+ //
+ // If the context record is used as an IN OUT parameter to capture
+ // the context of a thread, then only those portions of the thread's
+ // context corresponding to set flags will be returned.
+ //
+ // The context record is never used as an OUT only parameter.
+ //
+ // CONTEXT_FULL on some systems (MIPS namely) does not contain the
+ // CONTEXT_SEGMENTS definition. VDMDBG assumes that CONTEXT_INTEGER also
+ // includes CONTEXT_SEGMENTS to account for this.
+ //
+
+ ULONG ContextFlags;
+
+ //
+ // This section is specified/returned if CONTEXT_DEBUG_REGISTERS is
+ // set in ContextFlags. Note that CONTEXT_DEBUG_REGISTERS is NOT
+ // included in CONTEXT_FULL.
+ //
+
+ ULONG Dr0;
+ ULONG Dr1;
+ ULONG Dr2;
+ ULONG Dr3;
+ ULONG Dr6;
+ ULONG Dr7;
+
+ //
+ // This section is specified/returned if the
+ // ContextFlags word contians the flag CONTEXT_FLOATING_POINT.
+ //
+
+ FLOATING_SAVE_AREA FloatSave;
+
+ //
+ // This section is specified/returned if the
+ // ContextFlags word contians the flag CONTEXT_SEGMENTS.
+ //
+
+ ULONG SegGs;
+ ULONG SegFs;
+ ULONG SegEs;
+ ULONG SegDs;
+
+ //
+ // This section is specified/returned if the
+ // ContextFlags word contians the flag CONTEXT_INTEGER.
+ //
+
+ ULONG Edi;
+ ULONG Esi;
+ ULONG Ebx;
+ ULONG Edx;
+ ULONG Ecx;
+ ULONG Eax;
+
+ //
+ // This section is specified/returned if the
+ // ContextFlags word contians the flag CONTEXT_CONTROL.
+ //
+
+ ULONG Ebp;
+ ULONG Eip;
+ ULONG SegCs; // MUST BE SANITIZED
+ ULONG EFlags; // MUST BE SANITIZED
+ ULONG Esp;
+ ULONG SegSs;
+
+} VDMCONTEXT;
+
+//
+// LDT descriptor entry
+//
+
+typedef struct _VDMLDT_ENTRY {
+ USHORT LimitLow;
+ USHORT BaseLow;
+ union {
+ struct {
+ UCHAR BaseMid;
+ UCHAR Flags1; // Declare as bytes to avoid alignment
+ UCHAR Flags2; // Problems.
+ UCHAR BaseHi;
+ } Bytes;
+ struct {
+ ULONG BaseMid : 8;
+ ULONG Type : 5;
+ ULONG Dpl : 2;
+ ULONG Pres : 1;
+ ULONG LimitHi : 4;
+ ULONG Sys : 1;
+ ULONG Reserved_0 : 1;
+ ULONG Default_Big : 1;
+ ULONG Granularity : 1;
+ ULONG BaseHi : 8;
+ } Bits;
+ } HighWord;
+} VDMLDT_ENTRY;
+
+
+#endif // _X86_
+
+typedef VDMCONTEXT *LPVDMCONTEXT;
+typedef VDMLDT_ENTRY *LPVDMLDT_ENTRY;
+
+#define VDMCONTEXT_TO_PROGRAM_COUNTER(Context) (PVOID)((Context)->Eip)
+
+#define VDMCONTEXT_LENGTH (sizeof(VDMCONTEXT))
+#define VDMCONTEXT_ALIGN (sizeof(ULONG))
+#define VDMCONTEXT_ROUND (VDMCONTEXT_ALIGN - 1)
+
+#define V86FLAGS_CARRY 0x00001
+#define V86FLAGS_PARITY 0x00004
+#define V86FLAGS_AUXCARRY 0x00010
+#define V86FLAGS_ZERO 0x00040
+#define V86FLAGS_SIGN 0x00080
+#define V86FLAGS_TRACE 0x00100
+#define V86FLAGS_INTERRUPT 0x00200
+#define V86FLAGS_DIRECTION 0x00400
+#define V86FLAGS_OVERFLOW 0x00800
+#define V86FLAGS_IOPL 0x03000
+#define V86FLAGS_IOPL_BITS 0x12
+#define V86FLAGS_RESUME 0x10000
+#define V86FLAGS_V86 0x20000 // Used to detect RealMode v. ProtMode
+#define V86FLAGS_ALIGNMENT 0x40000
+
+#define MAX_MODULE_NAME 8 + 1
+#define MAX_PATH16 255
+
+typedef struct _SEGMENT_NOTE {
+ WORD Selector1; // Selector of operation
+ WORD Selector2; // Dest. Sel. for moving segments
+ WORD Segment; // Segment within Module
+ CHAR Module[MAX_MODULE_NAME+1]; // Module name
+ CHAR FileName[MAX_PATH16+1]; // PathName to executable image
+ WORD Type; // Code / Data, etc.
+ DWORD Length; // Length of image
+} SEGMENT_NOTE;
+
+typedef struct _IMAGE_NOTE {
+ CHAR Module[MAX_MODULE_NAME+1]; // Module
+ CHAR FileName[MAX_PATH16+1]; // Path to executable image
+ WORD hModule; // 16-bit hModule
+ WORD hTask; // 16-bit hTask
+} IMAGE_NOTE;
+
+typedef struct {
+ DWORD dwSize;
+ char szModule[MAX_MODULE_NAME+1];
+ HANDLE hModule;
+ WORD wcUsage;
+ char szExePath[MAX_PATH16+1];
+ WORD wNext;
+} MODULEENTRY, *LPMODULEENTRY;
+
+/* GlobalFirst()/GlobalNext() flags */
+#define GLOBAL_ALL 0
+#define GLOBAL_LRU 1
+#define GLOBAL_FREE 2
+
+/* GLOBALENTRY.wType entries */
+#define GT_UNKNOWN 0
+#define GT_DGROUP 1
+#define GT_DATA 2
+#define GT_CODE 3
+#define GT_TASK 4
+#define GT_RESOURCE 5
+#define GT_MODULE 6
+#define GT_FREE 7
+#define GT_INTERNAL 8
+#define GT_SENTINEL 9
+#define GT_BURGERMASTER 10
+
+/* If GLOBALENTRY.wType==GT_RESOURCE, the following is GLOBALENTRY.wData: */
+#define GD_USERDEFINED 0
+#define GD_CURSORCOMPONENT 1
+#define GD_BITMAP 2
+#define GD_ICONCOMPONENT 3
+#define GD_MENU 4
+#define GD_DIALOG 5
+#define GD_STRING 6
+#define GD_FONTDIR 7
+#define GD_FONT 8
+#define GD_ACCELERATORS 9
+#define GD_RCDATA 10
+#define GD_ERRTABLE 11
+#define GD_CURSOR 12
+#define GD_ICON 14
+#define GD_NAMETABLE 15
+#define GD_MAX_RESOURCE 15
+
+typedef struct {
+ DWORD dwSize;
+ DWORD dwAddress;
+ DWORD dwBlockSize;
+ HANDLE hBlock;
+ WORD wcLock;
+ WORD wcPageLock;
+ WORD wFlags;
+ BOOL wHeapPresent;
+ HANDLE hOwner;
+ WORD wType;
+ WORD wData;
+ DWORD dwNext;
+ DWORD dwNextAlt;
+} GLOBALENTRY, *LPGLOBALENTRY;
+
+typedef DWORD (CALLBACK* DEBUGEVENTPROC)( LPDEBUG_EVENT, LPVOID );
+
+// Macros to access VDM_EVENT parameters
+#define W1(x) ((USHORT)(x.ExceptionInformation[0]))
+#define W2(x) ((USHORT)(x.ExceptionInformation[0] >> 16))
+#define W3(x) ((USHORT)(x.ExceptionInformation[1]))
+#define W4(x) ((USHORT)(x.ExceptionInformation[1] >> 16))
+#define DW3(x) (x.ExceptionInformation[2])
+#define DW4(x) (x.ExceptionInformation[3])
+
+#include <poppack.h>
+
+BOOL
+WINAPI
+VDMProcessException(
+ LPDEBUG_EVENT lpDebugEvent
+ );
+
+BOOL
+WINAPI
+VDMGetThreadSelectorEntry(
+ HANDLE hProcess,
+ HANDLE hThread,
+ WORD wSelector,
+ LPVDMLDT_ENTRY lpSelectorEntry
+ );
+
+ULONG
+WINAPI
+VDMGetPointer(
+ HANDLE hProcess,
+ HANDLE hThread,
+ WORD wSelector,
+ DWORD dwOffset,
+ BOOL fProtMode
+ );
+
+BOOL
+WINAPI
+VDMGetThreadContext(
+ LPDEBUG_EVENT lpDebugEvent,
+ LPVDMCONTEXT lpVDMContext
+);
+
+BOOL
+WINAPI
+VDMSetThreadContext(
+ LPDEBUG_EVENT lpDebugEvent,
+ LPVDMCONTEXT lpVDMContext
+);
+
+BOOL
+WINAPI
+VDMGetSelectorModule(
+ HANDLE hProcess,
+ HANDLE hThread,
+ WORD wSelector,
+ PUINT lpSegmentNumber,
+ LPSTR lpModuleName,
+ UINT nNameSize,
+ LPSTR lpModulePath,
+ UINT nPathSize
+);
+
+BOOL
+WINAPI
+VDMGetModuleSelector(
+ HANDLE hProcess,
+ HANDLE hThread,
+ UINT wSegmentNumber,
+ LPSTR lpModuleName,
+ LPWORD lpSelector
+);
+
+BOOL
+WINAPI
+VDMModuleFirst(
+ HANDLE hProcess,
+ HANDLE hThread,
+ LPMODULEENTRY lpModuleEntry,
+ DEBUGEVENTPROC lpEventProc,
+ LPVOID lpData
+);
+
+BOOL
+WINAPI
+VDMModuleNext(
+ HANDLE hProcess,
+ HANDLE hThread,
+ LPMODULEENTRY lpModuleEntry,
+ DEBUGEVENTPROC lpEventProc,
+ LPVOID lpData
+);
+
+BOOL
+WINAPI
+VDMGlobalFirst(
+ HANDLE hProcess,
+ HANDLE hThread,
+ LPGLOBALENTRY lpGlobalEntry,
+ WORD wFlags,
+ DEBUGEVENTPROC lpEventProc,
+ LPVOID lpData
+);
+
+BOOL
+WINAPI
+VDMGlobalNext(
+ HANDLE hProcess,
+ HANDLE hThread,
+ LPGLOBALENTRY lpGlobalEntry,
+ WORD wFlags,
+ DEBUGEVENTPROC lpEventProc,
+ LPVOID lpData
+);
+
+typedef BOOL (WINAPI *PROCESSENUMPROC)( DWORD dwProcessId, DWORD dwAttributes, LPARAM lpUserDefined );
+typedef BOOL (WINAPI *TASKENUMPROC)( DWORD dwThreadId, WORD hMod16, WORD hTask16, LPARAM lpUserDefined );
+typedef BOOL (WINAPI *TASKENUMPROCEX)( DWORD dwThreadId, WORD hMod16, WORD hTask16,
+ PSZ pszModName, PSZ pszFileName, LPARAM lpUserDefined );
+
+#define WOW_SYSTEM (DWORD)0x0001
+
+INT
+WINAPI
+VDMEnumProcessWOW(
+ PROCESSENUMPROC fp,
+ LPARAM lparam
+);
+
+INT
+WINAPI
+VDMEnumTaskWOW(
+ DWORD dwProcessId,
+ TASKENUMPROC fp,
+ LPARAM lparam
+);
+
+//
+// VDMEnumTaskWOWEx is the same as VDMEnumTaskWOW except
+// the callback procedure gets two more parameters,
+// the module name of the EXE and the full path to the
+// EXE.
+//
+
+INT
+WINAPI
+VDMEnumTaskWOWEx(
+ DWORD dwProcessId,
+ TASKENUMPROCEX fp,
+ LPARAM lparam
+);
+
+//
+// VDMTerminateTaskWOW rudely terminates a 16-bit WOW task
+// similar to the way TerminateProcess kills a Win32
+// process.
+//
+
+BOOL
+WINAPI
+VDMTerminateTaskWOW(
+ DWORD dwProcessId,
+ WORD htask
+);
+
+//
+// VDMStartTaskInWOW launches a Win16 task in a pre-existing
+// WOW VDM. Note that the caller is responsible for ensuring
+// the program is a 16-bit Windows program. If it is a DOS
+// or Win32 program, it will still be launched from within
+// the target WOW VDM.
+//
+// The supplied command line and show command are passed
+// unchanged to the 16-bit WinExec API in the target WOW VDM.
+//
+// Note this routine is ANSI-only.
+//
+
+BOOL
+VDMStartTaskInWOW(
+ DWORD dwProcessId,
+ LPSTR lpCommandLine,
+ WORD wShow
+);
+
+//
+// VDMKillWOW is not implemented.
+//
+
+BOOL
+WINAPI
+VDMKillWOW(
+ VOID
+);
+
+//
+// VDMDetectWOW is not implemented.
+//
+
+BOOL
+WINAPI
+VDMDetectWOW(
+ VOID
+);
+
+BOOL
+WINAPI
+VDMBreakThread(
+ HANDLE hProcess,
+ HANDLE hThread
+);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // _VDMDBG_