-#ifndef __INCLUDE_INTERNAL_KERNEL_DEBUGGER_H
-#define __INCLUDE_INTERNAL_KERNEL_DEBUGGER_H
-
-//
-// Kernel Debugger Port Definition
-//
-typedef struct _KD_PORT_INFORMATION
+typedef struct _BREAKPOINT_ENTRY
{
- ULONG ComPort;
- ULONG BaudRate;
- ULONG BaseAddress;
-} KD_PORT_INFORMATION, *PKD_PORT_INFORMATION;
+ ULONG Flags;
+ PKPROCESS Process;
+ PVOID Address;
+ UCHAR Content;
+} BREAKPOINT_ENTRY, *PBREAKPOINT_ENTRY;
-struct _KD_DISPATCH_TABLE;
-extern KD_PORT_INFORMATION GdbPortInfo;
-extern BOOLEAN _KdDebuggerEnabled;
-extern BOOLEAN _KdDebuggerNotPresent;
-extern BOOLEAN KdBreakAfterSymbolLoad;
+typedef enum _KDP_BREAKPOINT_FLAGS
+{
+ KdpBreakpointActive = 1,
+ KdpBreakpointPending = 2,
+ KdpBreakpointSuspended = 4,
+ KdpBreakpointExpired = 8
+} KDP_BREAKPOINT_FLAGS;
+typedef
BOOLEAN
-NTAPI
-KdPortInitialize(
- PKD_PORT_INFORMATION PortInformation,
- ULONG Unknown1,
- ULONG Unknown2
+(NTAPI *PKDEBUG_ROUTINE)(
+ IN PKTRAP_FRAME TrapFrame,
+ IN PKEXCEPTION_FRAME ExceptionFrame,
+ IN PEXCEPTION_RECORD ExceptionRecord,
+ IN PCONTEXT Context,
+ IN KPROCESSOR_MODE PreviousMode,
+ IN BOOLEAN SecondChance
);
+typedef
BOOLEAN
-NTAPI
-KdPortInitializeEx(
- PKD_PORT_INFORMATION PortInformation,
- ULONG Unknown1,
- ULONG Unknown2
+(NTAPI *PKDEBUG_SWITCH_ROUTINE)(
+ IN PEXCEPTION_RECORD ExceptionRecord,
+ IN PCONTEXT Context,
+ IN BOOLEAN SecondChance
);
BOOLEAN
NTAPI
-KdPortGetByte(
- PUCHAR ByteRecieved);
-
-BOOLEAN
-NTAPI
-KdPortGetByteEx(
- PKD_PORT_INFORMATION PortInformation,
- PUCHAR ByteRecieved);
+KdpEnterDebuggerException(
+ IN PKTRAP_FRAME TrapFrame,
+ IN PKEXCEPTION_FRAME ExceptionFrame,
+ IN PEXCEPTION_RECORD ExceptionRecord,
+ IN PCONTEXT Context,
+ IN KPROCESSOR_MODE PreviousMode,
+ IN BOOLEAN SecondChance
+);
VOID
NTAPI
-KdPortPutByte(
- UCHAR ByteToSend
+KdpTimeSlipWork(
+ IN PVOID Context
);
-VOID
+BOOLEAN
NTAPI
-KdPortPutByteEx(
- PKD_PORT_INFORMATION PortInformation,
- UCHAR ByteToSend
+KdpSwitchProcessor(
+ IN PEXCEPTION_RECORD ExceptionRecord,
+ IN OUT PCONTEXT ContextRecord,
+ IN BOOLEAN SecondChanceException
);
-/* SYMBOL ROUTINES **********************************************************/
-#ifdef __NTOSKRNL__
-
-#if defined(KDBG) || defined(DBG)
-
-VOID
-KdbSymLoadUserModuleSymbols(IN PLDR_DATA_TABLE_ENTRY LdrModule);
-
VOID
-KdbSymFreeProcessSymbols(IN PEPROCESS Process);
-
-VOID
-KdbSymLoadDriverSymbols(
- IN PUNICODE_STRING Filename,
- IN PLDR_DATA_TABLE_ENTRY Module
+NTAPI
+KdpTimeSlipDpcRoutine(
+ IN PKDPC Dpc,
+ IN PVOID DeferredContext,
+ IN PVOID SystemArgument1,
+ IN PVOID SystemArgument2
);
-VOID
-KdbSymUnloadDriverSymbols(IN PLDR_DATA_TABLE_ENTRY ModuleObject);
-
-VOID
-KdbSymProcessBootSymbols(IN PUNICODE_STRING FileName);
-
-VOID
-KdbSymInit(
- IN PLDR_DATA_TABLE_ENTRY NtoskrnlTextSection,
- IN PLDR_DATA_TABLE_ENTRY LdrHalTextSection
+BOOLEAN
+NTAPI
+KdpStub(
+ IN PKTRAP_FRAME TrapFrame,
+ IN PKEXCEPTION_FRAME ExceptionFrame,
+ IN PEXCEPTION_RECORD ExceptionRecord,
+ IN PCONTEXT ContextRecord,
+ IN KPROCESSOR_MODE PreviousMode,
+ IN BOOLEAN SecondChanceException
);
BOOLEAN
-KdbSymPrintAddress(IN PVOID Address);
-
-VOID
-KdbDeleteProcessHook(IN PEPROCESS Process);
-
-NTSTATUS
-KdbSymGetAddressInformation(
- IN PROSSYM_INFO RosSymInfo,
- IN ULONG_PTR RelativeAddress,
- OUT PULONG LineNumber OPTIONAL,
- OUT PCH FileName OPTIONAL,
- OUT PCH FunctionName OPTIONAL
+NTAPI
+KdpTrap(
+ IN PKTRAP_FRAME TrapFrame,
+ IN PKEXCEPTION_FRAME ExceptionFrame,
+ IN PEXCEPTION_RECORD ExceptionRecord,
+ IN PCONTEXT ContextRecord,
+ IN KPROCESSOR_MODE PreviousMode,
+ IN BOOLEAN SecondChanceException
);
-typedef struct _KDB_MODULE_INFO
-{
- WCHAR Name[256];
- ULONG_PTR Base;
- ULONG Size;
- PROSSYM_INFO RosSymInfo;
-} KDB_MODULE_INFO, *PKDB_MODULE_INFO;
-
-/* MACROS FOR NON-KDBG BUILDS ************************************************/
-
-# define KDB_LOADUSERMODULE_HOOK(LDRMOD) KdbSymLoadUserModuleSymbols(LDRMOD)
-# define KDB_LOADDRIVER_HOOK(FILENAME, MODULE) KdbSymLoadDriverSymbols(FILENAME, MODULE)
-# define KDB_UNLOADDRIVER_HOOK(MODULE) KdbSymUnloadDriverSymbols(MODULE)
-# define KDB_LOADERINIT_HOOK(NTOS, HAL) KdbSymInit(NTOS, HAL)
-# define KDB_SYMBOLFILE_HOOK(FILENAME) KdbSymProcessBootSymbols(FILENAME)
-#else
-# define KDB_LOADUSERMODULE_HOOK(LDRMOD) do { } while (0)
-# define KDB_LOADDRIVER_HOOK(FILENAME, MODULE) do { } while (0)
-# define KDB_UNLOADDRIVER_HOOK(MODULE) do { } while (0)
-# define KDB_LOADERINIT_HOOK(NTOS, HAL) do { } while (0)
-# define KDB_SYMBOLFILE_HOOK(FILENAME) do { } while (0)
-# define KDB_CREATE_THREAD_HOOK(CONTEXT) do { } while (0)
-#endif
-
-#if defined(KDBG) || defined(DBG)
-# define KeRosPrintAddress(ADDRESS) KdbSymPrintAddress(ADDRESS)
-#else
-# define KeRosPrintAddress(ADDRESS) KiRosPrintAddress(ADDRESS)
-#endif
-
-#ifdef KDBG
-# define KdbInit() KdbpCliInit()
-# define KdbModuleLoaded(FILENAME) KdbpCliModuleLoaded(FILENAME)
-# define KDB_DELETEPROCESS_HOOK(PROCESS) KdbDeleteProcessHook(PROCESS)
-#else
-# define KdbEnterDebuggerException(ER, PM, C, TF, F) kdHandleException
-# define KdbInit() do { } while (0)
-# define KdbEnter() do { } while (0)
-# define KdbModuleLoaded(X) do { } while (0)
-# define KDB_DELETEPROCESS_HOOK(PROCESS) do { } while (0)
-#endif
-
-/* KD ROUTINES ***************************************************************/
-
-typedef enum _KD_CONTINUE_TYPE
-{
- kdContinue = 0,
- kdDoNotHandleException,
- kdHandleException
-} KD_CONTINUE_TYPE;
-
-typedef
VOID
-(STDCALL*PKDP_INIT_ROUTINE)(
- struct _KD_DISPATCH_TABLE *DispatchTable,
- ULONG BootPhase
+NTAPI
+KdpPortLock(
+ VOID
);
-typedef
VOID
-(STDCALL*PKDP_PRINT_ROUTINE)(
- LPSTR String,
- ULONG Length
+NTAPI
+KdpPortUnlock(
+ VOID
);
-typedef
-VOID
-(STDCALL*PKDP_PROMPT_ROUTINE)(PCH String);
-
-typedef
-KD_CONTINUE_TYPE
-(STDCALL*PKDP_EXCEPTION_ROUTINE)(
- PEXCEPTION_RECORD ExceptionRecord,
- PCONTEXT Context,
- PKTRAP_FRAME TrapFrame
+BOOLEAN
+NTAPI
+KdEnterDebugger(
+ IN PKTRAP_FRAME TrapFrame,
+ IN PKEXCEPTION_FRAME ExceptionFrame
);
-/* INIT ROUTINES *************************************************************/
-
VOID
-STDCALL
-KdpScreenInit(
- struct _KD_DISPATCH_TABLE *DispatchTable,
- ULONG BootPhase
+NTAPI
+KdExitDebugger(
+ IN BOOLEAN Entered
);
-VOID
-STDCALL
-KdpSerialInit(
- struct _KD_DISPATCH_TABLE *DispatchTable,
- ULONG BootPhase
+NTSTATUS
+NTAPI
+KdEnableDebuggerWithLock(
+ IN BOOLEAN NeedLock
);
-VOID
-STDCALL
-KdpInitDebugLog(
- struct _KD_DISPATCH_TABLE *DispatchTable,
- ULONG BootPhase
+ULONG
+NTAPI
+KdpPrint(
+ IN ULONG ComponentId,
+ IN ULONG ComponentMask,
+ IN LPSTR String,
+ IN ULONG Length,
+ IN KPROCESSOR_MODE PreviousMode,
+ IN PKTRAP_FRAME TrapFrame,
+ IN PKEXCEPTION_FRAME ExceptionFrame,
+ OUT PBOOLEAN Status
);
-VOID
-STDCALL
-KdpBochsInit(
- struct _KD_DISPATCH_TABLE *DispatchTable,
- ULONG BootPhase
+ULONG
+NTAPI
+KdpSymbol(
+ IN PSTRING DllPath,
+ IN PKD_SYMBOLS_INFO DllBase,
+ IN BOOLEAN Unload,
+ IN KPROCESSOR_MODE PreviousMode,
+ IN PCONTEXT ContextRecord,
+ IN PKTRAP_FRAME TrapFrame,
+ IN PKEXCEPTION_FRAME ExceptionFrame
);
-VOID
-STDCALL
-KdpGdbStubInit(
- struct _KD_DISPATCH_TABLE *DispatchTable,
- ULONG BootPhase);
-
-/* KD ROUTINES ***************************************************************/
-
BOOLEAN
NTAPI
-KdpCallGdb(
- IN PKTRAP_FRAME TrapFrame,
- IN PEXCEPTION_RECORD ExceptionRecord,
- IN PCONTEXT Context
+KdpPollBreakInWithPortLock(
+ VOID
);
-ULONG
-STDCALL
-KdpPrintString(
- LPSTR String,
- ULONG Length);
-
BOOLEAN
-STDCALL
-KdpDetectConflicts(PCM_RESOURCE_LIST DriverList);
+NTAPI
+KdpReportLoadSymbolsStateChange(
+ IN PSTRING PathName,
+ IN PKD_SYMBOLS_INFO SymbolInfo,
+ IN BOOLEAN Unload,
+ IN OUT PCONTEXT Context
+);
VOID
-STDCALL
-KdpBochsDebugPrint(
- IN PCH Message,
- IN ULONG Length
+NTAPI
+KdpRestoreAllBreakpoints(
+ VOID
);
-/* KD GLOBALS ***************************************************************/
-
-typedef
BOOLEAN
-(NTAPI *PKDEBUG_ROUTINE)(
- IN PKTRAP_FRAME TrapFrame,
- IN PKEXCEPTION_FRAME ExceptionFrame,
- IN PEXCEPTION_RECORD ExceptionRecord,
- IN PCONTEXT Context,
- IN KPROCESSOR_MODE PreviousMode,
- IN BOOLEAN SecondChance
-);
-
-/* 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 KdBochs 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;
- UCHAR Bochs :1;
-
- /* Currently Supported Wrappers */
- UCHAR Pice :1;
- UCHAR Gdb :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 */
-} KDP_DEBUG_SERVICE;
-
-/* Dispatch Table for Wrapper Functions */
-typedef struct _KD_DISPATCH_TABLE
-{
- LIST_ENTRY KdProvidersList;
- PKDP_INIT_ROUTINE KdpInitRoutine;
- PKDP_PRINT_ROUTINE KdpPrintRoutine;
- PKDP_PROMPT_ROUTINE KdpPromptRoutine;
- PKDP_EXCEPTION_ROUTINE KdpExceptionRoutine;
-} KD_DISPATCH_TABLE, *PKD_DISPATCH_TABLE;
-
-/* The current Debugging Mode */
-extern KDP_DEBUG_MODE KdpDebugMode;
-
-/* The current Port IRQ */
-extern ULONG KdpPortIrq;
-
-/* The current Port */
-extern ULONG KdpPort;
-
-/* Port Information for the Serial Native Mode */
-extern KD_PORT_INFORMATION SerialPortInfo;
-
-/* Init Functions for Native Providers */
-extern PKDP_INIT_ROUTINE InitRoutines[KdMax];
-
-/* Wrapper Init Function */
-extern PKDP_INIT_ROUTINE WrapperInitRoutine;
-
-/* Dispatch Tables for Native Providers */
-extern KD_DISPATCH_TABLE DispatchTable[KdMax];
-
-/* Dispatch Table for the Wrapper */
-extern KD_DISPATCH_TABLE WrapperTable;
-
-/* The KD Native Provider List */
-extern LIST_ENTRY KdProviders;
-
-/* Whether to enter KDB as early as possible or not */
-extern BOOLEAN KdpEarlyBreak;
-
+NTAPI
+KdpDeleteBreakpoint(
+ IN ULONG BpEntry
+);
+
+extern DBGKD_GET_VERSION64 KdVersionBlock;
+extern KDDEBUGGER_DATA64 KdDebuggerDataBlock;
+extern LIST_ENTRY KdpDebuggerDataListHead;
+extern KSPIN_LOCK KdpDataSpinLock;
+extern LARGE_INTEGER KdPerformanceCounterRate;
+extern LARGE_INTEGER KdTimerStart;
+extern ULONG KdDisableCount;
+extern KD_CONTEXT KdpContext;
extern PKDEBUG_ROUTINE KiDebugRoutine;
-
-#endif
-#endif /* __INCLUDE_INTERNAL_KERNEL_DEBUGGER_H */
+extern PKDEBUG_SWITCH_ROUTINE KiDebugSwitchRoutine;
+extern BOOLEAN KdBreakAfterSymbolLoad;
+extern BOOLEAN KdPitchDebugger;
+extern BOOLEAN _KdDebuggerNotPresent;
+extern BOOLEAN _KdDebuggerEnabled;
+extern BOOLEAN KdAutoEnableOnEvent;
+extern BOOLEAN KdPreviouslyEnabled;
+extern BOOLEAN KdpDebuggerStructuresInitialized;
+extern BOOLEAN KdEnteredDebugger;
+extern KDPC KdpTimeSlipDpc;
+extern KTIMER KdpTimeSlipTimer;
+extern WORK_QUEUE_ITEM KdpTimeSlipWorkItem;
+extern LONG KdpTimeSlipPending;
+extern PKEVENT KdpTimeSlipEvent;
+extern KSPIN_LOCK KdpTimeSlipEventLock;
+extern BOOLEAN KdpControlCPressed;
+extern BOOLEAN KdpControlCWaiting;
+extern BOOLEAN KdpPortLocked;
+extern KSPIN_LOCK KdpDebuggerLock;
+extern LARGE_INTEGER KdTimerStop, KdTimerStart, KdTimerDifference;
+extern ULONG KdComponentTableSize;
+extern ULONG Kd_WIN2000_Mask;
+extern PULONG KdComponentTable[104];
+extern CHAR KdpMessageBuffer[4096], KdpPathBuffer[4096];
+extern BREAKPOINT_ENTRY KdpBreakpointTable[20];
+extern ULONG KdpBreakpointInstruction;
+extern BOOLEAN KdpOweBreakpoint;
+extern BOOLEAN BreakpointsSuspended;