ReactOS  0.4.12-dev-919-gfc3b8d5
kdmain.c
Go to the documentation of this file.
1 /*
2  * COPYRIGHT: See COPYING in the top level directory
3  * PROJECT: ReactOS Kernel
4  * FILE: ntoskrnl/kd/kdmain.c
5  * PURPOSE: Kernel Debugger Initialization
6  *
7  * PROGRAMMERS: Alex Ionescu (alex@relsoft.net)
8  */
9 
10 #include <ntoskrnl.h>
11 #define NDEBUG
12 #include <debug.h>
13 
14 /* VARIABLES ***************************************************************/
15 
25 VOID NTAPI PspDumpThreads(BOOLEAN SystemThreads);
26 
27 typedef struct
28 {
32 #define MAX_KD_COMPONENT_TABLE_ENTRIES 128
35 
37 
38 /* PRIVATE FUNCTIONS *********************************************************/
39 
40 ULONG
41 NTAPI
43  PVOID Buffer1,
44  ULONG Buffer1Length,
46 {
47  ULONG Result = 0;
48 
49  switch (Service)
50  {
51  case BREAKPOINT_PRINT: /* DbgPrint */
52  Result = KdpPrintString(Buffer1, Buffer1Length, PreviousMode);
53  break;
54 
55 #if DBG
56  case ' soR': /* ROS-INTERNAL */
57  {
58  switch ((ULONG_PTR)Buffer1)
59  {
60  case DumpAllThreads:
62  break;
63 
64  case DumpUserThreads:
66  break;
67 
68  case KdSpare3:
70  break;
71 
72  default:
73  break;
74  }
75  break;
76  }
77 
78 #if defined(_M_IX86) && !defined(_WINKD_) // See ke/i386/traphdlr.c
79  /* Register a debug callback */
80  case 'CsoR':
81  {
82  switch (Buffer1Length)
83  {
84  case ID_Win32PreServiceHook:
85  KeWin32PreServiceHook = Buffer1;
86  break;
87 
88  case ID_Win32PostServiceHook:
89  KeWin32PostServiceHook = Buffer1;
90  break;
91 
92  }
93  break;
94  }
95 #endif
96 
97  /* Special case for stack frame dumps */
98  case 'DsoR':
99  {
100  KeRosDumpStackFrames((PULONG)Buffer1, Buffer1Length);
101  break;
102  }
103 
104 #if defined(KDBG)
105  /* Register KDBG CLI callback */
106  case 'RbdK':
107  {
108  Result = KdbRegisterCliCallback(Buffer1, Buffer1Length);
109  break;
110  }
111 #endif /* KDBG */
112 #endif /* DBG */
113  default:
114  DPRINT1("Invalid debug service call!\n");
115  HalDisplayString("Invalid debug service call!\r\n");
116  break;
117  }
118 
119  return Result;
120 }
121 
122 BOOLEAN
123 NTAPI
125  IN PKEXCEPTION_FRAME ExceptionFrame,
126  IN PEXCEPTION_RECORD ExceptionRecord,
129  IN BOOLEAN SecondChance)
130 {
131  KD_CONTINUE_TYPE Return = kdHandleException;
132  ULONG ExceptionCommand = ExceptionRecord->ExceptionInformation[0];
133 
134  /* Check if this was a breakpoint due to DbgPrint or Load/UnloadSymbols */
135  if ((ExceptionRecord->ExceptionCode == STATUS_BREAKPOINT) &&
136  (ExceptionRecord->NumberParameters > 0) &&
137  ((ExceptionCommand == BREAKPOINT_LOAD_SYMBOLS) ||
138  (ExceptionCommand == BREAKPOINT_UNLOAD_SYMBOLS) ||
139  (ExceptionCommand == BREAKPOINT_COMMAND_STRING) ||
140  (ExceptionCommand == BREAKPOINT_PRINT) ||
141  (ExceptionCommand == BREAKPOINT_PROMPT)))
142  {
143  /* Check if this is a debug print */
144  if (ExceptionCommand == BREAKPOINT_PRINT)
145  {
146  /* Print the string */
148  (PVOID)ExceptionRecord->ExceptionInformation[1],
149  ExceptionRecord->ExceptionInformation[2],
150  PreviousMode);
151 
152  /* Return success */
154  }
155 #ifdef KDBG
156  else if (ExceptionCommand == BREAKPOINT_LOAD_SYMBOLS)
157  {
158  PKD_SYMBOLS_INFO SymbolsInfo;
159  KD_SYMBOLS_INFO CapturedSymbolsInfo;
160  PLDR_DATA_TABLE_ENTRY LdrEntry;
161 
162  SymbolsInfo = (PKD_SYMBOLS_INFO)ExceptionRecord->ExceptionInformation[2];
164  {
165  _SEH2_TRY
166  {
167  ProbeForRead(SymbolsInfo,
168  sizeof(*SymbolsInfo),
169  1);
170  RtlCopyMemory(&CapturedSymbolsInfo,
171  SymbolsInfo,
172  sizeof(*SymbolsInfo));
173  SymbolsInfo = &CapturedSymbolsInfo;
174  }
176  {
177  SymbolsInfo = NULL;
178  }
179  _SEH2_END;
180  }
181 
182  if (SymbolsInfo != NULL)
183  {
184  /* Load symbols. Currently implemented only for KDBG! */
185  if (KdbpSymFindModule(SymbolsInfo->BaseOfDll, NULL, -1, &LdrEntry))
186  {
187  KdbSymProcessSymbols(LdrEntry);
188  }
189  }
190  }
191  else if (ExceptionCommand == BREAKPOINT_PROMPT)
192  {
194  LPSTR OutString;
195  USHORT OutStringLength;
196 
197  /* Get the response string and length */
198  OutString = (LPSTR)Context->Ebx;
199  OutStringLength = (USHORT)Context->Edi;
200 
201  /* Call KDBG */
202  ReturnValue = KdpPrompt((LPSTR)ExceptionRecord->
203  ExceptionInformation[1],
204  (USHORT)ExceptionRecord->
205  ExceptionInformation[2],
206  OutString,
207  OutStringLength,
208  PreviousMode);
209 
210  /* Return the number of characters that we received */
211  Context->Eax = ReturnValue;
212  }
213 #endif
214 
215  /* This we can handle: simply bump the Program Counter */
217  return TRUE;
218  }
219 
220 #ifdef KDBG
221  /* Check if this is an assertion failure */
222  if (ExceptionRecord->ExceptionCode == STATUS_ASSERTION_FAILURE)
223  {
224  /* Bump EIP to the instruction following the int 2C */
225  Context->Eip += 2;
226  }
227 #endif
228 
229  /* Get out of here if the Debugger isn't connected */
230  if (KdDebuggerNotPresent) return FALSE;
231 
232 #ifdef KDBG
233  /* Call KDBG if available */
234  Return = KdbEnterDebuggerException(ExceptionRecord,
235  PreviousMode,
236  Context,
237  TrapFrame,
238  !SecondChance);
239 #else /* not KDBG */
240  if (WrapperInitRoutine)
241  {
242  /* Call GDB */
243  Return = WrapperTable.KdpExceptionRoutine(ExceptionRecord,
244  Context,
245  TrapFrame);
246  }
247 #endif /* not KDBG */
248 
249  /* Debugger didn't handle it, please handle! */
250  if (Return == kdHandleException) return FALSE;
251 
252  /* Debugger handled it */
253  return TRUE;
254 }
255 
256 BOOLEAN
257 NTAPI
259  IN PEXCEPTION_RECORD ExceptionRecord,
261 {
262  KD_CONTINUE_TYPE Return = kdDoNotHandleException;
263 
264  /* Get out of here if the Debugger isn't connected */
265  if (KdDebuggerNotPresent) return FALSE;
266 
267  /* FIXME:
268  * Right now, the GDB wrapper seems to handle exceptions differntly
269  * from KDGB and both are called at different times, while the GDB
270  * one is only called once and that's it. I don't really have the knowledge
271  * to fix the GDB stub, so until then, we'll be using this hack
272  */
273  if (WrapperInitRoutine)
274  {
275  Return = WrapperTable.KdpExceptionRoutine(ExceptionRecord,
276  Context,
277  TrapFrame);
278  }
279 
280  /* Debugger didn't handle it, please handle! */
281  if (Return == kdHandleException) return FALSE;
282 
283  /* Debugger handled it */
284  return TRUE;
285 }
286 
287 BOOLEAN
288 NTAPI
292 {
293  /* KDBG has its own mechanism for ignoring user mode exceptions */
294  return FALSE;
295 }
296 
297 /* PUBLIC FUNCTIONS *********************************************************/
298 
299 /*
300  * @implemented
301  */
302 BOOLEAN
303 NTAPI
305 {
307 
308  /* Just return whatever was set previously -- FIXME! */
309  return KdDebuggerNotPresent;
310 }
311 
312 /*
313  * @implemented
314  */
315 NTSTATUS
316 NTAPI
318 {
319  KIRQL OldIrql;
320 
321  /* Raise IRQL */
323 
324  /* TODO: Disable any breakpoints */
325 
326  /* Disable the Debugger */
328  SharedUserData->KdDebuggerEnabled = FALSE;
329 
330  /* Lower the IRQL */
332 
333  /* Return success */
334  return STATUS_SUCCESS;
335 }
336 
337 /*
338  * @implemented
339  */
340 NTSTATUS
341 NTAPI
343 {
344  KIRQL OldIrql;
345 
346  /* Raise IRQL */
348 
349  /* TODO: Re-enable any breakpoints */
350 
351  /* Enable the Debugger */
353  SharedUserData->KdDebuggerEnabled = TRUE;
354 
355  /* Lower the IRQL */
357 
358  /* Return success */
359  return STATUS_SUCCESS;
360 }
361 
362 /*
363  * @implemented
364  */
365 BOOLEAN
366 NTAPI
368 {
369  return KdpBreakPending;
370 }
371 
372 /*
373  * @unimplemented
374  */
375 NTSTATUS
376 NTAPI
378 {
380  return STATUS_NOT_IMPLEMENTED;
381 }
382 
383 /*
384  * @unimplemented
385  */
386 NTSTATUS
387 NTAPI
389  IN ULONG InBufferLength OPTIONAL,
390  IN PVOID InBuffer,
391  IN ULONG OutBufferLength OPTIONAL,
392  OUT PVOID OutBuffer,
393  OUT PULONG OutBufferRequiredLength OPTIONAL)
394 {
396  return STATUS_NOT_IMPLEMENTED;
397 }
398 
399 
400 NTSTATUS
401 NTAPI
403  IN ULONG Level)
404 {
405  ULONG i;
406 
407  /* Convert Level to mask if it isn't already one */
408  if (Level < 32)
409  Level = 1 << Level;
410 
411  /* Check if it is not the default component */
412  if (ComponentId != MAXULONG)
413  {
414  /* No, search for an existing entry in the table */
415  for (i = 0; i < KdComponentTableEntries; i++)
416  {
417  /* Check if it is the right component */
419  {
420  /* Check if mask are matching */
421  return (Level & KdComponentTable[i].Level) ? TRUE : FALSE;
422  }
423  }
424  }
425 
426  /* Entry not found in the table, use default mask */
427  return (Level & Kd_DEFAULT_MASK) ? TRUE : FALSE;
428 }
429 
430 NTSTATUS
431 NTAPI
433  IN ULONG Level,
434  IN BOOLEAN State)
435 {
436  ULONG i;
437 
438  /* Convert Level to mask if it isn't already one */
439  if (Level < 32)
440  Level = 1 << Level;
441  Level &= ~DPFLTR_MASK;
442 
443  /* Check if it is the default component */
444  if (ComponentId == MAXULONG)
445  {
446  /* Yes, modify the default mask */
447  if (State)
449  else
451 
452  return STATUS_SUCCESS;
453  }
454 
455  /* Search for an existing entry */
456  for (i = 0; i < KdComponentTableEntries; i++ )
457  {
459  break;
460  }
461 
462  /* Check if we have found an existing entry */
463  if (i == KdComponentTableEntries)
464  {
465  /* Check if we have enough space in the table */
468 
469  /* Add a new entry */
473  }
474 
475  /* Update entry table */
476  if (State)
478  else
480 
481  return STATUS_SUCCESS;
482 }
483 
484 /*
485  * @unimplemented
486  */
487 NTSTATUS
488 NTAPI
496 {
497  /* HACK */
499  InputBuffer,
501  PreviousMode);
502 }
503 
505 
506  /* EOF */
BOOLEAN KdEnteredDebugger
Definition: kdmain.c:17
ULONG Kd_WIN2000_Mask
Definition: kdmain.c:24
IN CINT OUT PVOID IN ULONG OUT PULONG ReturnLength
Definition: dumpinfo.c:39
#define KeRosDumpStackFrames(Frames, Count)
Definition: gdidebug.h:11
KD_COMPONENT_DATA KdComponentTable[MAX_KD_COMPONENT_TABLE_ENTRIES]
Definition: kdmain.c:33
#define IN
Definition: typedefs.h:38
BOOLEAN NTAPI KdpCallGdb(IN PKTRAP_FRAME TrapFrame, IN PEXCEPTION_RECORD ExceptionRecord, IN PCONTEXT Context)
Definition: kdmain.c:258
#define KeRaiseIrql(irql, oldIrql)
Definition: env_spec_w32.h:597
#define TRUE
Definition: types.h:120
NTSYSAPI VOID NTAPI RtlCopyMemory(VOID UNALIGNED *Destination, CONST VOID UNALIGNED *Source, ULONG Length)
_In_ UCHAR _In_ POWER_STATE PowerState
Definition: pofuncs.h:42
#define KeLowerIrql(oldIrql)
Definition: env_spec_w32.h:602
#define STATUS_NOT_IMPLEMENTED
Definition: ntstatus.h:225
NTSTATUS NTAPI KdDisableDebugger(VOID)
Definition: kdmain.c:317
struct _KD_SYMBOLS_INFO * PKD_SYMBOLS_INFO
VOID NTAPI MmDumpArmPfnDatabase(IN BOOLEAN StatusOnly)
Definition: mminit.c:1474
#define KeSetContextReturnRegister(Context, ReturnValue)
Definition: ke.h:139
LONG NTSTATUS
Definition: precomp.h:26
ULONG NTAPI KdpServiceDispatcher(ULONG Service, PVOID Buffer1, ULONG Buffer1Length, KPROCESSOR_MODE PreviousMode)
Definition: kdmain.c:42
USHORT NTAPI KdpPrompt(IN LPSTR PromptString, IN USHORT PromptLength, OUT LPSTR ResponseString, IN USHORT MaximumResponseLength, IN KPROCESSOR_MODE PreviousMode, IN PKTRAP_FRAME TrapFrame, IN PKEXCEPTION_FRAME ExceptionFrame)
#define DPFLTR_MASK
Definition: kdtypes.h:34
_Must_inspect_result_ _In_ PFILE_OBJECT _In_ ULONG _In_ ULONG _In_ ULONG OutputBufferLength
Definition: fltkernel.h:1374
VOID NTAPI PspDumpThreads(BOOLEAN SystemThreads)
_IRQL_requires_same_ typedef _In_ ULONG _In_ UCHAR Level
Definition: wmitypes.h:55
ACPI_BUFFER *RetBuffer ACPI_BUFFER *RetBuffer char ACPI_WALK_RESOURCE_CALLBACK void *Context ACPI_BUFFER *RetBuffer UINT16 ACPI_RESOURCE **ResourcePtr ACPI_GENERIC_ADDRESS *Reg UINT32 *ReturnValue UINT8 UINT8 *Slp_TypB ACPI_PHYSICAL_ADDRESS PhysicalAddress64 UINT32 UINT32 *TimeElapsed UINT32 ACPI_STATUS const char UINT32 ACPI_STATUS const char UINT32 const char const char UINT32 ComponentId
Definition: acpixf.h:1252
Definition: shell.h:41
char * LPSTR
Definition: xmlstorage.h:182
CHAR InputBuffer[80]
Definition: conmgr.c:33
NTSTATUS NTAPI KdPowerTransition(ULONG PowerState)
Definition: kdmain.c:377
_SEH2_TRY
Definition: create.c:4250
uint32_t ULONG_PTR
Definition: typedefs.h:63
UCHAR KIRQL
Definition: env_spec_w32.h:591
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
BOOLEAN NTAPI KdIsThisAKdTrap(IN PEXCEPTION_RECORD ExceptionRecord, IN PCONTEXT Context, IN KPROCESSOR_MODE PreviousMode)
Definition: kdmain.c:289
UINT32 void void ** ReturnValue
Definition: acevents.h:213
NTSTATUS(* NTAPI)(IN PFILE_FULL_EA_INFORMATION EaBuffer, IN ULONG EaLength, OUT PULONG ErrorOffset)
Definition: IoEaTest.cpp:117
#define MAX_KD_COMPONENT_TABLE_ENTRIES
Definition: kdmain.c:32
#define BREAKPOINT_UNLOAD_SYMBOLS
Definition: kdtypes.h:54
BOOLEAN KdPitchDebugger
Definition: kdmain.c:21
BOOLEAN NTAPI KdPollBreakIn(VOID)
Definition: kdmain.c:367
BOOLEAN NTAPI KdbRegisterCliCallback(PVOID Callback, BOOLEAN Deregister)
Definition: kdb_cli.c:3319
#define EXCEPTION_EXECUTE_HANDLER
Definition: excpt.h:85
unsigned char BOOLEAN
enum _SYSDBG_COMMAND SYSDBG_COMMAND
smooth NULL
Definition: ftsmooth.c:416
#define STATUS_BREAKPOINT
Definition: ntstatus.h:172
BOOLEAN KdDebuggerEnabled
Definition: kdmain.c:16
PVOID BaseOfDll
Definition: kdtypes.h:170
_At_(*)(_In_ PWSK_CLIENT Client, _In_opt_ PUNICODE_STRING NodeName, _In_opt_ PUNICODE_STRING ServiceName, _In_opt_ ULONG NameSpace, _In_opt_ GUID *Provider, _In_opt_ PADDRINFOEXW Hints, _Outptr_ PADDRINFOEXW *Result, _In_opt_ PEPROCESS OwningProcess, _In_opt_ PETHREAD OwningThread, _Inout_ PIRP Irp Result)(Mem)) NTSTATUS(WSKAPI *PFN_WSK_GET_ADDRESS_INFO
Definition: wsk.h:426
_Must_inspect_result_ __drv_aliasesMem _In_ PDEVICE_OBJECT _In_opt_ PVOID _In_ ULONG _Out_opt_ PVOID OutputBuffer
Definition: iofuncs.h:713
#define KeGetContextPc(Context)
Definition: ke.h:124
NTSTATUS NTAPI KdChangeOption(IN KD_OPTION Option, IN ULONG InBufferLength OPTIONAL, IN PVOID InBuffer, IN ULONG OutBufferLength OPTIONAL, OUT PVOID OutBuffer, OUT PULONG OutBufferRequiredLength OPTIONAL)
Definition: kdmain.c:388
BOOLEAN NTAPI KdRefreshDebuggerNotPresent(VOID)
Definition: kdmain.c:304
#define BREAKPOINT_PROMPT
Definition: kdtypes.h:52
NTSTATUS NTAPI KdSystemDebugControl(IN SYSDBG_COMMAND Command, IN PVOID InputBuffer, IN ULONG InputBufferLength, OUT PVOID OutputBuffer, IN ULONG OutputBufferLength, IN OUT PULONG ReturnLength, IN KPROCESSOR_MODE PreviousMode)
Definition: kdmain.c:489
#define STATUS_ASSERTION_FAILURE
Definition: ntstatus.h:946
_In_ KPROCESSOR_MODE PreviousMode
Definition: sefuncs.h:103
BOOLEAN NTAPI KdpEnterDebuggerException(IN PKTRAP_FRAME TrapFrame, IN PKEXCEPTION_FRAME ExceptionFrame, IN PEXCEPTION_RECORD ExceptionRecord, IN PCONTEXT Context, IN KPROCESSOR_MODE PreviousMode, IN BOOLEAN SecondChance)
Definition: kdmain.c:124
if(!(yy_init))
Definition: macro.lex.yy.c:714
CCHAR KPROCESSOR_MODE
Definition: ketypes.h:7
NTSTATUS NTAPI KdEnableDebugger(VOID)
Definition: kdmain.c:342
#define SharedUserData
BOOLEAN KdpBreakPending
Definition: kdmain.c:20
#define BREAKPOINT_PRINT
Definition: kdtypes.h:51
VOID NTAPI ProbeForRead(IN CONST VOID *Address, IN SIZE_T Length, IN ULONG Alignment)
Definition: exintrin.c:102
_Requires_lock_held_ Interrupt _Releases_lock_ Interrupt _In_ _IRQL_restores_ KIRQL OldIrql
Definition: kefuncs.h:803
#define STATUS_INVALID_PARAMETER_1
Definition: ntstatus.h:461
VOID KdbSymProcessSymbols(IN PLDR_DATA_TABLE_ENTRY LdrEntry)
Definition: kdb_symbols.c:424
Definition: btrfs_drv.h:1801
NTSTATUS NTAPI NtQueryDebugFilterState(IN ULONG ComponentId, IN ULONG Level)
Definition: kdmain.c:402
_Must_inspect_result_ _In_ PFILE_OBJECT _In_ ULONG _In_ ULONG InputBufferLength
Definition: fltkernel.h:1372
#define MAXULONG
Definition: typedefs.h:250
#define DISPATCH_LEVEL
Definition: env_spec_w32.h:696
PKDP_INIT_ROUTINE WrapperInitRoutine
Definition: kdinit.c:27
_SEH2_END
Definition: create.c:4424
ULONG Kd_DEFAULT_MASK
Definition: kdmain.c:36
#define DPFLTR_ERROR_LEVEL
Definition: main.cpp:32
unsigned short USHORT
Definition: pedump.c:61
ULONG KdComponentTableEntries
Definition: kdmain.c:34
#define BREAKPOINT_LOAD_SYMBOLS
Definition: kdtypes.h:53
unsigned int * PULONG
Definition: retypes.h:1
ULONG ComponentId
Definition: kdmain.c:29
NTHALAPI VOID NTAPI HalDisplayString(PUCHAR String)
#define DPRINT1
Definition: precomp.h:8
BOOLEAN(NTAPI * PKDEBUG_ROUTINE)(IN PKTRAP_FRAME TrapFrame, IN PKEXCEPTION_FRAME ExceptionFrame, IN PEXCEPTION_RECORD ExceptionRecord, IN PCONTEXT Context, IN KPROCESSOR_MODE PreviousMode, IN BOOLEAN SecondChance)
Definition: kd64.h:61
#define OUT
Definition: typedefs.h:39
KD_DISPATCH_TABLE WrapperTable
Definition: kdinit.c:28
unsigned int ULONG
Definition: retypes.h:1
#define UNIMPLEMENTED
Definition: debug.h:114
#define BREAKPOINT_COMMAND_STRING
Definition: kdtypes.h:55
PKDEBUG_ROUTINE KiDebugRoutine
Definition: kdmain.c:504
enum _KD_OPTION KD_OPTION
BOOLEAN KdIgnoreUmExceptions
Definition: kdmain.c:22
#define _SEH2_EXCEPT(...)
Definition: pseh2_64.h:6
#define KD_BREAKPOINT_SIZE
Definition: ke.h:118
ULONG NTAPI KdpPrintString(_In_reads_bytes_(Length) PCHAR UnsafeString, _In_ ULONG Length, _In_ KPROCESSOR_MODE PreviousMode)
Definition: kdio.c:573
KD_CONTINUE_TYPE KdbEnterDebuggerException(IN PEXCEPTION_RECORD ExceptionRecord OPTIONAL, IN KPROCESSOR_MODE PreviousMode, IN PCONTEXT Context, IN OUT PKTRAP_FRAME TrapFrame, IN BOOLEAN FirstChance)
KDB Exception filter.
Definition: kdb.c:1325
#define KeSetContextPc(Context, ProgramCounter)
Definition: ke.h:127
return STATUS_SUCCESS
Definition: btrfs.c:2725
BOOLEAN KdBreakAfterSymbolLoad
Definition: kdmain.c:19
NTSTATUS NTAPI NtSetDebugFilterState(IN ULONG ComponentId, IN ULONG Level, IN BOOLEAN State)
Definition: kdmain.c:432
KD_CONTEXT KdpContext
Definition: kdmain.c:23
BOOLEAN KdDebuggerNotPresent
Definition: kdmain.c:18
BOOLEAN KdbpSymFindModule(IN PVOID Address OPTIONAL, IN LPCWSTR Name OPTIONAL, IN INT Index OPTIONAL, OUT PLDR_DATA_TABLE_ENTRY *pLdrEntry)
Find a module...
Definition: kdb_symbols.c:76
PULONG MinorVersion OPTIONAL
Definition: CrossNt.h:68