1 #pragma once 2 #include "internal/kd.h" 3 4 /* TYPES *********************************************************************/ 5 6 /* from kdb.c */ 7 typedef CONTEXT KDB_KTRAP_FRAME, *PKDB_KTRAP_FRAME; 8 9 typedef enum _KDB_BREAKPOINT_TYPE 10 { 11 KdbBreakPointNone = 0, 12 KdbBreakPointSoftware, 13 KdbBreakPointHardware, 14 KdbBreakPointTemporary 15 } KDB_BREAKPOINT_TYPE; 16 17 typedef enum _KDB_ACCESS_TYPE 18 { 19 KdbAccessRead, 20 KdbAccessWrite, 21 KdbAccessReadWrite, 22 KdbAccessExec 23 } KDB_ACCESS_TYPE; 24 25 typedef struct _KDB_BREAKPOINT 26 { 27 KDB_BREAKPOINT_TYPE Type; /* Type of breakpoint */ 28 BOOLEAN Enabled; /* Whether the bp is enabled */ 29 ULONG_PTR Address; /* Address of the breakpoint */ 30 BOOLEAN Global; /* Whether the breakpoint is global or local to a process */ 31 PEPROCESS Process; /* Owning process */ 32 PCHAR ConditionExpression; 33 PVOID Condition; 34 union { 35 /* KdbBreakPointSoftware */ 36 UCHAR SavedInstruction; 37 /* KdbBreakPointHardware */ 38 struct { 39 UCHAR DebugReg : 2; 40 UCHAR Size : 3; 41 KDB_ACCESS_TYPE AccessType; 42 } Hw; 43 } Data; 44 } KDB_BREAKPOINT, *PKDB_BREAKPOINT; 45 46 typedef enum _KDB_ENTER_CONDITION 47 { 48 KdbDoNotEnter, 49 KdbEnterAlways, 50 KdbEnterFromKmode, 51 KdbEnterFromUmode 52 } KDB_ENTER_CONDITION; 53 54 /* These values MUST be nonzero. They're used as bit masks. */ 55 typedef enum _KDB_OUTPUT_SETTINGS 56 { 57 KD_DEBUG_KDSERIAL = 1, 58 KD_DEBUG_KDNOECHO = 2 59 } KDB_OUTPUT_SETTINGS; 60 61 /* FUNCTIONS *****************************************************************/ 62 63 /* from i386/i386-dis.c */ 64 65 LONG 66 KdbpDisassemble( 67 IN ULONG Address, 68 IN ULONG IntelSyntax); 69 70 LONG 71 KdbpGetInstLength( 72 IN ULONG Address); 73 74 /* from i386/kdb_help.S */ 75 76 VOID NTAPI 77 KdbpStackSwitchAndCall( 78 IN PVOID NewStack, 79 IN VOID (*Function)(VOID)); 80 81 /* from kdb_cli.c */ 82 83 extern PCHAR KdbInitFileBuffer; 84 85 BOOLEAN 86 NTAPI 87 KdbRegisterCliCallback( 88 PVOID Callback, 89 BOOLEAN Deregister); 90 91 VOID 92 KdbpCliInit(VOID); 93 94 VOID 95 KdbpCliMainLoop( 96 IN BOOLEAN EnteredOnSingleStep); 97 98 VOID 99 KdbpCliModuleLoaded( 100 IN PUNICODE_STRING Name); 101 102 VOID 103 KdbpCliInterpretInitFile(VOID); 104 105 VOID 106 KdbpPrint( 107 IN PCHAR Format, 108 IN ... OPTIONAL); 109 110 BOOLEAN 111 NTAPI 112 KdbpGetHexNumber( 113 IN PCHAR pszNum, 114 OUT ULONG_PTR *pulValue); 115 116 /* from kdb_expr.c */ 117 118 BOOLEAN 119 KdbpRpnEvaluateExpression( 120 IN PCHAR Expression, 121 IN PKDB_KTRAP_FRAME TrapFrame, 122 OUT PULONGLONG Result, 123 OUT PLONG ErrOffset OPTIONAL, 124 OUT PCHAR ErrMsg OPTIONAL); 125 126 PVOID 127 KdbpRpnParseExpression( 128 IN PCHAR Expression, 129 OUT PLONG ErrOffset OPTIONAL, 130 OUT PCHAR ErrMsg OPTIONAL); 131 132 BOOLEAN 133 KdbpRpnEvaluateParsedExpression( 134 IN PVOID Expression, 135 IN PKDB_KTRAP_FRAME TrapFrame, 136 OUT PULONGLONG Result, 137 OUT PLONG ErrOffset OPTIONAL, 138 OUT PCHAR ErrMsg OPTIONAL); 139 140 /* from kdb_symbols.c */ 141 142 BOOLEAN 143 KdbpSymFindModule( 144 IN PVOID Address OPTIONAL, 145 IN INT Index OPTIONAL, 146 OUT PLDR_DATA_TABLE_ENTRY* pLdrEntry); 147 148 BOOLEAN 149 KdbSymPrintAddress( 150 IN PVOID Address, 151 IN PCONTEXT Context 152 ); 153 154 VOID 155 KdbSymProcessSymbols( 156 _Inout_ PLDR_DATA_TABLE_ENTRY LdrEntry, 157 _In_ BOOLEAN Load); 158 159 /* from kdb.c */ 160 161 extern PEPROCESS KdbCurrentProcess; 162 extern PETHREAD KdbCurrentThread; 163 extern LONG KdbLastBreakPointNr; 164 extern ULONG KdbNumSingleSteps; 165 extern BOOLEAN KdbSingleStepOver; 166 extern PKDB_KTRAP_FRAME KdbCurrentTrapFrame; 167 extern ULONG KdbDebugState; 168 169 LONG 170 KdbpGetNextBreakPointNr( 171 IN ULONG Start OPTIONAL); 172 173 BOOLEAN 174 KdbpGetBreakPointInfo( 175 IN ULONG BreakPointNr, 176 OUT ULONG_PTR *Address OPTIONAL, 177 OUT KDB_BREAKPOINT_TYPE *Type OPTIONAL, 178 OUT UCHAR *Size OPTIONAL, 179 OUT KDB_ACCESS_TYPE *AccessType OPTIONAL, 180 OUT UCHAR *DebugReg OPTIONAL, 181 OUT BOOLEAN *Enabled OPTIONAL, 182 OUT BOOLEAN *Global OPTIONAL, 183 OUT PEPROCESS *Process OPTIONAL, 184 OUT PCHAR *ConditionExpression OPTIONAL); 185 186 NTSTATUS 187 KdbpInsertBreakPoint( 188 IN ULONG_PTR Address, 189 IN KDB_BREAKPOINT_TYPE Type, 190 IN UCHAR Size OPTIONAL, 191 IN KDB_ACCESS_TYPE AccessType OPTIONAL, 192 IN PCHAR ConditionExpression OPTIONAL, 193 IN BOOLEAN Global, 194 OUT PLONG BreakPointNr OPTIONAL); 195 196 BOOLEAN 197 KdbpDeleteBreakPoint( 198 IN LONG BreakPointNr OPTIONAL, 199 IN OUT PKDB_BREAKPOINT BreakPoint OPTIONAL); 200 201 BOOLEAN 202 KdbpEnableBreakPoint( 203 IN LONG BreakPointNr OPTIONAL, 204 IN OUT PKDB_BREAKPOINT BreakPoint OPTIONAL); 205 206 BOOLEAN 207 KdbpDisableBreakPoint( 208 IN LONG BreakPointNr OPTIONAL, 209 IN OUT PKDB_BREAKPOINT BreakPoint OPTIONAL); 210 211 BOOLEAN 212 KdbpGetEnterCondition( 213 IN LONG ExceptionNr, 214 IN BOOLEAN FirstChance, 215 OUT KDB_ENTER_CONDITION *Condition); 216 217 BOOLEAN 218 KdbpSetEnterCondition( 219 IN LONG ExceptionNr, 220 IN BOOLEAN FirstChance, 221 IN KDB_ENTER_CONDITION Condition); 222 223 BOOLEAN 224 KdbpAttachToThread( 225 PVOID ThreadId); 226 227 BOOLEAN 228 KdbpAttachToProcess( 229 PVOID ProcessId); 230 231 VOID 232 NTAPI 233 KdbpGetCommandLineSettings(PCHAR p1); 234 235 KD_CONTINUE_TYPE 236 KdbEnterDebuggerException(IN PEXCEPTION_RECORD64 ExceptionRecord, 237 IN KPROCESSOR_MODE PreviousMode, 238 IN OUT PCONTEXT Context, 239 IN BOOLEAN FirstChance); 240 241 KD_CONTINUE_TYPE 242 KdbEnterDebuggerFirstChanceException( 243 IN OUT PKTRAP_FRAME TrapFrame); 244 245 /* other functions */ 246 247 NTSTATUS 248 KdbpSafeReadMemory(OUT PVOID Dest, 249 IN PVOID Src, 250 IN ULONG Bytes); 251 252 NTSTATUS 253 KdbpSafeWriteMemory(OUT PVOID Dest, 254 IN PVOID Src, 255 IN ULONG Bytes); 256 257 #define KdbpGetCharKeyboard(ScanCode) KdbpTryGetCharKeyboard(ScanCode, 0) 258 CHAR 259 KdbpTryGetCharKeyboard(PULONG ScanCode, ULONG Retry); 260 261 #define KdbpGetCharSerial() KdbpTryGetCharSerial(0) 262 CHAR 263 KdbpTryGetCharSerial(ULONG Retry); 264 265 VOID 266 KdbEnter(VOID); 267 VOID 268 DbgRDebugInit(VOID); 269 VOID 270 DbgShowFiles(VOID); 271 VOID 272 DbgEnableFile(PCH Filename); 273 VOID 274 DbgDisableFile(PCH Filename); 275 VOID 276 KbdDisableMouse(VOID); 277 VOID 278 KbdEnableMouse(VOID); 279