ReactOS  0.4.10-dev-348-gbcec1fd
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];
163  if (PreviousMode != KernelMode)
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 */
216  KeSetContextPc(Context, KeGetContextPc(Context) + KD_BREAKPOINT_SIZE);
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 */
322  KeRaiseIrql(DISPATCH_LEVEL, &OldIrql);
323 
324  /* TODO: Disable any breakpoints */
325 
326  /* Disable the Debugger */
328  SharedUserData->KdDebuggerEnabled = FALSE;
329 
330  /* Lower the IRQL */
331  KeLowerIrql(OldIrql);
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 */
347  KeRaiseIrql(DISPATCH_LEVEL, &OldIrql);
348 
349  /* TODO: Re-enable any breakpoints */
350 
351  /* Enable the Debugger */
353  SharedUserData->KdDebuggerEnabled = TRUE;
354 
355  /* Lower the IRQL */
356  KeLowerIrql(OldIrql);
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 */
418  if (ComponentId == KdComponentTable[i].ComponentId)
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
450  Kd_DEFAULT_MASK &= ~Level;
451 
452  return STATUS_SUCCESS;
453  }
454 
455  /* Search for an existing entry */
456  for (i = 0; i < KdComponentTableEntries; i++ )
457  {
458  if (ComponentId == KdComponentTable[i].ComponentId)
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 */
471  KdComponentTable[i].ComponentId = ComponentId;
472  KdComponentTable[i].Level = Kd_DEFAULT_MASK;
473  }
474 
475  /* Update entry table */
476  if (State)
477  KdComponentTable[i].Level |= Level;
478  else
479  KdComponentTable[i].Level &= ~Level;
480 
481  return STATUS_SUCCESS;
482 }
483 
484 /*
485  * @unimplemented
486  */
487 NTSTATUS
488 NTAPI
496 {
497  /* HACK */
498  return KdpServiceDispatcher(Command,
499  InputBuffer,
500  InputBufferLength,
501  PreviousMode);
502 }
503 
505 
506  /* EOF */
BOOLEAN KdEnteredDebugger
Definition: kdmain.c:17
DWORD *typedef PVOID
Definition: winlogon.h:52
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
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 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
return STATUS_SUCCESS
Definition: btrfs.c:2690
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
_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
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
GLenum GLclampf GLint i
Definition: glfuncs.h:14
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:192
NTSTATUS(* NTAPI)(IN PFILE_FULL_EA_INFORMATION EaBuffer, IN ULONG EaLength, OUT PULONG ErrorOffset)
Definition: IoEaTest.cpp:117
#define FALSE
Definition: types.h: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:3313
#define EXCEPTION_EXECUTE_HANDLER
Definition: excpt.h:85
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
_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
unsigned char BOOLEAN
_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
LONG NTSTATUS
Definition: precomp.h:26
if(!(yy_init))
Definition: macro.lex.yy.c:717
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:1762
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
#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
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 const char UINT32 const char const char UINT32 ComponentId
Definition: acpixf.h:1256
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:570
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
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
IN HDEVINFO IN PSP_DEVINFO_DATA DeviceInfoData OPTIONAL
Definition: devinst.c:44
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