#pragma once #include // // Kernel Debugger Port Definition // struct _KD_DISPATCH_TABLE; BOOLEAN NTAPI KdPortInitializeEx( PCPPORT PortInformation, ULONG ComPortNumber ); BOOLEAN NTAPI KdPortGetByteEx( PCPPORT PortInformation, PUCHAR ByteReceived); VOID NTAPI KdPortPutByteEx( PCPPORT PortInformation, UCHAR ByteToSend ); #ifdef _NTOSKRNL_ /* KD ROUTINES ***************************************************************/ typedef enum _KD_CONTINUE_TYPE { kdContinue = 0, kdDoNotHandleException, kdHandleException } KD_CONTINUE_TYPE; typedef VOID (NTAPI *PKDP_INIT_ROUTINE)( _In_ struct _KD_DISPATCH_TABLE *DispatchTable, _In_ ULONG BootPhase); typedef VOID (NTAPI*PKDP_PRINT_ROUTINE)( PCHAR String, ULONG Length ); /* INIT ROUTINES *************************************************************/ KIRQL NTAPI KdbpAcquireLock( _In_ PKSPIN_LOCK SpinLock); VOID NTAPI KdbpReleaseLock( _In_ PKSPIN_LOCK SpinLock, _In_ KIRQL OldIrql); VOID KdpScreenAcquire(VOID); VOID KdpScreenRelease(VOID); VOID NTAPI KdpScreenInit( _In_ struct _KD_DISPATCH_TABLE *DispatchTable, _In_ ULONG BootPhase); VOID NTAPI KdpSerialInit( _In_ struct _KD_DISPATCH_TABLE *DispatchTable, _In_ ULONG BootPhase); VOID NTAPI KdpDebugLogInit( _In_ struct _KD_DISPATCH_TABLE *DispatchTable, _In_ ULONG BootPhase); #ifdef KDBG #define KdpKdbgInit KdbInitialize #endif /* KD ROUTINES ***************************************************************/ BOOLEAN NTAPI KdpSafeReadMemory( IN ULONG_PTR Addr, IN LONG Len, OUT PVOID Value ); BOOLEAN NTAPI KdpSafeWriteMemory( IN ULONG_PTR Addr, IN LONG Len, IN ULONGLONG Value ); /* KD GLOBALS ***************************************************************/ /* Serial debug connection */ #define DEFAULT_DEBUG_PORT 2 /* COM2 */ #define DEFAULT_DEBUG_COM1_IRQ 4 /* COM1 IRQ */ #define DEFAULT_DEBUG_COM2_IRQ 3 /* COM2 IRQ */ #define DEFAULT_DEBUG_BAUD_RATE 115200 /* 115200 Baud */ /* KD Native Modes */ #define KdScreen 0 #define KdSerial 1 #define KdFile 2 #define KdKdbg 3 #define KdMax 4 /* KD Private Debug Modes */ typedef struct _KDP_DEBUG_MODE { union { struct { /* Native Modes */ UCHAR Screen :1; UCHAR Serial :1; UCHAR File :1; }; /* Generic Value */ ULONG Value; }; } KDP_DEBUG_MODE; /* KD Internal Debug Services */ typedef enum _KDP_DEBUG_SERVICE { DumpNonPagedPool = 0x1e, /* a */ ManualBugCheck = 0x30, /* b */ DumpNonPagedPoolStats = 0x2e, /* c */ DumpNewNonPagedPool = 0x20, /* d */ DumpNewNonPagedPoolStats = 0x12, /* e */ DumpAllThreads = 0x21, /* f */ DumpUserThreads = 0x22, /* g */ KdSpare1 = 0x23, /* h */ KdSpare2 = 0x17, /* i */ KdSpare3 = 0x24, /* j */ EnterDebugger = 0x25, /* k */ ThatsWhatSheSaid = 69 /* FIGURE IT OUT */ } KDP_DEBUG_SERVICE; /* Dispatch Table for Wrapper Functions */ typedef struct _KD_DISPATCH_TABLE { LIST_ENTRY KdProvidersList; PKDP_INIT_ROUTINE KdpInitRoutine; PKDP_PRINT_ROUTINE KdpPrintRoutine; } KD_DISPATCH_TABLE, *PKD_DISPATCH_TABLE; /* The current Debugging Mode */ extern KDP_DEBUG_MODE KdpDebugMode; /* Port Information for the Serial Native Mode */ extern ULONG SerialPortNumber; extern CPPORT SerialPortInfo; /* Init Functions for Native Providers */ extern PKDP_INIT_ROUTINE InitRoutines[KdMax]; /* Dispatch Tables for Native Providers */ extern KD_DISPATCH_TABLE DispatchTable[KdMax]; /* The KD Native Provider List */ extern LIST_ENTRY KdProviders; #endif // _NTOSKRNL_ #if DBG && defined(_M_IX86) && !defined(_WINKD_) // See ke/i386/traphdlr.c #define ID_Win32PreServiceHook 'WSH0' #define ID_Win32PostServiceHook 'WSH1' typedef void (NTAPI *PKDBG_PRESERVICEHOOK)(ULONG, PULONG_PTR); typedef ULONG_PTR (NTAPI *PKDBG_POSTSERVICEHOOK)(ULONG, ULONG_PTR); extern PKDBG_PRESERVICEHOOK KeWin32PreServiceHook; extern PKDBG_POSTSERVICEHOOK KeWin32PostServiceHook; #endif