[KD64]
[reactos.git] / reactos / include / reactos / windbgkd.h
index 9ecb450..97a6a76 100644 (file)
-#ifndef _WINDBGKD_\r
-#define _WINDBGKG_\r
-\r
-//\r
-// Dependencies\r
-//\r
-#include "wdbgexts.h"\r
-\r
-//\r
-// Packet Size and Control Stream Size\r
-//\r
-#define PACKET_MAX_SIZE                     4000\r
-#define DBGKD_MAXSTREAM                     16\r
-\r
-//\r
-// Magic Packet IDs\r
-//\r
-#define INITIAL_PACKET_ID                   0x80800000\r
-#define SYNC_PACKET_ID                      0x00000800\r
-\r
-//\r
-// Magic Packet bytes\r
-//\r
-#define BREAKIN_PACKET                      0x62626262\r
-#define BREAKIN_PACKET_BYTE                 0x62\r
-#define PACKET_LEADER                       0x30303030\r
-#define PACKET_LEADER_BYTE                  0x30\r
-#define CONTROL_PACKET_LEADER               0x69696969\r
-#define CONTROL_PACKET_LEADER_BYTE          0x69\r
-#define PACKET_TRAILING_BYTE                0xAA\r
-\r
-//\r
-// Packet Types\r
-//\r
-#define PACKET_TYPE_UNUSED                  0\r
-#define PACKET_TYPE_KD_STATE_CHANGE32       1\r
-#define PACKET_TYPE_KD_STATE_MANIPULATE     2\r
-#define PACKET_TYPE_KD_DEBUG_IO             3\r
-#define PACKET_TYPE_KD_ACKNOWLEDGE          4\r
-#define PACKET_TYPE_KD_RESEND               5\r
-#define PACKET_TYPE_KD_RESET                6\r
-#define PACKET_TYPE_KD_STATE_CHANGE64       7\r
-#define PACKET_TYPE_KD_POLL_BREAKIN         8\r
-#define PACKET_TYPE_KD_TRACE_IO             9\r
-#define PACKET_TYPE_KD_CONTROL_REQUEST      10\r
-#define PACKET_TYPE_KD_FILE_IO              11\r
-#define PACKET_TYPE_MAX                     12\r
-\r
-//\r
-// Wait State Change Types\r
-//\r
-#define DbgKdMinimumStateChange             0x00003030\r
-#define DbgKdExceptionStateChange           0x00003030\r
-#define DbgKdLoadSymbolsStateChange         0x00003031\r
-#define DbgKdCommandStringStateChange       0x00003032\r
-#define DbgKdMaximumStateChange             0x00003033\r
-\r
-//\r
-// Manipulate Types\r
-//\r
-#define DbgKdMinimumManipulate              0x00003130\r
-#define DbgKdReadVirtualMemoryApi           0x00003130\r
-#define DbgKdWriteVirtualMemoryApi          0x00003131\r
-#define DbgKdGetContextApi                  0x00003132\r
-#define DbgKdSetContextApi                  0x00003133\r
-#define DbgKdWriteBreakPointApi             0x00003134\r
-#define DbgKdRestoreBreakPointApi           0x00003135\r
-#define DbgKdContinueApi                    0x00003136\r
-#define DbgKdReadControlSpaceApi            0x00003137\r
-#define DbgKdWriteControlSpaceApi           0x00003138\r
-#define DbgKdReadIoSpaceApi                 0x00003139\r
-#define DbgKdWriteIoSpaceApi                0x0000313A\r
-#define DbgKdRebootApi                      0x0000313B\r
-#define DbgKdContinueApi2                   0x0000313C\r
-#define DbgKdReadPhysicalMemoryApi          0x0000313D\r
-#define DbgKdWritePhysicalMemoryApi         0x0000313E\r
-#define DbgKdQuerySpecialCallsApi           0x0000313F\r
-#define DbgKdSetSpecialCallApi              0x00003140\r
-#define DbgKdClearSpecialCallsApi           0x00003141\r
-#define DbgKdSetInternalBreakPointApi       0x00003142\r
-#define DbgKdGetInternalBreakPointApi       0x00003143\r
-#define DbgKdReadIoSpaceExtendedApi         0x00003144\r
-#define DbgKdWriteIoSpaceExtendedApi        0x00003145\r
-#define DbgKdGetVersionApi                  0x00003146\r
-#define DbgKdWriteBreakPointExApi           0x00003147\r
-#define DbgKdRestoreBreakPointExApi         0x00003148\r
-#define DbgKdCauseBugCheckApi               0x00003149\r
-#define DbgKdSwitchProcessor                0x00003150\r
-#define DbgKdPageInApi                      0x00003151\r
-#define DbgKdReadMachineSpecificRegister    0x00003152\r
-#define DbgKdWriteMachineSpecificRegister   0x00003153\r
-#define OldVlm1                             0x00003154\r
-#define OldVlm2                             0x00003155\r
-#define DbgKdSearchMemoryApi                0x00003156\r
-#define DbgKdGetBusDataApi                  0x00003157\r
-#define DbgKdSetBusDataApi                  0x00003158\r
-#define DbgKdCheckLowMemoryApi              0x00003159\r
-#define DbgKdClearAllInternalBreakpointsApi 0x0000315A\r
-#define DbgKdFillMemoryApi                  0x0000315B\r
-#define DbgKdQueryMemoryApi                 0x0000315C\r
-#define DbgKdSwitchPartition                0x0000315D\r
-#define DbgKdMaximumManipulate              0x0000315E\r
-\r
-//\r
-// Debug I/O Types\r
-//\r
-#define DbgKdPrintStringApi                 0x00003230\r
-#define DbgKdGetStringApi                   0x00003231\r
-\r
-//\r
-// Control Report Flags\r
-//\r
-#define REPORT_INCLUDES_SEGS                0x0001\r
-#define REPORT_INCLUDES_CS                  0x0002\r
-\r
-//\r
-// Protocol Versions\r
-//\r
-#define DBGKD_64BIT_PROTOCOL_VERSION1       5\r
-#define DBGKD_64BIT_PROTOCOL_VERSION2       6\r
-\r
-//\r
-// KD Packet Structure\r
-//\r
-typedef struct _KD_PACKET\r
-{\r
-    ULONG PacketLeader;\r
-    USHORT PacketType;\r
-    USHORT ByteCount;\r
-    ULONG PacketId;\r
-    ULONG Checksum;\r
-} KD_PACKET, *PKD_PACKET;\r
-\r
-//\r
-// KD Context\r
-//\r
-typedef struct _KD_CONTEXT\r
-{\r
-    ULONG KdpDefaultRetries;\r
-    BOOLEAN KdpControlCPending;\r
-} KD_CONTEXT, *PKD_CONTEXT;\r
-\r
-//\r
-// Control Sets for Supported Architectures\r
-//\r
-#include <pshpack4.h>\r
-typedef struct _X86_DBGKD_CONTROL_SET\r
-{\r
-    ULONG TraceFlag;\r
-    ULONG Dr7;\r
-    ULONG CurrentSymbolStart;\r
-    ULONG CurrentSymbolEnd;\r
-} X86_DBGKD_CONTROL_SET, *PX86_DBGKD_CONTROL_SET;\r
-\r
-typedef struct _IA64_DBGKD_CONTROL_SET\r
-{\r
-    ULONG Continue;\r
-    ULONG64 CurrentSymbolStart;\r
-    ULONG64 CurrentSymbolEnd;\r
-} IA64_DBGKD_CONTROL_SET, *PIA64_DBGKD_CONTROL_SET;\r
-\r
-typedef struct _AMD64_DBGKD_CONTROL_SET\r
-{\r
-    ULONG TraceFlag;\r
-    ULONG64 Dr7;\r
-    ULONG64 CurrentSymbolStart;\r
-    ULONG64 CurrentSymbolEnd;\r
-} AMD64_DBGKD_CONTROL_SET, *PAMD64_DBGKD_CONTROL_SET;\r
-\r
-typedef struct _DBGKD_ANY_CONTROL_SET\r
-{\r
-    union\r
-    {\r
-        X86_DBGKD_CONTROL_SET X86ControlSet;\r
-        IA64_DBGKD_CONTROL_SET IA64ControlSet;\r
-        AMD64_DBGKD_CONTROL_SET Amd64ControlSet;\r
-    };\r
-} DBGKD_ANY_CONTROL_SET, *PDBGKD_ANY_CONTROL_SET;\r
-#include <poppack.h>\r
-\r
-typedef X86_DBGKD_CONTROL_SET DBGKD_CONTROL_SET;\r
-\r
-//\r
-// DBGKM Structure for Exceptions\r
-//\r
-typedef struct _DBGKM_EXCEPTION64\r
-{\r
-    EXCEPTION_RECORD64 ExceptionRecord;\r
-    ULONG FirstChance;\r
-} DBGKM_EXCEPTION64, *PDBGKM_EXCEPTION64;\r
-\r
-//\r
-// DBGKD Structure for State Change\r
-//\r
-typedef struct _DBGKD_CONTROL_REPORT\r
-{\r
-    ULONG Dr6;\r
-    ULONG Dr7;\r
-    USHORT InstructionCount;\r
-    USHORT ReportFlags;\r
-    UCHAR InstructionStream[DBGKD_MAXSTREAM];\r
-    USHORT SegCs;\r
-    USHORT SegDs;\r
-    USHORT SegEs;\r
-    USHORT SegFs;\r
-    ULONG EFlags;\r
-} DBGKD_CONTROL_REPORT, *PDBGKD_CONTROL_REPORT;\r
-\r
-//\r
-// DBGKD Structure for Debug I/O Type Print String\r
-//\r
-typedef struct _DBGKD_PRINT_STRING\r
-{\r
-    ULONG LengthOfString;\r
-} DBGKD_PRINT_STRING, *PDBGKD_PRINT_STRING;\r
-\r
-//\r
-// DBGKD Structure for Debug I/O Type Get String\r
-//\r
-typedef struct _DBGKD_GET_STRING\r
-{\r
-    ULONG LengthOfPromptString;\r
-    ULONG LengthOfStringRead;\r
-} DBGKD_GET_STRING, *PDBGKD_GET_STRING;\r
-\r
-//\r
-// DBGKD Structure for Debug I/O\r
-//\r
-typedef struct _DBGKD_DEBUG_IO\r
-{\r
-    ULONG ApiNumber;\r
-    USHORT ProcessorLevel;\r
-    USHORT Processor;\r
-    union\r
-    {\r
-        DBGKD_PRINT_STRING PrintString;\r
-        DBGKD_GET_STRING GetString;\r
-    } u;\r
-} DBGKD_DEBUG_IO, *PDBGKD_DEBUG_IO;\r
-\r
-//\r
-// DBGKD Structure for Load Symbols\r
-//\r
-typedef struct _DBGKD_LOAD_SYMBOLS64\r
-{\r
-    ULONG PathNameLength;\r
-    ULONG64 BaseOfDll;\r
-    ULONG64 ProcessId;\r
-    ULONG CheckSum;\r
-    ULONG SizeOfImage;\r
-    BOOLEAN UnloadSymbols;\r
-} DBGKD_LOAD_SYMBOLS64, *PDBGKD_LOAD_SYMBOLS64;\r
-\r
-//\r
-// DBGKD Structure for Wait State Change\r
-//\r
-typedef struct _DBGKD_WAIT_STATE_CHANGE64\r
-{\r
-    ULONG NewState;\r
-    USHORT ProcessorLevel;\r
-    USHORT Processor;\r
-    ULONG NumberProcessors;\r
-    ULONG64 Thread;\r
-    ULONG64 ProgramCounter;\r
-    union\r
-    {\r
-        DBGKM_EXCEPTION64 Exception;\r
-        DBGKD_LOAD_SYMBOLS64 LoadSymbols;\r
-    } u;\r
-    DBGKD_CONTROL_REPORT ControlReport;\r
-    CONTEXT Context;\r
-} DBGKD_WAIT_STATE_CHANGE64, *PDBGKD_WAIT_STATE_CHANGE64;\r
-\r
-//\r
-// DBGKD Manipulate Structures\r
-//\r
-typedef struct _DBGKD_READ_MEMORY64\r
-{\r
-    ULONG64 TargetBaseAddress;\r
-    ULONG TransferCount;\r
-    ULONG ActualBytesRead;\r
-} DBGKD_READ_MEMORY64, *PDBGKD_READ_MEMORY64;\r
-\r
-typedef struct _DBGKD_WRITE_MEMORY64\r
-{\r
-    ULONG64 TargetBaseAddress;\r
-    ULONG TransferCount;\r
-    ULONG ActualBytesWritten;\r
-} DBGKD_WRITE_MEMORY64, *PDBGKD_WRITE_MEMORY64;\r
-\r
-typedef struct _DBGKD_GET_CONTEXT\r
-{\r
-    ULONG Unused;\r
-} DBGKD_GET_CONTEXT, *PDBGKD_GET_CONTEXT;\r
-\r
-typedef struct _DBGKD_SET_CONTEXT\r
-{\r
-    ULONG ContextFlags;\r
-} DBGKD_SET_CONTEXT, *PDBGKD_SET_CONTEXT;\r
-\r
-typedef struct _DBGKD_WRITE_BREAKPOINT64\r
-{\r
-    ULONG64 BreakPointAddress;\r
-    ULONG BreakPointHandle;\r
-} DBGKD_WRITE_BREAKPOINT64, *PDBGKD_WRITE_BREAKPOINT64;\r
-\r
-typedef struct _DBGKD_RESTORE_BREAKPOINT\r
-{\r
-    ULONG BreakPointHandle;\r
-} DBGKD_RESTORE_BREAKPOINT, *PDBGKD_RESTORE_BREAKPOINT;\r
-\r
-typedef struct _DBGKD_CONTINUE\r
-{\r
-    NTSTATUS ContinueStatus;\r
-} DBGKD_CONTINUE, *PDBGKD_CONTINUE;\r
-\r
-#include <pshpack4.h>\r
-typedef struct _DBGKD_CONTINUE2\r
-{\r
-    NTSTATUS ContinueStatus;\r
-    union\r
-    {\r
-        DBGKD_CONTROL_SET ControlSet;\r
-        DBGKD_ANY_CONTROL_SET AnyControlSet;\r
-    };\r
-} DBGKD_CONTINUE2, *PDBGKD_CONTINUE2;\r
-#include <poppack.h>\r
-\r
-typedef struct _DBGKD_READ_WRITE_IO64\r
-{\r
-    ULONG64 IoAddress;\r
-    ULONG DataSize;\r
-    ULONG DataValue;\r
-} DBGKD_READ_WRITE_IO64, *PDBGKD_READ_WRITE_IO64;\r
-\r
-typedef struct _DBGKD_READ_WRITE_IO_EXTENDED64\r
-{\r
-    ULONG DataSize;\r
-    ULONG InterfaceType;\r
-    ULONG BusNumber;\r
-    ULONG AddressSpace;\r
-    ULONG64 IoAddress;\r
-    ULONG DataValue;\r
-} DBGKD_READ_WRITE_IO_EXTENDED64, *PDBGKD_READ_WRITE_IO_EXTENDED64;\r
-\r
-typedef struct _DBGKD_READ_WRITE_MSR\r
-{\r
-    ULONG Msr;\r
-    ULONG DataValueLow;\r
-    ULONG DataValueHigh;\r
-} DBGKD_READ_WRITE_MSR, *PDBGKD_READ_WRITE_MSR;\r
-\r
-typedef struct _DBGKD_QUERY_SPECIAL_CALLS\r
-{\r
-    ULONG NumberOfSpecialCalls;\r
-} DBGKD_QUERY_SPECIAL_CALLS, *PDBGKD_QUERY_SPECIAL_CALLS;\r
-\r
-typedef struct _DBGKD_SET_SPECIAL_CALL64\r
-{\r
-    ULONG64 SpecialCall;\r
-} DBGKD_SET_SPECIAL_CALL64, *PDBGKD_SET_SPECIAL_CALL64;\r
-\r
-typedef struct _DBGKD_SET_INTERNAL_BREAKPOINT64\r
-{\r
-    ULONG64 BreakpointAddress;\r
-    ULONG Flags;\r
-} DBGKD_SET_INTERNAL_BREAKPOINT64, *PDBGKD_SET_INTERNAL_BREAKPOINT64;\r
-\r
-typedef struct _DBGKD_GET_INTERNAL_BREAKPOINT64\r
-{\r
-    ULONG64 BreakpointAddress;\r
-    ULONG Flags;\r
-    ULONG Calls;\r
-    ULONG MaxCallsPerPeriod;\r
-    ULONG MinInstructions;\r
-    ULONG MaxInstructions;\r
-    ULONG TotalInstructions;\r
-} DBGKD_GET_INTERNAL_BREAKPOINT64, *PDBGKD_GET_INTERNAL_BREAKPOINT64;\r
-\r
-typedef struct _DBGKD_BREAKPOINTEX\r
-{\r
-    ULONG BreakPointCount;\r
-    NTSTATUS ContinueStatus;\r
-} DBGKD_BREAKPOINTEX, *PDBGKD_BREAKPOINTEX;\r
-\r
-typedef struct _DBGKD_SEARCH_MEMORY\r
-{\r
-    union\r
-    {\r
-        ULONG64 SearchAddress;\r
-        ULONG64 FoundAddress;\r
-    };\r
-    ULONG64 SearchLength;\r
-    ULONG PatternLength;\r
-} DBGKD_SEARCH_MEMORY, *PDBGKD_SEARCH_MEMORY;\r
-\r
-typedef struct _DBGKD_GET_SET_BUS_DATA\r
-{\r
-    ULONG BusDataType;\r
-    ULONG BusNumber;\r
-    ULONG SlotNumber;\r
-    ULONG Offset;\r
-    ULONG Length;\r
-} DBGKD_GET_SET_BUS_DATA, *PDBGKD_GET_SET_BUS_DATA;\r
-\r
-typedef struct _DBGKD_FILL_MEMORY\r
-{\r
-    ULONG64 Address;\r
-    ULONG Length;\r
-    USHORT Flags;\r
-    USHORT PatternLength;\r
-} DBGKD_FILL_MEMORY, *PDBGKD_FILL_MEMORY;\r
-\r
-typedef struct _DBGKD_QUERY_MEMORY\r
-{\r
-    ULONG64 Address;\r
-    ULONG64 Reserved;\r
-    ULONG AddressSpace;\r
-    ULONG Flags;\r
-} DBGKD_QUERY_MEMORY, *PDBGKD_QUERY_MEMORY;\r
-\r
-typedef struct _DBGKD_SWITCH_PARTITION\r
-{\r
-    ULONG Partition;\r
-} DBGKD_SWITCH_PARTITION;\r
-\r
-//\r
-// DBGKD Structure for Manipulate\r
-//\r
-typedef struct _DBGKD_MANIPULATE_STATE64\r
-{\r
-    ULONG ApiNumber;\r
-    USHORT ProcessorLevel;\r
-    USHORT Processor;\r
-    NTSTATUS ReturnStatus;\r
-    union\r
-    {\r
-        DBGKD_READ_MEMORY64 ReadMemory;\r
-        DBGKD_WRITE_MEMORY64 WriteMemory;\r
-        DBGKD_GET_CONTEXT GetContext;\r
-        DBGKD_SET_CONTEXT SetContext;\r
-        DBGKD_WRITE_BREAKPOINT64 WriteBreakPoint;\r
-        DBGKD_RESTORE_BREAKPOINT RestoreBreakPoint;\r
-        DBGKD_CONTINUE Continue;\r
-        DBGKD_CONTINUE2 Continue2;\r
-        DBGKD_READ_WRITE_IO64 ReadWriteIo;\r
-        DBGKD_READ_WRITE_IO_EXTENDED64 ReadWriteIoExtended;\r
-        DBGKD_QUERY_SPECIAL_CALLS QuerySpecialCalls;\r
-        DBGKD_SET_SPECIAL_CALL64 SetSpecialCall;\r
-        DBGKD_SET_INTERNAL_BREAKPOINT64 SetInternalBreakpoint;\r
-        DBGKD_GET_INTERNAL_BREAKPOINT64 GetInternalBreakpoint;\r
-        DBGKD_GET_VERSION64 GetVersion64;\r
-        DBGKD_BREAKPOINTEX BreakPointEx;\r
-        DBGKD_READ_WRITE_MSR ReadWriteMsr;\r
-        DBGKD_SEARCH_MEMORY SearchMemory;\r
-        DBGKD_GET_SET_BUS_DATA GetSetBusData;\r
-        DBGKD_FILL_MEMORY FillMemory;\r
-        DBGKD_QUERY_MEMORY QueryMemory;\r
-        DBGKD_SWITCH_PARTITION SwitchPartition;\r
-    } u;\r
-} DBGKD_MANIPULATE_STATE64, *PDBGKD_MANIPULATE_STATE64;\r
-\r
-#endif\r
+#ifndef _WINDBGKD_
+#define _WINDBGKD_
+
+//
+// Dependencies
+//
+#include "wdbgexts.h"
+
+//
+// Conversion Macros
+//
+#define COPYSE(p64, p32, f)                 \
+    p64->f = (ULONG64)(LONG64)(LONG)p32->f
+
+//
+// Packet Size and Control Stream Size
+//
+#define PACKET_MAX_SIZE                     4000
+#define DBGKD_MAXSTREAM                     16
+
+//
+// Magic Packet IDs
+//
+#define INITIAL_PACKET_ID                   0x80800000
+#define SYNC_PACKET_ID                      0x00000800
+
+//
+// Magic Packet bytes
+//
+#define BREAKIN_PACKET                      0x62626262
+#define BREAKIN_PACKET_BYTE                 0x62
+#define PACKET_LEADER                       0x30303030
+#define PACKET_LEADER_BYTE                  0x30
+#define CONTROL_PACKET_LEADER               0x69696969
+#define CONTROL_PACKET_LEADER_BYTE          0x69
+#define PACKET_TRAILING_BYTE                0xAA
+
+//
+// Packet Types
+//
+#define PACKET_TYPE_UNUSED                  0
+#define PACKET_TYPE_KD_STATE_CHANGE32       1
+#define PACKET_TYPE_KD_STATE_MANIPULATE     2
+#define PACKET_TYPE_KD_DEBUG_IO             3
+#define PACKET_TYPE_KD_ACKNOWLEDGE          4
+#define PACKET_TYPE_KD_RESEND               5
+#define PACKET_TYPE_KD_RESET                6
+#define PACKET_TYPE_KD_STATE_CHANGE64       7
+#define PACKET_TYPE_KD_POLL_BREAKIN         8
+#define PACKET_TYPE_KD_TRACE_IO             9
+#define PACKET_TYPE_KD_CONTROL_REQUEST      10
+#define PACKET_TYPE_KD_FILE_IO              11
+#define PACKET_TYPE_MAX                     12
+
+//
+// Wait State Change Types
+//
+#define DbgKdMinimumStateChange             0x00003030
+#define DbgKdExceptionStateChange           0x00003030
+#define DbgKdLoadSymbolsStateChange         0x00003031
+#define DbgKdCommandStringStateChange       0x00003032
+#define DbgKdMaximumStateChange             0x00003033
+
+//
+// This is combined with the basic state change code
+// if the state is from an alternate source
+//
+#define DbgKdAlternateStateChange           0x00010000
+
+//
+// Manipulate Types
+//
+#define DbgKdMinimumManipulate              0x00003130
+#define DbgKdReadVirtualMemoryApi           0x00003130
+#define DbgKdWriteVirtualMemoryApi          0x00003131
+#define DbgKdGetContextApi                  0x00003132
+#define DbgKdSetContextApi                  0x00003133
+#define DbgKdWriteBreakPointApi             0x00003134
+#define DbgKdRestoreBreakPointApi           0x00003135
+#define DbgKdContinueApi                    0x00003136
+#define DbgKdReadControlSpaceApi            0x00003137
+#define DbgKdWriteControlSpaceApi           0x00003138
+#define DbgKdReadIoSpaceApi                 0x00003139
+#define DbgKdWriteIoSpaceApi                0x0000313A
+#define DbgKdRebootApi                      0x0000313B
+#define DbgKdContinueApi2                   0x0000313C
+#define DbgKdReadPhysicalMemoryApi          0x0000313D
+#define DbgKdWritePhysicalMemoryApi         0x0000313E
+#define DbgKdQuerySpecialCallsApi           0x0000313F
+#define DbgKdSetSpecialCallApi              0x00003140
+#define DbgKdClearSpecialCallsApi           0x00003141
+#define DbgKdSetInternalBreakPointApi       0x00003142
+#define DbgKdGetInternalBreakPointApi       0x00003143
+#define DbgKdReadIoSpaceExtendedApi         0x00003144
+#define DbgKdWriteIoSpaceExtendedApi        0x00003145
+#define DbgKdGetVersionApi                  0x00003146
+#define DbgKdWriteBreakPointExApi           0x00003147
+#define DbgKdRestoreBreakPointExApi         0x00003148
+#define DbgKdCauseBugCheckApi               0x00003149
+#define DbgKdSwitchProcessor                0x00003150
+#define DbgKdPageInApi                      0x00003151
+#define DbgKdReadMachineSpecificRegister    0x00003152
+#define DbgKdWriteMachineSpecificRegister   0x00003153
+#define OldVlm1                             0x00003154
+#define OldVlm2                             0x00003155
+#define DbgKdSearchMemoryApi                0x00003156
+#define DbgKdGetBusDataApi                  0x00003157
+#define DbgKdSetBusDataApi                  0x00003158
+#define DbgKdCheckLowMemoryApi              0x00003159
+#define DbgKdClearAllInternalBreakpointsApi 0x0000315A
+#define DbgKdFillMemoryApi                  0x0000315B
+#define DbgKdQueryMemoryApi                 0x0000315C
+#define DbgKdSwitchPartition                0x0000315D
+#define DbgKdMaximumManipulate              0x0000315E
+
+//
+// Debug I/O Types
+//
+#define DbgKdPrintStringApi                 0x00003230
+#define DbgKdGetStringApi                   0x00003231
+
+//
+// Trace I/O Types
+//
+#define DbgKdPrintTraceApi                  0x00003330
+
+//
+// Control Request Types
+//
+#define DbgKdRequestHardwareBp              0x00004300
+#define DbgKdReleaseHardwareBp              0x00004301
+
+//
+// File I/O Types
+//
+#define DbgKdCreateFileApi                 0x00003430
+#define DbgKdReadFileApi                   0x00003431
+#define DbgKdWriteFileApi                  0x00003432
+#define DbgKdCloseFileApi                  0x00003433
+
+//
+// Control Report Flags
+//
+#define REPORT_INCLUDES_SEGS                0x0001
+#define REPORT_STANDARD_CS                  0x0002
+
+//
+// Protocol Versions
+//
+#define DBGKD_64BIT_PROTOCOL_VERSION1       5
+#define DBGKD_64BIT_PROTOCOL_VERSION2       6
+
+//
+// Query Memory Address Spaces
+//
+#define DBGKD_QUERY_MEMORY_VIRTUAL          0
+#define DBGKD_QUERY_MEMORY_PROCESS          0
+#define DBGKD_QUERY_MEMORY_SESSION          1
+#define DBGKD_QUERY_MEMORY_KERNEL           2
+
+//
+// Query Memory Flags
+//
+#define DBGKD_QUERY_MEMORY_READ             0x01
+#define DBGKD_QUERY_MEMORY_WRITE            0x02
+#define DBGKD_QUERY_MEMORY_EXECUTE          0x04
+#define DBGKD_QUERY_MEMORY_FIXED            0x08
+
+//
+// Internal Breakpoint Flags
+//
+#define DBGKD_INTERNAL_BP_FLAG_COUNTONLY    0x01
+#define DBGKD_INTERNAL_BP_FLAG_INVALID      0x02 
+#define DBGKD_INTERNAL_BP_FLAG_SUSPENDED    0x04
+#define DBGKD_INTERNAL_BP_FLAG_DYING        0x08
+
+//
+// Fill Memory Flags
+//
+#define DBGKD_FILL_MEMORY_VIRTUAL           0x01
+#define DBGKD_FILL_MEMORY_PHYSICAL          0x02
+
+//
+// Physical Memory Caching Flags
+//
+#define DBGKD_CACHING_DEFAULT               0
+#define DBGKD_CACHING_CACHED                1
+#define DBGKD_CACHING_UNCACHED              2
+#define DBGKD_CACHING_WRITE_COMBINED        3
+
+//
+// Partition Switch Flags
+//
+#define DBGKD_PARTITION_DEFAULT             0x00
+#define DBGKD_PARTITION_ALTERNATE           0x01
+
+//
+// Control Space types
+//
+#define DEBUG_CONTROL_SPACE_KPCR 0
+#define DEBUG_CONTROL_SPACE_KPRCB 1
+#define DEBUG_CONTROL_SPACE_KSPECIAL 2
+#define DEBUG_CONTROL_SPACE_KTHREAD 3
+#define X86_DEBUG_CONTROL_SPACE_KSPECIAL    716
+
+
+//
+// KD Packet Structure
+//
+typedef struct _KD_PACKET
+{
+    ULONG PacketLeader;
+    USHORT PacketType;
+    USHORT ByteCount;
+    ULONG PacketId;
+    ULONG Checksum;
+} KD_PACKET, *PKD_PACKET;
+
+//
+// KD Context
+//
+typedef struct _KD_CONTEXT
+{
+    ULONG KdpDefaultRetries;
+    BOOLEAN KdpControlCPending;
+} KD_CONTEXT, *PKD_CONTEXT;
+
+//
+// Control Sets for Supported Architectures
+//
+#include <pshpack4.h>
+typedef struct _X86_DBGKD_CONTROL_SET
+{
+    ULONG TraceFlag;
+    ULONG Dr7;
+    ULONG CurrentSymbolStart;
+    ULONG CurrentSymbolEnd;
+} X86_DBGKD_CONTROL_SET, *PX86_DBGKD_CONTROL_SET;
+
+typedef struct _ALPHA_DBGKD_CONTROL_SET
+{
+    ULONG __padding;
+} ALPHA_DBGKD_CONTROL_SET, *PALPHA_DBGKD_CONTROL_SET;
+
+typedef struct _IA64_DBGKD_CONTROL_SET
+{
+    ULONG Continue;
+    ULONG64 CurrentSymbolStart;
+    ULONG64 CurrentSymbolEnd;
+} IA64_DBGKD_CONTROL_SET, *PIA64_DBGKD_CONTROL_SET;
+
+typedef struct _AMD64_DBGKD_CONTROL_SET
+{
+    ULONG TraceFlag;
+    ULONG64 Dr7;
+    ULONG64 CurrentSymbolStart;
+    ULONG64 CurrentSymbolEnd;
+} AMD64_DBGKD_CONTROL_SET, *PAMD64_DBGKD_CONTROL_SET;
+
+typedef struct _ARM_DBGKD_CONTROL_SET
+{
+    ULONG Continue;
+    ULONG CurrentSymbolStart;
+    ULONG CurrentSymbolEnd;
+} ARM_DBGKD_CONTROL_SET, *PARM_DBGKD_CONTROL_SET;
+
+typedef struct _DBGKD_ANY_CONTROL_SET
+{
+    union
+    {
+        X86_DBGKD_CONTROL_SET X86ControlSet;
+        ALPHA_DBGKD_CONTROL_SET AlphaControlSet;
+        IA64_DBGKD_CONTROL_SET IA64ControlSet;
+        AMD64_DBGKD_CONTROL_SET Amd64ControlSet;
+        ARM_DBGKD_CONTROL_SET ARMControlSet;
+    };
+} DBGKD_ANY_CONTROL_SET, *PDBGKD_ANY_CONTROL_SET;
+#include <poppack.h>
+
+#if defined(_M_IX86)
+typedef X86_DBGKD_CONTROL_SET DBGKD_CONTROL_SET, *PDBGKD_CONTROL_SET;
+#elif defined(_M_AMD64)
+typedef AMD64_DBGKD_CONTROL_SET DBGKD_CONTROL_SET, *PDBGKD_CONTROL_SET;
+#elif defined(_M_ARM)
+typedef ARM_DBGKD_CONTROL_SET DBGKD_CONTROL_SET, *PDBGKD_CONTROL_SET;
+#else
+#error Unsupported Architecture
+#endif
+
+//
+// DBGKM Structure for Exceptions
+//
+typedef struct _DBGKM_EXCEPTION32
+{
+    EXCEPTION_RECORD32 ExceptionRecord;
+    ULONG FirstChance;
+} DBGKM_EXCEPTION32, *PDBGKM_EXCEPTION32;
+
+typedef struct _DBGKM_EXCEPTION64
+{
+    EXCEPTION_RECORD64 ExceptionRecord;
+    ULONG FirstChance;
+} DBGKM_EXCEPTION64, *PDBGKM_EXCEPTION64;
+
+//
+// DBGKD Structure for State Change
+//
+typedef struct _X86_DBGKD_CONTROL_REPORT
+{
+    ULONG   Dr6;
+    ULONG   Dr7;
+    USHORT  InstructionCount;
+    USHORT  ReportFlags;
+    UCHAR   InstructionStream[DBGKD_MAXSTREAM];
+    USHORT  SegCs;
+    USHORT  SegDs;
+    USHORT  SegEs;
+    USHORT  SegFs;
+    ULONG   EFlags;
+} X86_DBGKD_CONTROL_REPORT, *PX86_DBGKD_CONTROL_REPORT;
+
+typedef struct _ALPHA_DBGKD_CONTROL_REPORT
+{
+    ULONG InstructionCount;
+    UCHAR InstructionStream[DBGKD_MAXSTREAM];
+} ALPHA_DBGKD_CONTROL_REPORT, *PALPHA_DBGKD_CONTROL_REPORT;
+
+typedef struct _IA64_DBGKD_CONTROL_REPORT
+{
+    ULONG InstructionCount;
+    UCHAR InstructionStream[DBGKD_MAXSTREAM];
+} IA64_DBGKD_CONTROL_REPORT, *PIA64_DBGKD_CONTROL_REPORT;
+
+typedef struct _AMD64_DBGKD_CONTROL_REPORT
+{
+    ULONG64 Dr6;
+    ULONG64 Dr7;
+    ULONG EFlags;
+    USHORT InstructionCount;
+    USHORT ReportFlags;
+    UCHAR InstructionStream[DBGKD_MAXSTREAM];
+    USHORT SegCs;
+    USHORT SegDs;
+    USHORT SegEs;
+    USHORT SegFs;
+} AMD64_DBGKD_CONTROL_REPORT, *PAMD64_DBGKD_CONTROL_REPORT;
+
+typedef struct _ARM_DBGKD_CONTROL_REPORT
+{
+    ULONG Cpsr;
+    ULONG InstructionCount;
+    UCHAR InstructionStream[DBGKD_MAXSTREAM];
+} ARM_DBGKD_CONTROL_REPORT, *PARM_DBGKD_CONTROL_REPORT;
+
+typedef struct _DBGKD_ANY_CONTROL_REPORT
+{
+    union
+    {
+        X86_DBGKD_CONTROL_REPORT X86ControlReport;
+        ALPHA_DBGKD_CONTROL_REPORT AlphaControlReport;
+        IA64_DBGKD_CONTROL_REPORT IA64ControlReport;
+        AMD64_DBGKD_CONTROL_REPORT Amd64ControlReport;
+        ARM_DBGKD_CONTROL_REPORT ARMControlReport;
+    };
+} DBGKD_ANY_CONTROL_REPORT, *PDBGKD_ANY_CONTROL_REPORT;
+
+#if defined(_M_IX86)
+typedef X86_DBGKD_CONTROL_REPORT DBGKD_CONTROL_REPORT, *PDBGKD_CONTROL_REPORT;
+#elif defined(_M_AMD64)
+typedef AMD64_DBGKD_CONTROL_REPORT DBGKD_CONTROL_REPORT, *PDBGKD_CONTROL_REPORT;
+#elif defined(_M_ARM)
+typedef ARM_DBGKD_CONTROL_REPORT DBGKD_CONTROL_REPORT, *PDBGKD_CONTROL_REPORT;
+#else
+#error Unsupported Architecture
+#endif
+
+//
+// DBGKD Structure for Debug I/O Type Print String
+//
+typedef struct _DBGKD_PRINT_STRING
+{
+    ULONG LengthOfString;
+} DBGKD_PRINT_STRING, *PDBGKD_PRINT_STRING;
+
+//
+// DBGKD Structure for Debug I/O Type Get String
+//
+typedef struct _DBGKD_GET_STRING
+{
+    ULONG LengthOfPromptString;
+    ULONG LengthOfStringRead;
+} DBGKD_GET_STRING, *PDBGKD_GET_STRING;
+
+//
+// DBGKD Structure for Debug I/O
+//
+typedef struct _DBGKD_DEBUG_IO
+{
+    ULONG ApiNumber;
+    USHORT ProcessorLevel;
+    USHORT Processor;
+    union
+    {
+        DBGKD_PRINT_STRING PrintString;
+        DBGKD_GET_STRING GetString;
+    } u;
+} DBGKD_DEBUG_IO, *PDBGKD_DEBUG_IO;
+
+//
+// DBGkD Structure for Command String
+//
+typedef struct _DBGKD_COMMAND_STRING
+{
+    ULONG Flags;
+    ULONG Reserved1;
+    ULONG64 Reserved2[7];
+} DBGKD_COMMAND_STRING, *PDBGKD_COMMAND_STRING;
+
+//
+// DBGKD Structure for Load Symbols
+//
+typedef struct _DBGKD_LOAD_SYMBOLS32
+{
+    ULONG PathNameLength;
+    ULONG BaseOfDll;
+    ULONG ProcessId;
+    ULONG CheckSum;
+    ULONG SizeOfImage;
+    BOOLEAN UnloadSymbols;
+} DBGKD_LOAD_SYMBOLS32, *PDBGKD_LOAD_SYMBOLS32;
+
+typedef struct _DBGKD_LOAD_SYMBOLS64
+{
+    ULONG PathNameLength;
+    ULONG64 BaseOfDll;
+    ULONG64 ProcessId;
+    ULONG CheckSum;
+    ULONG SizeOfImage;
+    BOOLEAN UnloadSymbols;
+} DBGKD_LOAD_SYMBOLS64, *PDBGKD_LOAD_SYMBOLS64;
+
+//
+// DBGKD Structure for Wait State Change
+//
+
+typedef struct _DBGKD_WAIT_STATE_CHANGE32
+{
+    ULONG NewState;
+    USHORT ProcessorLevel;
+    USHORT Processor;
+    ULONG NumberProcessors;
+    ULONG Thread;
+    ULONG ProgramCounter;
+    union
+       {
+        DBGKM_EXCEPTION32 Exception;
+        DBGKD_LOAD_SYMBOLS32 LoadSymbols;
+    } u;
+    DBGKD_CONTROL_REPORT ControlReport;
+    CONTEXT Context;
+} DBGKD_WAIT_STATE_CHANGE32, *PDBGKD_WAIT_STATE_CHANGE32;
+
+typedef struct _DBGKD_WAIT_STATE_CHANGE64
+{
+    ULONG NewState;
+    USHORT ProcessorLevel;
+    USHORT Processor;
+    ULONG NumberProcessors;
+    ULONG64 Thread;
+    ULONG64 ProgramCounter;
+    union
+    {
+        DBGKM_EXCEPTION64 Exception;
+        DBGKD_LOAD_SYMBOLS64 LoadSymbols;
+    } u;
+    DBGKD_CONTROL_REPORT ControlReport;
+    CONTEXT Context;
+} DBGKD_WAIT_STATE_CHANGE64, *PDBGKD_WAIT_STATE_CHANGE64;
+
+typedef struct _DBGKD_ANY_WAIT_STATE_CHANGE
+{
+    ULONG NewState;
+    USHORT ProcessorLevel;
+    USHORT Processor;
+    ULONG NumberProcessors;
+    ULONG64 Thread;
+    ULONG64 ProgramCounter;
+    union
+       {
+        DBGKM_EXCEPTION64 Exception;
+        DBGKD_LOAD_SYMBOLS64 LoadSymbols;
+        DBGKD_COMMAND_STRING CommandString;
+    } u;
+    union
+       {
+        DBGKD_CONTROL_REPORT ControlReport;
+        DBGKD_ANY_CONTROL_REPORT AnyControlReport;
+    };
+} DBGKD_ANY_WAIT_STATE_CHANGE, *PDBGKD_ANY_WAIT_STATE_CHANGE;
+
+//
+// DBGKD Manipulate Structures
+//
+typedef struct _DBGKD_READ_MEMORY32
+{
+    ULONG TargetBaseAddress;
+    ULONG TransferCount;
+    ULONG ActualBytesRead;
+} DBGKD_READ_MEMORY32, *PDBGKD_READ_MEMORY32;
+
+typedef struct _DBGKD_READ_MEMORY64
+{
+    ULONG64 TargetBaseAddress;
+    ULONG TransferCount;
+    ULONG ActualBytesRead;
+} DBGKD_READ_MEMORY64, *PDBGKD_READ_MEMORY64;
+
+typedef struct _DBGKD_WRITE_MEMORY32
+{
+    ULONG TargetBaseAddress;
+    ULONG TransferCount;
+    ULONG ActualBytesWritten;
+} DBGKD_WRITE_MEMORY32, *PDBGKD_WRITE_MEMORY32;
+
+typedef struct _DBGKD_WRITE_MEMORY64
+{
+    ULONG64 TargetBaseAddress;
+    ULONG TransferCount;
+    ULONG ActualBytesWritten;
+} DBGKD_WRITE_MEMORY64, *PDBGKD_WRITE_MEMORY64;
+
+typedef struct _DBGKD_GET_CONTEXT
+{
+    ULONG Unused;
+} DBGKD_GET_CONTEXT, *PDBGKD_GET_CONTEXT;
+
+typedef struct _DBGKD_SET_CONTEXT
+{
+    ULONG ContextFlags;
+} DBGKD_SET_CONTEXT, *PDBGKD_SET_CONTEXT;
+
+typedef struct _DBGKD_WRITE_BREAKPOINT32
+{
+    ULONG BreakPointAddress;
+    ULONG BreakPointHandle;
+} DBGKD_WRITE_BREAKPOINT32, *PDBGKD_WRITE_BREAKPOINT32;
+
+typedef struct _DBGKD_WRITE_BREAKPOINT64
+{
+    ULONG64 BreakPointAddress;
+    ULONG BreakPointHandle;
+} DBGKD_WRITE_BREAKPOINT64, *PDBGKD_WRITE_BREAKPOINT64;
+
+typedef struct _DBGKD_RESTORE_BREAKPOINT
+{
+    ULONG BreakPointHandle;
+} DBGKD_RESTORE_BREAKPOINT, *PDBGKD_RESTORE_BREAKPOINT;
+
+typedef struct _DBGKD_CONTINUE
+{
+    NTSTATUS ContinueStatus;
+} DBGKD_CONTINUE, *PDBGKD_CONTINUE;
+
+#include <pshpack4.h>
+typedef struct _DBGKD_CONTINUE2
+{
+    NTSTATUS ContinueStatus;
+    union
+    {
+        DBGKD_CONTROL_SET ControlSet;
+        DBGKD_ANY_CONTROL_SET AnyControlSet;
+    };
+} DBGKD_CONTINUE2, *PDBGKD_CONTINUE2;
+#include <poppack.h>
+
+typedef struct _DBGKD_READ_WRITE_IO32
+{
+    ULONG IoAddress;
+    ULONG DataSize;
+    ULONG DataValue;
+} DBGKD_READ_WRITE_IO32, *PDBGKD_READ_WRITE_IO32;
+
+typedef struct _DBGKD_READ_WRITE_IO64
+{
+    ULONG64 IoAddress;
+    ULONG DataSize;
+    ULONG DataValue;
+} DBGKD_READ_WRITE_IO64, *PDBGKD_READ_WRITE_IO64;
+
+typedef struct _DBGKD_READ_WRITE_IO_EXTENDED32
+{
+    ULONG DataSize;
+    ULONG InterfaceType;
+    ULONG BusNumber;
+    ULONG AddressSpace;
+    ULONG IoAddress;
+    ULONG DataValue;
+} DBGKD_READ_WRITE_IO_EXTENDED32, *PDBGKD_READ_WRITE_IO_EXTENDED32;
+
+typedef struct _DBGKD_READ_WRITE_IO_EXTENDED64
+{
+    ULONG DataSize;
+    ULONG InterfaceType;
+    ULONG BusNumber;
+    ULONG AddressSpace;
+    ULONG64 IoAddress;
+    ULONG DataValue;
+} DBGKD_READ_WRITE_IO_EXTENDED64, *PDBGKD_READ_WRITE_IO_EXTENDED64;
+
+typedef struct _DBGKD_READ_WRITE_MSR
+{
+    ULONG Msr;
+    ULONG DataValueLow;
+    ULONG DataValueHigh;
+} DBGKD_READ_WRITE_MSR, *PDBGKD_READ_WRITE_MSR;
+
+typedef struct _DBGKD_QUERY_SPECIAL_CALLS
+{
+    ULONG NumberOfSpecialCalls;
+} DBGKD_QUERY_SPECIAL_CALLS, *PDBGKD_QUERY_SPECIAL_CALLS;
+
+typedef struct _DBGKD_SET_SPECIAL_CALL32
+{
+    ULONG SpecialCall;
+} DBGKD_SET_SPECIAL_CALL32, *PDBGKD_SET_SPECIAL_CALL32;
+
+typedef struct _DBGKD_SET_SPECIAL_CALL64
+{
+    ULONG64 SpecialCall;
+} DBGKD_SET_SPECIAL_CALL64, *PDBGKD_SET_SPECIAL_CALL64;
+
+typedef struct _DBGKD_SET_INTERNAL_BREAKPOINT32
+{
+    ULONG BreakpointAddress;
+    ULONG Flags;
+} DBGKD_SET_INTERNAL_BREAKPOINT32, *PDBGKD_SET_INTERNAL_BREAKPOINT32;
+
+typedef struct _DBGKD_SET_INTERNAL_BREAKPOINT64
+{
+    ULONG64 BreakpointAddress;
+    ULONG Flags;
+} DBGKD_SET_INTERNAL_BREAKPOINT64, *PDBGKD_SET_INTERNAL_BREAKPOINT64;
+
+typedef struct _DBGKD_GET_INTERNAL_BREAKPOINT32
+{
+    ULONG BreakpointAddress;
+    ULONG Flags;
+    ULONG Calls;
+    ULONG MaxCallsPerPeriod;
+    ULONG MinInstructions;
+    ULONG MaxInstructions;
+    ULONG TotalInstructions;
+} DBGKD_GET_INTERNAL_BREAKPOINT32, *PDBGKD_GET_INTERNAL_BREAKPOINT32;
+
+typedef struct _DBGKD_GET_INTERNAL_BREAKPOINT64
+{
+    ULONG64 BreakpointAddress;
+    ULONG Flags;
+    ULONG Calls;
+    ULONG MaxCallsPerPeriod;
+    ULONG MinInstructions;
+    ULONG MaxInstructions;
+    ULONG TotalInstructions;
+} DBGKD_GET_INTERNAL_BREAKPOINT64, *PDBGKD_GET_INTERNAL_BREAKPOINT64;
+
+typedef struct _DBGKD_BREAKPOINTEX
+{
+    ULONG BreakPointCount;
+    NTSTATUS ContinueStatus;
+} DBGKD_BREAKPOINTEX, *PDBGKD_BREAKPOINTEX;
+
+typedef struct _DBGKD_SEARCH_MEMORY
+{
+    union
+    {
+        ULONG64 SearchAddress;
+        ULONG64 FoundAddress;
+    };
+    ULONG64 SearchLength;
+    ULONG PatternLength;
+} DBGKD_SEARCH_MEMORY, *PDBGKD_SEARCH_MEMORY;
+
+typedef struct _DBGKD_GET_SET_BUS_DATA
+{
+    ULONG BusDataType;
+    ULONG BusNumber;
+    ULONG SlotNumber;
+    ULONG Offset;
+    ULONG Length;
+} DBGKD_GET_SET_BUS_DATA, *PDBGKD_GET_SET_BUS_DATA;
+
+typedef struct _DBGKD_FILL_MEMORY
+{
+    ULONG64 Address;
+    ULONG Length;
+    USHORT Flags;
+    USHORT PatternLength;
+} DBGKD_FILL_MEMORY, *PDBGKD_FILL_MEMORY;
+
+typedef struct _DBGKD_QUERY_MEMORY
+{
+    ULONG64 Address;
+    ULONG64 Reserved;
+    ULONG AddressSpace;
+    ULONG Flags;
+} DBGKD_QUERY_MEMORY, *PDBGKD_QUERY_MEMORY;
+
+typedef struct _DBGKD_SWITCH_PARTITION
+{
+    ULONG Partition;
+} DBGKD_SWITCH_PARTITION;
+
+//
+// DBGKD Structure for Manipulate
+//
+typedef struct _DBGKD_MANIPULATE_STATE32
+{
+    ULONG ApiNumber;
+    USHORT ProcessorLevel;
+    USHORT Processor;
+    NTSTATUS ReturnStatus;
+    union
+    {
+        DBGKD_READ_MEMORY32 ReadMemory;
+        DBGKD_WRITE_MEMORY32 WriteMemory;
+        DBGKD_READ_MEMORY64 ReadMemory64;
+        DBGKD_WRITE_MEMORY64 WriteMemory64;
+        DBGKD_GET_CONTEXT GetContext;
+        DBGKD_SET_CONTEXT SetContext;
+        DBGKD_WRITE_BREAKPOINT32 WriteBreakPoint;
+        DBGKD_RESTORE_BREAKPOINT RestoreBreakPoint;
+        DBGKD_CONTINUE Continue;
+        DBGKD_CONTINUE2 Continue2;
+        DBGKD_READ_WRITE_IO32 ReadWriteIo;
+        DBGKD_READ_WRITE_IO_EXTENDED32 ReadWriteIoExtended;
+        DBGKD_QUERY_SPECIAL_CALLS QuerySpecialCalls;
+        DBGKD_SET_SPECIAL_CALL32 SetSpecialCall;
+        DBGKD_SET_INTERNAL_BREAKPOINT32 SetInternalBreakpoint;
+        DBGKD_GET_INTERNAL_BREAKPOINT32 GetInternalBreakpoint;
+        DBGKD_GET_VERSION32 GetVersion32;
+        DBGKD_BREAKPOINTEX BreakPointEx;
+        DBGKD_READ_WRITE_MSR ReadWriteMsr;
+        DBGKD_SEARCH_MEMORY SearchMemory;
+        DBGKD_GET_SET_BUS_DATA GetSetBusData;
+        DBGKD_FILL_MEMORY FillMemory;
+        DBGKD_QUERY_MEMORY QueryMemory;
+        DBGKD_SWITCH_PARTITION SwitchPartition;
+    } u;
+} DBGKD_MANIPULATE_STATE32, *PDBGKD_MANIPULATE_STATE32;
+
+typedef struct _DBGKD_MANIPULATE_STATE64
+{
+    ULONG ApiNumber;
+    USHORT ProcessorLevel;
+    USHORT Processor;
+    NTSTATUS ReturnStatus;
+    union
+    {
+        DBGKD_READ_MEMORY64 ReadMemory;
+        DBGKD_WRITE_MEMORY64 WriteMemory;
+        DBGKD_GET_CONTEXT GetContext;
+        DBGKD_SET_CONTEXT SetContext;
+        DBGKD_WRITE_BREAKPOINT64 WriteBreakPoint;
+        DBGKD_RESTORE_BREAKPOINT RestoreBreakPoint;
+        DBGKD_CONTINUE Continue;
+        DBGKD_CONTINUE2 Continue2;
+        DBGKD_READ_WRITE_IO64 ReadWriteIo;
+        DBGKD_READ_WRITE_IO_EXTENDED64 ReadWriteIoExtended;
+        DBGKD_QUERY_SPECIAL_CALLS QuerySpecialCalls;
+        DBGKD_SET_SPECIAL_CALL64 SetSpecialCall;
+        DBGKD_SET_INTERNAL_BREAKPOINT64 SetInternalBreakpoint;
+        DBGKD_GET_INTERNAL_BREAKPOINT64 GetInternalBreakpoint;
+        DBGKD_GET_VERSION64 GetVersion64;
+        DBGKD_BREAKPOINTEX BreakPointEx;
+        DBGKD_READ_WRITE_MSR ReadWriteMsr;
+        DBGKD_SEARCH_MEMORY SearchMemory;
+        DBGKD_GET_SET_BUS_DATA GetSetBusData;
+        DBGKD_FILL_MEMORY FillMemory;
+        DBGKD_QUERY_MEMORY QueryMemory;
+        DBGKD_SWITCH_PARTITION SwitchPartition;
+    } u;
+} DBGKD_MANIPULATE_STATE64, *PDBGKD_MANIPULATE_STATE64;
+
+//
+// File I/O Structure
+//
+typedef struct _DBGKD_CREATE_FILE
+{
+    ULONG DesiredAccess;
+    ULONG FileAttributes;
+    ULONG ShareAccess;
+    ULONG CreateDisposition;
+    ULONG CreateOptions;
+    ULONG64 Handle;
+    ULONG64 Length;
+} DBGKD_CREATE_FILE, *PDBGKD_CREATE_FILE;
+
+typedef struct _DBGKD_READ_FILE
+{
+    ULONG64 Handle;
+    ULONG64 Offset;
+    ULONG Length;
+} DBGKD_READ_FILE, *PDBGKD_READ_FILE;
+
+typedef struct _DBGKD_WRITE_FILE
+{
+    ULONG64 Handle;
+    ULONG64 Offset;
+    ULONG Length;
+} DBGKD_WRITE_FILE, *PDBGKD_WRITE_FILE;
+
+typedef struct _DBGKD_CLOSE_FILE
+{
+    ULONG64 Handle;
+} DBGKD_CLOSE_FILE, *PDBGKD_CLOSE_FILE;
+
+typedef struct _DBGKD_FILE_IO
+{
+    ULONG ApiNumber;
+    ULONG Status;
+    union
+       {
+        ULONG64 ReserveSpace[7];
+        DBGKD_CREATE_FILE CreateFile;
+        DBGKD_READ_FILE ReadFile;
+        DBGKD_WRITE_FILE WriteFile;
+        DBGKD_CLOSE_FILE CloseFile;
+    } u;
+} DBGKD_FILE_IO, *PDBGKD_FILE_IO;
+
+
+//
+// Control Request Structure
+//
+typedef struct _DBGKD_REQUEST_BREAKPOINT
+{
+    ULONG HardwareBreakPointNumber;
+    ULONG Available;
+} DBGKD_REQUEST_BREAKPOINT, *PDBGKD_REQUEST_BREAKPOINT;
+
+typedef struct _DBGKD_RELEASE_BREAKPOINT
+{
+    ULONG HardwareBreakPointNumber;
+    ULONG Released;
+} DBGKD_RELEASE_BREAKPOINT, *PDBGKD_RELEASE_BREAKPOINT;
+
+typedef struct _DBGKD_CONTROL_REQUEST
+{
+    ULONG ApiNumber;
+    union
+       {
+        DBGKD_REQUEST_BREAKPOINT RequestBreakpoint;
+        DBGKD_RELEASE_BREAKPOINT ReleaseBreakpoint;
+    } u;
+} DBGKD_CONTROL_REQUEST, *PDBGKD_CONTROL_REQUEST;
+
+//
+// Trace I/O Structure
+//
+typedef struct _DBGKD_PRINT_TRACE
+{
+    ULONG LengthOfData;
+} DBGKD_PRINT_TRACE, *PDBGKD_PRINT_TRACE;
+
+typedef struct _DBGKD_TRACE_IO
+{
+   ULONG ApiNumber;
+   USHORT ProcessorLevel;
+   USHORT Processor;
+   union
+   {
+       ULONG64 ReserveSpace[7];
+       DBGKD_PRINT_TRACE PrintTrace;
+   } u;
+} DBGKD_TRACE_IO, *PDBGKD_TRACE_IO;
+
+#if defined(_M_AMD64)
+
+#define CopyExceptionRecord(Ex64From, Ex64To) \
+        RtlCopyMemory(Ex64To, Ex64From, sizeof(EXCEPTION_RECORD64))
+
+#else
+
+FORCEINLINE
+VOID
+ExceptionRecord32To64(IN PEXCEPTION_RECORD32 Ex32,
+                      OUT PEXCEPTION_RECORD64 Ex64)
+{
+    ULONG i;
+
+    Ex64->ExceptionCode = Ex32->ExceptionCode;
+    Ex64->ExceptionFlags = Ex32->ExceptionFlags;
+    Ex64->ExceptionRecord = Ex32->ExceptionRecord;
+    COPYSE(Ex64,Ex32,ExceptionAddress);
+    Ex64->NumberParameters = Ex32->NumberParameters;
+
+    for (i = 0; i < EXCEPTION_MAXIMUM_PARAMETERS; i++)
+    {
+        COPYSE(Ex64,Ex32,ExceptionInformation[i]);
+    }
+}
+
+#define CopyExceptionRecord(Ex32From, Ex64To) \
+        ExceptionRecord32To64((PEXCEPTION_RECORD32)Ex32From, Ex64To)
+
+#endif
+
+#endif