-/* $Id: kd.h,v 1.20 2003/12/23 05:05:10 arty Exp $
- *
- * kernel debugger prototypes
- */
-
#ifndef __INCLUDE_INTERNAL_KERNEL_DEBUGGER_H
#define __INCLUDE_INTERNAL_KERNEL_DEBUGGER_H
-#include <internal/ke.h>
-#include <internal/ldr.h>
+//
+// Kernel Debugger Port Definition
+//
+typedef struct _KD_PORT_INFORMATION
+{
+ ULONG ComPort;
+ ULONG BaudRate;
+ ULONG BaseAddress;
+} KD_PORT_INFORMATION, *PKD_PORT_INFORMATION;
-#define KD_DEBUG_DISABLED 0x00
-#define KD_DEBUG_GDB 0x01
-#define KD_DEBUG_PICE 0x02
-#define KD_DEBUG_SCREEN 0x04
-#define KD_DEBUG_SERIAL 0x08
-#define KD_DEBUG_BOCHS 0x10
-#define KD_DEBUG_FILELOG 0x20
-#define KD_DEBUG_MDA 0x40
-#define KD_DEBUG_KDB 0x80
-#define KD_DEBUG_KDSERIAL 0x100
+struct _KD_DISPATCH_TABLE;
+extern KD_PORT_INFORMATION GdbPortInfo;
-extern ULONG KdDebugState;
+BOOLEAN
+NTAPI
+KdPortInitialize(
+ PKD_PORT_INFORMATION PortInformation,
+ ULONG Unknown1,
+ ULONG Unknown2
+);
-KD_PORT_INFORMATION GdbPortInfo;
-KD_PORT_INFORMATION LogPortInfo;
+BOOLEAN
+NTAPI
+KdPortInitializeEx(
+ PKD_PORT_INFORMATION PortInformation,
+ ULONG Unknown1,
+ ULONG Unknown2
+);
-typedef enum _KD_CONTINUE_TYPE
-{
- kdContinue = 0,
- kdDoNotHandleException,
- kdHandleException
-} KD_CONTINUE_TYPE;
+BOOLEAN
+NTAPI
+KdPortGetByte(
+ PUCHAR ByteRecieved);
-ULONG
-KdpPrintString (PANSI_STRING String);
+BOOLEAN
+NTAPI
+KdPortGetByteEx(
+ PKD_PORT_INFORMATION PortInformation,
+ PUCHAR ByteRecieved);
VOID
-DebugLogWrite(PCH String);
+NTAPI
+KdPortPutByte(
+ UCHAR ByteToSend
+);
+
VOID
-DebugLogInit(VOID);
+NTAPI
+KdPortPutByteEx(
+ PKD_PORT_INFORMATION PortInformation,
+ UCHAR ByteToSend
+);
+
+/* SYMBOL ROUTINES **********************************************************/
+#ifdef __NTOSKRNL__
+
+#if defined(KDBG) || defined(DBG)
+
+VOID
+KdbSymLoadUserModuleSymbols(IN PLDR_DATA_TABLE_ENTRY LdrModule);
+
+VOID
+KdbSymFreeProcessSymbols(IN PEPROCESS Process);
+
VOID
-DebugLogInit2(VOID);
+KdbSymLoadDriverSymbols(
+ IN PUNICODE_STRING Filename,
+ IN PLDR_DATA_TABLE_ENTRY Module
+);
VOID
-KdInit1(VOID);
+KdbSymUnloadDriverSymbols(IN PLDR_DATA_TABLE_ENTRY ModuleObject);
VOID
-KdInit2(VOID);
+KdbSymProcessBootSymbols(IN PCHAR FileName);
VOID
-KdInit3(VOID);
+KdbSymInit(
+ IN PLDR_DATA_TABLE_ENTRY NtoskrnlTextSection,
+ IN PLDR_DATA_TABLE_ENTRY LdrHalTextSection
+);
+
+BOOLEAN
+KdbSymPrintAddress(IN PVOID Address);
VOID
-KdPutChar(UCHAR Value);
+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
+);
+
+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
-UCHAR
-KdGetChar(VOID);
+/* KD ROUTINES ***************************************************************/
+typedef enum _KD_CONTINUE_TYPE
+{
+ kdContinue = 0,
+ kdDoNotHandleException,
+ kdHandleException
+} KD_CONTINUE_TYPE;
+
+typedef
VOID
-KdGdbStubInit(ULONG Phase);
+(STDCALL*PKDP_INIT_ROUTINE)(
+ struct _KD_DISPATCH_TABLE *DispatchTable,
+ ULONG BootPhase
+);
+typedef
VOID
-KdGdbDebugPrint (LPSTR Message);
+(STDCALL*PKDP_PRINT_ROUTINE)(
+ LPSTR String,
+ ULONG Length
+);
+typedef
VOID
-KdDebugPrint (LPSTR Message);
+(STDCALL*PKDP_PROMPT_ROUTINE)(PCH String);
+typedef
KD_CONTINUE_TYPE
-KdEnterDebuggerException(PEXCEPTION_RECORD ExceptionRecord,
- PCONTEXT Context,
- PKTRAP_FRAME TrapFrame);
-VOID KdInitializeMda(VOID);
-VOID KdPrintMda(PCH pch);
-
-#ifndef KDBG
-#define KDB_DELETEPROCESS_HOOK(PROCESS)
-#define KDB_LOADDRIVER_HOOK(FILENAME, MODULE)
-#define KDB_UNLOADDRIVER_HOOK(MODULE)
-#define KDB_LOADERINIT_HOOK(NTOS, HAL)
-#define KDB_SYMBOLFILE_HOOK(LOADBASE, FILENAME, LENGTH)
-#else
-#define KDB_DELETEPROCESS_HOOK(PROCESS) KdbFreeSymbolsProcess(PROCESS)
-#define KDB_LOADDRIVER_HOOK(FILENAME, MODULE) KdbLoadDriver(FILENAME, MODULE)
-#define KDB_UNLOADDRIVER_HOOK(MODULE) KdbUnloadDriver(MODULE)
-#define KDB_LOADERINIT_HOOK(NTOS, HAL) KdbLdrInit(NTOS, HAL)
-#define KDB_SYMBOLFILE_HOOK(LOADBASE, FILENAME, LENGTH) \
- KdbProcessSymbolFile(LOADBASE, FILENAME, LENGTH)
-#endif /* KDBG */
+(STDCALL*PKDP_EXCEPTION_ROUTINE)(
+ PEXCEPTION_RECORD ExceptionRecord,
+ PCONTEXT Context,
+ PKTRAP_FRAME TrapFrame
+);
+
+/* INIT ROUTINES *************************************************************/
VOID
-KdbLdrLoadUserModuleSymbols(PLDR_MODULE LdrModule);
-VOID
-KdbProcessSymbolFile(PVOID ModuleLoadBase, PCHAR FileName, ULONG Length);
+STDCALL
+KdpScreenInit(
+ struct _KD_DISPATCH_TABLE *DispatchTable,
+ ULONG BootPhase
+);
+
VOID
-KdbLdrInit(MODULE_TEXT_SECTION* NtoskrnlTextSection,
- MODULE_TEXT_SECTION* LdrHalTextSection);
+STDCALL
+KdpSerialInit(
+ struct _KD_DISPATCH_TABLE *DispatchTable,
+ ULONG BootPhase
+);
+
VOID
-KdbUnloadDriver(PMODULE_OBJECT ModuleObject);
+STDCALL
+KdpInitDebugLog(
+ struct _KD_DISPATCH_TABLE *DispatchTable,
+ ULONG BootPhase
+);
+
VOID
-KdbLoadDriver(PUNICODE_STRING Filename, PMODULE_OBJECT Module);
+STDCALL
+KdpBochsInit(
+ struct _KD_DISPATCH_TABLE *DispatchTable,
+ ULONG BootPhase
+);
+
VOID
-KdbFreeSymbolsProcess(PEPROCESS Process);
-BOOLEAN
-KdbPrintAddress(PVOID address);
+STDCALL
+KdpGdbStubInit(
+ struct _KD_DISPATCH_TABLE *DispatchTable,
+ ULONG BootPhase);
+
+/* KD ROUTINES ***************************************************************/
+
KD_CONTINUE_TYPE
-KdbEnterDebuggerException(PEXCEPTION_RECORD ExceptionRecord,
- PCONTEXT Context,
- PKTRAP_FRAME TrapFrame);
+STDCALL
+KdpEnterDebuggerException(
+ PEXCEPTION_RECORD ExceptionRecord,
+ KPROCESSOR_MODE PreviousMode,
+ PCONTEXT Context,
+ PKTRAP_FRAME TrapFrame,
+ BOOLEAN FirstChance,
+ BOOLEAN Gdb
+);
+
+ULONG
+STDCALL
+KdpPrintString(
+ LPSTR String,
+ ULONG Length);
+
+BOOLEAN
+STDCALL
+KdpDetectConflicts(PCM_RESOURCE_LIST DriverList);
+
+VOID
+STDCALL
+KdpBochsDebugPrint(
+ IN PCH Message,
+ IN ULONG Length
+);
+
+/* 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 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;
+#endif
#endif /* __INCLUDE_INTERNAL_KERNEL_DEBUGGER_H */