1 #pragma once 2 #include "../kd/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 55 /* FUNCTIONS *****************************************************************/ 56 57 /* from i386/i386-dis.c */ 58 59 LONG 60 KdbpDisassemble( 61 IN ULONG_PTR Address, 62 IN ULONG IntelSyntax); 63 64 LONG 65 KdbpGetInstLength( 66 IN ULONG_PTR Address); 67 68 /* from i386/kdb_help.S */ 69 70 VOID NTAPI 71 KdbpStackSwitchAndCall( 72 IN PVOID NewStack, 73 IN VOID (*Function)(VOID)); 74 75 /* from kdb_cli.c */ 76 77 extern PCHAR KdbInitFileBuffer; 78 79 NTSTATUS 80 NTAPI 81 KdbInitialize( 82 _In_ PKD_DISPATCH_TABLE DispatchTable, 83 _In_ ULONG BootPhase); 84 85 BOOLEAN 86 NTAPI 87 KdbRegisterCliCallback( 88 PVOID Callback, 89 BOOLEAN Deregister); 90 91 NTSTATUS 92 KdbpCliInit(VOID); 93 94 VOID 95 KdbpCliMainLoop( 96 IN BOOLEAN EnteredOnSingleStep); 97 98 VOID 99 KdbpCliInterpretInitFile(VOID); 100 101 VOID 102 KdbpCommandHistoryAppend( 103 _In_ PCSTR Command); 104 105 PCSTR 106 KdbGetHistoryEntry( 107 _Inout_ PLONG NextIndex, 108 _In_ BOOLEAN Next); 109 110 VOID 111 KdbpPager( 112 _In_ PCHAR Buffer, 113 _In_ ULONG BufLength); 114 115 VOID 116 KdbpPrint( 117 _In_ PSTR Format, 118 _In_ ...); 119 120 VOID 121 KdbpPrintUnicodeString( 122 _In_ PCUNICODE_STRING String); 123 124 BOOLEAN 125 NTAPI 126 KdbpGetHexNumber( 127 IN PCHAR pszNum, 128 OUT ULONG_PTR *pulValue); 129 130 /* from kdb_expr.c */ 131 132 BOOLEAN 133 KdbpRpnEvaluateExpression( 134 IN PCHAR Expression, 135 IN PKDB_KTRAP_FRAME TrapFrame, 136 OUT PULONGLONG Result, 137 OUT PLONG ErrOffset OPTIONAL, 138 OUT PCHAR ErrMsg OPTIONAL); 139 140 PVOID 141 KdbpRpnParseExpression( 142 IN PCHAR Expression, 143 OUT PLONG ErrOffset OPTIONAL, 144 OUT PCHAR ErrMsg OPTIONAL); 145 146 BOOLEAN 147 KdbpRpnEvaluateParsedExpression( 148 IN PVOID Expression, 149 IN PKDB_KTRAP_FRAME TrapFrame, 150 OUT PULONGLONG Result, 151 OUT PLONG ErrOffset OPTIONAL, 152 OUT PCHAR ErrMsg OPTIONAL); 153 154 /* from kdb_symbols.c */ 155 156 BOOLEAN 157 KdbpSymFindModule( 158 IN PVOID Address OPTIONAL, 159 IN INT Index OPTIONAL, 160 OUT PLDR_DATA_TABLE_ENTRY* pLdrEntry); 161 162 BOOLEAN 163 KdbSymPrintAddress( 164 IN PVOID Address, 165 IN PCONTEXT Context); 166 167 VOID 168 KdbSymProcessSymbols( 169 _Inout_ PLDR_DATA_TABLE_ENTRY LdrEntry, 170 _In_ BOOLEAN Load); 171 172 BOOLEAN 173 KdbSymInit( 174 _In_ ULONG BootPhase); 175 176 /* from kdb.c */ 177 178 extern PEPROCESS KdbCurrentProcess; 179 extern PETHREAD KdbCurrentThread; 180 extern LONG KdbLastBreakPointNr; 181 extern ULONG KdbNumSingleSteps; 182 extern BOOLEAN KdbSingleStepOver; 183 extern PKDB_KTRAP_FRAME KdbCurrentTrapFrame; 184 185 LONG 186 KdbpGetNextBreakPointNr( 187 IN ULONG Start OPTIONAL); 188 189 BOOLEAN 190 KdbpGetBreakPointInfo( 191 IN ULONG BreakPointNr, 192 OUT ULONG_PTR *Address OPTIONAL, 193 OUT KDB_BREAKPOINT_TYPE *Type OPTIONAL, 194 OUT UCHAR *Size OPTIONAL, 195 OUT KDB_ACCESS_TYPE *AccessType OPTIONAL, 196 OUT UCHAR *DebugReg OPTIONAL, 197 OUT BOOLEAN *Enabled OPTIONAL, 198 OUT BOOLEAN *Global OPTIONAL, 199 OUT PEPROCESS *Process OPTIONAL, 200 OUT PCHAR *ConditionExpression OPTIONAL); 201 202 NTSTATUS 203 KdbpInsertBreakPoint( 204 IN ULONG_PTR Address, 205 IN KDB_BREAKPOINT_TYPE Type, 206 IN UCHAR Size OPTIONAL, 207 IN KDB_ACCESS_TYPE AccessType OPTIONAL, 208 IN PCHAR ConditionExpression OPTIONAL, 209 IN BOOLEAN Global, 210 OUT PLONG BreakPointNr OPTIONAL); 211 212 BOOLEAN 213 KdbpDeleteBreakPoint( 214 IN LONG BreakPointNr OPTIONAL, 215 IN OUT PKDB_BREAKPOINT BreakPoint OPTIONAL); 216 217 BOOLEAN 218 KdbpEnableBreakPoint( 219 IN LONG BreakPointNr OPTIONAL, 220 IN OUT PKDB_BREAKPOINT BreakPoint OPTIONAL); 221 222 BOOLEAN 223 KdbpDisableBreakPoint( 224 IN LONG BreakPointNr OPTIONAL, 225 IN OUT PKDB_BREAKPOINT BreakPoint OPTIONAL); 226 227 BOOLEAN 228 KdbpGetEnterCondition( 229 IN LONG ExceptionNr, 230 IN BOOLEAN FirstChance, 231 OUT KDB_ENTER_CONDITION *Condition); 232 233 BOOLEAN 234 KdbpSetEnterCondition( 235 IN LONG ExceptionNr, 236 IN BOOLEAN FirstChance, 237 IN KDB_ENTER_CONDITION Condition); 238 239 BOOLEAN 240 KdbpAttachToThread( 241 PVOID ThreadId); 242 243 BOOLEAN 244 KdbpAttachToProcess( 245 PVOID ProcessId); 246 247 VOID 248 KdbpGetCommandLineSettings( 249 _In_ PCSTR p1); 250 251 KD_CONTINUE_TYPE 252 KdbEnterDebuggerException(IN PEXCEPTION_RECORD64 ExceptionRecord, 253 IN KPROCESSOR_MODE PreviousMode, 254 IN OUT PCONTEXT Context, 255 IN BOOLEAN FirstChance); 256 257 /* other functions */ 258 259 BOOLEAN 260 NTAPI 261 KdpSafeReadMemory( 262 IN ULONG_PTR Addr, 263 IN LONG Len, 264 OUT PVOID Value 265 ); 266 267 BOOLEAN 268 NTAPI 269 KdpSafeWriteMemory( 270 IN ULONG_PTR Addr, 271 IN LONG Len, 272 IN ULONGLONG Value 273 ); 274 275 NTSTATUS 276 KdbpSafeReadMemory(OUT PVOID Dest, 277 IN PVOID Src, 278 IN ULONG Bytes); 279 280 NTSTATUS 281 KdbpSafeWriteMemory(OUT PVOID Dest, 282 IN PVOID Src, 283 IN ULONG Bytes); 284 285 VOID 286 KbdDisableMouse(VOID); 287 288 VOID 289 KbdEnableMouse(VOID); 290