-/* $Id$
- *
- * kernel debugger prototypes
- */
-
#ifndef __INCLUDE_INTERNAL_KERNEL_DEBUGGER_H
#define __INCLUDE_INTERNAL_KERNEL_DEBUGGER_H
+//
+// Kernel Debugger Port Definition
+//
+typedef struct _KD_PORT_INFORMATION
+{
+ ULONG ComPort;
+ ULONG BaudRate;
+ ULONG BaseAddress;
+} KD_PORT_INFORMATION, *PKD_PORT_INFORMATION;
+
struct _KD_DISPATCH_TABLE;
-#define KdPrintEx(_x_) DbgPrintEx _x_
+extern KD_PORT_INFORMATION GdbPortInfo;
-#ifdef DBG
-#include "kdgdb.h"
-#include "kdbochs.h"
-#endif
+BOOLEAN
+NTAPI
+KdPortInitialize(
+ PKD_PORT_INFORMATION PortInformation,
+ ULONG Unknown1,
+ ULONG Unknown2
+);
+
+BOOLEAN
+NTAPI
+KdPortInitializeEx(
+ PKD_PORT_INFORMATION PortInformation,
+ ULONG Unknown1,
+ ULONG Unknown2
+);
+
+BOOLEAN
+NTAPI
+KdPortGetByte(
+ PUCHAR ByteRecieved);
+
+BOOLEAN
+NTAPI
+KdPortGetByteEx(
+ PKD_PORT_INFORMATION PortInformation,
+ PUCHAR ByteRecieved);
+
+VOID
+NTAPI
+KdPortPutByte(
+ UCHAR ByteToSend
+);
+
+VOID
+NTAPI
+KdPortPutByteEx(
+ PKD_PORT_INFORMATION PortInformation,
+ UCHAR ByteToSend
+);
/* SYMBOL ROUTINES **********************************************************/
+#ifdef __NTOSKRNL__
#if defined(KDBG) || defined(DBG)
VOID
-KdbSymLoadUserModuleSymbols(IN PLDR_MODULE LdrModule);
+KdbSymLoadUserModuleSymbols(IN PLDR_DATA_TABLE_ENTRY LdrModule);
VOID
KdbSymFreeProcessSymbols(IN PEPROCESS Process);
VOID
-KdbSymLoadDriverSymbols(IN PUNICODE_STRING Filename,
- IN PMODULE_OBJECT Module);
+KdbSymLoadDriverSymbols(
+ IN PUNICODE_STRING Filename,
+ IN PLDR_DATA_TABLE_ENTRY Module
+);
VOID
-KdbSymUnloadDriverSymbols(IN PMODULE_OBJECT ModuleObject);
+KdbSymUnloadDriverSymbols(IN PLDR_DATA_TABLE_ENTRY ModuleObject);
VOID
KdbSymProcessBootSymbols(IN PCHAR FileName);
VOID
-KdbSymInit(IN PMODULE_TEXT_SECTION NtoskrnlTextSection,
- IN PMODULE_TEXT_SECTION LdrHalTextSection);
+KdbSymInit(
+ IN PLDR_DATA_TABLE_ENTRY NtoskrnlTextSection,
+ IN PLDR_DATA_TABLE_ENTRY LdrHalTextSection
+);
BOOLEAN
KdbSymPrintAddress(IN PVOID Address);
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);
+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
{
typedef
VOID
-(STDCALL*PKDP_INIT_ROUTINE)(struct _KD_DISPATCH_TABLE *DispatchTable,
- ULONG BootPhase);
+(STDCALL*PKDP_INIT_ROUTINE)(
+ struct _KD_DISPATCH_TABLE *DispatchTable,
+ ULONG BootPhase
+);
typedef
VOID
-(STDCALL*PKDP_PRINT_ROUTINE)(PCH String);
+(STDCALL*PKDP_PRINT_ROUTINE)(
+ LPSTR String,
+ ULONG Length
+);
typedef
VOID
typedef
KD_CONTINUE_TYPE
-(STDCALL*PKDP_EXCEPTION_ROUTINE)(PEXCEPTION_RECORD ExceptionRecord,
- PCONTEXT Context,
- PKTRAP_FRAME TrapFrame);
+(STDCALL*PKDP_EXCEPTION_ROUTINE)(
+ PEXCEPTION_RECORD ExceptionRecord,
+ PCONTEXT Context,
+ PKTRAP_FRAME TrapFrame
+);
/* INIT ROUTINES *************************************************************/
VOID
STDCALL
-KdpScreenInit(struct _KD_DISPATCH_TABLE *DispatchTable,
- ULONG BootPhase);
+KdpScreenInit(
+ struct _KD_DISPATCH_TABLE *DispatchTable,
+ ULONG BootPhase
+);
+
+VOID
+STDCALL
+KdpSerialInit(
+ struct _KD_DISPATCH_TABLE *DispatchTable,
+ ULONG BootPhase
+);
+
+VOID
+STDCALL
+KdpInitDebugLog(
+ struct _KD_DISPATCH_TABLE *DispatchTable,
+ ULONG BootPhase
+);
VOID
STDCALL
-KdpSerialInit(struct _KD_DISPATCH_TABLE *DispatchTable,
- ULONG BootPhase);
+KdpBochsInit(
+ struct _KD_DISPATCH_TABLE *DispatchTable,
+ ULONG BootPhase
+);
VOID
STDCALL
-KdpInitDebugLog(struct _KD_DISPATCH_TABLE *DispatchTable,
- ULONG BootPhase);
+KdpGdbStubInit(
+ struct _KD_DISPATCH_TABLE *DispatchTable,
+ ULONG BootPhase);
/* KD ROUTINES ***************************************************************/
KD_CONTINUE_TYPE
STDCALL
-KdpEnterDebuggerException(PEXCEPTION_RECORD ExceptionRecord,
- KPROCESSOR_MODE PreviousMode,
- PCONTEXT Context,
- PKTRAP_FRAME TrapFrame,
- BOOLEAN FirstChance,
- BOOLEAN Gdb);
+KdpEnterDebuggerException(
+ PEXCEPTION_RECORD ExceptionRecord,
+ KPROCESSOR_MODE PreviousMode,
+ PCONTEXT Context,
+ PKTRAP_FRAME TrapFrame,
+ BOOLEAN FirstChance,
+ BOOLEAN Gdb
+);
ULONG
STDCALL
-KdpPrintString(PANSI_STRING String);
+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 KdScreen 0
#define KdSerial 1
#define KdFile 2
-#define KdMax 3
+#define KdBochs 3
+#define KdMax 4
/* KD Private Debug Modes */
typedef struct _KDP_DEBUG_MODE
{
- union {
- struct {
+ 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;
- UCHAR Bochs :1;
};
/* Generic Value */
/* 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 */
+ 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 */
/* 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 */