1 #pragma once 2 3 #include <cportlib/cportlib.h> 4 5 // 6 // Kernel Debugger Port Definition 7 // 8 struct _KD_DISPATCH_TABLE; 9 extern CPPORT GdbPortInfo; 10 extern BOOLEAN KdBreakAfterSymbolLoad; 11 extern BOOLEAN KdPitchDebugger; 12 extern BOOLEAN KdIgnoreUmExceptions; 13 14 BOOLEAN 15 NTAPI 16 KdPortInitializeEx( 17 PCPPORT PortInformation, 18 ULONG ComPortNumber 19 ); 20 21 BOOLEAN 22 NTAPI 23 KdPortGetByteEx( 24 PCPPORT PortInformation, 25 PUCHAR ByteReceived); 26 27 VOID 28 NTAPI 29 KdPortPutByteEx( 30 PCPPORT PortInformation, 31 UCHAR ByteToSend 32 ); 33 34 /* SYMBOL ROUTINES **********************************************************/ 35 #ifdef __NTOSKRNL__ 36 37 #if defined(KDBG) || DBG 38 39 #if defined(KDBG) 40 typedef 41 BOOLEAN 42 (NTAPI *PKDBG_CLI_ROUTINE)( 43 IN PCHAR Command, 44 IN ULONG Argc, 45 IN PCH Argv[]); 46 47 BOOLEAN 48 NTAPI 49 KdbRegisterCliCallback( 50 PVOID Callback, 51 BOOLEAN Deregister); 52 #endif 53 54 VOID 55 KdbSymProcessSymbols( 56 IN PLDR_DATA_TABLE_ENTRY LdrEntry); 57 58 59 BOOLEAN 60 KdbSymPrintAddress( 61 IN PVOID Address, 62 IN PKTRAP_FRAME Context 63 ); 64 65 NTSTATUS 66 KdbSymGetAddressInformation( 67 IN PROSSYM_INFO RosSymInfo, 68 IN ULONG_PTR RelativeAddress, 69 #ifdef __ROS_DWARF__ 70 IN PROSSYM_LINEINFO RosSymLineInfo 71 #else 72 OUT PULONG LineNumber OPTIONAL, 73 OUT PCH FileName OPTIONAL, 74 OUT PCH FunctionName OPTIONAL 75 #endif 76 ); 77 #endif 78 79 #ifdef KDBG 80 # define KdbInit() KdbpCliInit() 81 # define KdbModuleLoaded(FILENAME) KdbpCliModuleLoaded(FILENAME) 82 #else 83 # define KdbEnterDebuggerException(ER, PM, C, TF, F) kdHandleException 84 # define KdbInit() do { } while (0) 85 # define KdbEnter() do { } while (0) 86 # define KdbModuleLoaded(X) do { } while (0) 87 #endif 88 89 /* KD ROUTINES ***************************************************************/ 90 91 typedef enum _KD_CONTINUE_TYPE 92 { 93 kdContinue = 0, 94 kdDoNotHandleException, 95 kdHandleException 96 } 97 KD_CONTINUE_TYPE; 98 99 typedef 100 VOID 101 (NTAPI*PKDP_INIT_ROUTINE)( 102 struct _KD_DISPATCH_TABLE *DispatchTable, 103 ULONG BootPhase 104 ); 105 106 typedef 107 VOID 108 (NTAPI*PKDP_PRINT_ROUTINE)( 109 LPSTR String, 110 ULONG Length 111 ); 112 113 typedef 114 VOID 115 (NTAPI*PKDP_PROMPT_ROUTINE)(PCH String); 116 117 typedef 118 KD_CONTINUE_TYPE 119 (NTAPI*PKDP_EXCEPTION_ROUTINE)( 120 PEXCEPTION_RECORD ExceptionRecord, 121 PCONTEXT Context, 122 PKTRAP_FRAME TrapFrame 123 ); 124 125 BOOLEAN 126 NTAPI 127 KdIsThisAKdTrap( 128 IN PEXCEPTION_RECORD ExceptionRecord, 129 IN PCONTEXT Context, 130 IN KPROCESSOR_MODE PreviousMode 131 ); 132 133 /* INIT ROUTINES *************************************************************/ 134 135 BOOLEAN 136 NTAPI 137 KdInitSystem( 138 ULONG Reserved, 139 PLOADER_PARAMETER_BLOCK LoaderBlock 140 ); 141 142 VOID 143 NTAPI 144 KdpScreenInit( 145 struct _KD_DISPATCH_TABLE *DispatchTable, 146 ULONG BootPhase 147 ); 148 149 VOID 150 NTAPI 151 KdpSerialInit( 152 struct _KD_DISPATCH_TABLE *DispatchTable, 153 ULONG BootPhase 154 ); 155 156 VOID 157 NTAPI 158 KdpInitDebugLog( 159 struct _KD_DISPATCH_TABLE *DispatchTable, 160 ULONG BootPhase 161 ); 162 163 VOID 164 NTAPI 165 KdpBochsInit( 166 struct _KD_DISPATCH_TABLE *DispatchTable, 167 ULONG BootPhase 168 ); 169 170 VOID 171 NTAPI 172 KdpGdbStubInit( 173 struct _KD_DISPATCH_TABLE *DispatchTable, 174 ULONG BootPhase); 175 176 VOID 177 NTAPI 178 KdpKdbgInit( 179 struct _KD_DISPATCH_TABLE *DispatchTable, 180 ULONG BootPhase); 181 182 183 /* KD ROUTINES ***************************************************************/ 184 185 ULONG 186 NTAPI 187 KdpPrintString( 188 _In_reads_bytes_(Length) PCHAR UnsafeString, 189 _In_ ULONG Length, 190 _In_ KPROCESSOR_MODE PreviousMode); 191 192 BOOLEAN 193 NTAPI 194 KdpDetectConflicts(PCM_RESOURCE_LIST DriverList); 195 196 VOID 197 NTAPI 198 KdpBochsDebugPrint( 199 IN PCH Message, 200 IN ULONG Length 201 ); 202 203 BOOLEAN 204 NTAPI 205 KdpSafeReadMemory( 206 IN ULONG_PTR Addr, 207 IN LONG Len, 208 OUT PVOID Value 209 ); 210 211 BOOLEAN 212 NTAPI 213 KdpSafeWriteMemory( 214 IN ULONG_PTR Addr, 215 IN LONG Len, 216 IN ULONGLONG Value 217 ); 218 219 VOID 220 NTAPI 221 KdpEnableSafeMem(VOID); 222 223 224 /* KD GLOBALS ***************************************************************/ 225 226 typedef 227 BOOLEAN 228 (NTAPI *PKDEBUG_ROUTINE)( 229 IN PKTRAP_FRAME TrapFrame, 230 IN PKEXCEPTION_FRAME ExceptionFrame, 231 IN PEXCEPTION_RECORD ExceptionRecord, 232 IN PCONTEXT Context, 233 IN KPROCESSOR_MODE PreviousMode, 234 IN BOOLEAN SecondChance 235 ); 236 237 /* serial debug connection */ 238 #define DEFAULT_DEBUG_PORT 2 /* COM2 */ 239 #define DEFAULT_DEBUG_COM1_IRQ 4 /* COM1 IRQ */ 240 #define DEFAULT_DEBUG_COM2_IRQ 3 /* COM2 IRQ */ 241 #define DEFAULT_DEBUG_BAUD_RATE 115200 /* 115200 Baud */ 242 243 /* KD Native Modes */ 244 #define KdScreen 0 245 #define KdSerial 1 246 #define KdFile 2 247 #define KdBochs 3 248 #define KdKdbg 4 249 #define KdMax 5 250 251 /* KD Private Debug Modes */ 252 typedef struct _KDP_DEBUG_MODE 253 { 254 union 255 { 256 struct 257 { 258 /* Native Modes */ 259 UCHAR Screen :1; 260 UCHAR Serial :1; 261 UCHAR File :1; 262 UCHAR Bochs :1; 263 264 /* Currently Supported Wrappers */ 265 UCHAR Pice :1; 266 UCHAR Gdb :1; 267 }; 268 269 /* Generic Value */ 270 ULONG Value; 271 }; 272 } 273 KDP_DEBUG_MODE; 274 275 /* KD Internal Debug Services */ 276 typedef enum _KDP_DEBUG_SERVICE 277 { 278 DumpNonPagedPool = 0x1e, /* a */ 279 ManualBugCheck = 0x30, /* b */ 280 DumpNonPagedPoolStats = 0x2e, /* c */ 281 DumpNewNonPagedPool = 0x20, /* d */ 282 DumpNewNonPagedPoolStats = 0x12, /* e */ 283 DumpAllThreads = 0x21, /* f */ 284 DumpUserThreads = 0x22, /* g */ 285 KdSpare1 = 0x23, /* h */ 286 KdSpare2 = 0x17, /* i */ 287 KdSpare3 = 0x24, /* j */ 288 EnterDebugger = 0x25, /* k */ 289 ThatsWhatSheSaid = 69 /* FIGURE IT OUT */ 290 } 291 KDP_DEBUG_SERVICE; 292 293 /* Dispatch Table for Wrapper Functions */ 294 typedef struct _KD_DISPATCH_TABLE 295 { 296 LIST_ENTRY KdProvidersList; 297 PKDP_INIT_ROUTINE KdpInitRoutine; 298 PKDP_PRINT_ROUTINE KdpPrintRoutine; 299 PKDP_PROMPT_ROUTINE KdpPromptRoutine; 300 PKDP_EXCEPTION_ROUTINE KdpExceptionRoutine; 301 } 302 KD_DISPATCH_TABLE, *PKD_DISPATCH_TABLE; 303 304 /* The current Debugging Mode */ 305 extern KDP_DEBUG_MODE KdpDebugMode; 306 307 /* The current Port IRQ */ 308 extern ULONG KdpPortIrq; 309 310 /* The current Port */ 311 extern ULONG KdpPort; 312 313 /* Port Information for the Serial Native Mode */ 314 extern ULONG SerialPortNumber; 315 extern CPPORT SerialPortInfo; 316 317 /* Init Functions for Native Providers */ 318 extern PKDP_INIT_ROUTINE InitRoutines[KdMax]; 319 320 /* Wrapper Init Function */ 321 extern PKDP_INIT_ROUTINE WrapperInitRoutine; 322 323 /* Dispatch Tables for Native Providers */ 324 extern KD_DISPATCH_TABLE DispatchTable[KdMax]; 325 326 /* Dispatch Table for the Wrapper */ 327 extern KD_DISPATCH_TABLE WrapperTable; 328 329 /* The KD Native Provider List */ 330 extern LIST_ENTRY KdProviders; 331 332 extern PKDEBUG_ROUTINE KiDebugRoutine; 333 extern KD_CONTEXT KdpContext; 334 extern ULONG Kd_WIN2000_Mask; 335 336 #endif 337 338 #if DBG && defined(_M_IX86) && !defined(_WINKD_) // See ke/i386/traphdlr.c 339 #define ID_Win32PreServiceHook 'WSH0' 340 #define ID_Win32PostServiceHook 'WSH1' 341 typedef void (NTAPI *PKDBG_PRESERVICEHOOK)(ULONG, PULONG_PTR); 342 typedef ULONG_PTR (NTAPI *PKDBG_POSTSERVICEHOOK)(ULONG, ULONG_PTR); 343 extern PKDBG_PRESERVICEHOOK KeWin32PreServiceHook; 344 extern PKDBG_POSTSERVICEHOOK KeWin32PostServiceHook; 345 #endif 346