ReactOS  0.4.13-dev-99-g7e18b6d
kdinit.c
Go to the documentation of this file.
1 /*
2  * PROJECT: ReactOS Kernel
3  * LICENSE: GPL - See COPYING in the top level directory
4  * FILE: ntoskrnl/kd64/kdinit.c
5  * PURPOSE: KD64 Initialization Code
6  * PROGRAMMERS: Alex Ionescu (alex.ionescu@reactos.org)
7  * Stefan Ginsberg (stefan.ginsberg@reactos.org)
8  */
9 
10 /* INCLUDES ******************************************************************/
11 
12 #include <ntoskrnl.h>
13 #include <reactos/buildno.h>
14 #define NDEBUG
15 #include <debug.h>
16 
17 /* UTILITY FUNCTIONS *********************************************************/
18 
19 /*
20  * Get the total size of the memory before
21  * Mm is initialized, by counting the number
22  * of physical pages. Useful for debug logging.
23  *
24  * Strongly inspired by:
25  * mm\ARM3\mminit.c : MiScanMemoryDescriptors(...)
26  *
27  * See also: kd\kdio.c
28  */
29 static SIZE_T
30 INIT_FUNCTION
32 {
33  PLIST_ENTRY ListEntry;
35  SIZE_T NumberOfPhysicalPages = 0;
36 
37  /* Loop the memory descriptors */
38  for (ListEntry = LoaderBlock->MemoryDescriptorListHead.Flink;
39  ListEntry != &LoaderBlock->MemoryDescriptorListHead;
40  ListEntry = ListEntry->Flink)
41  {
42  /* Get the descriptor */
43  Descriptor = CONTAINING_RECORD(ListEntry,
45  ListEntry);
46 
47  /* Check if this is invisible memory */
48  if ((Descriptor->MemoryType == LoaderFirmwarePermanent) ||
49  (Descriptor->MemoryType == LoaderSpecialMemory) ||
50  (Descriptor->MemoryType == LoaderHALCachedMemory) ||
51  (Descriptor->MemoryType == LoaderBBTMemory))
52  {
53  /* Skip this descriptor */
54  continue;
55  }
56 
57  /* Check if this is bad memory */
58  if (Descriptor->MemoryType != LoaderBad)
59  {
60  /* Count this in the total of pages */
61  NumberOfPhysicalPages += Descriptor->PageCount;
62  }
63  }
64 
65  /* Round size up. Assumed to better match actual physical RAM size */
66  return ALIGN_UP_BY(NumberOfPhysicalPages * PAGE_SIZE, 1024 * 1024) / (1024 * 1024);
67 }
68 
69 /* See also: kd\kdio.c */
70 static VOID
71 INIT_FUNCTION
73 {
74  DPRINT1("-----------------------------------------------------\n");
75  DPRINT1("ReactOS " KERNEL_VERSION_STR " (Build " KERNEL_VERSION_BUILD_STR ") (Commit " KERNEL_VERSION_COMMIT_HASH ")\n");
76  DPRINT1("%u System Processor [%u MB Memory]\n", KeNumberProcessors, MemSizeMBs);
77 
78  if (KeLoaderBlock)
79  {
80  DPRINT1("Command Line: %s\n", KeLoaderBlock->LoadOptions);
82  }
83 }
84 
85 /* FUNCTIONS *****************************************************************/
86 
87 VOID
88 NTAPI
90 {
91  /* Update the KeUserCallbackDispatcher pointer */
94 }
95 
96 BOOLEAN
97 NTAPI
99  IN PDBGKD_DEBUG_DATA_HEADER64 DataHeader,
100  IN ULONG Size)
101 {
102  KIRQL OldIrql;
103  PLIST_ENTRY NextEntry;
104  PDBGKD_DEBUG_DATA_HEADER64 CurrentHeader;
105 
106  /* Acquire the Data Lock */
108 
109  /* Loop the debugger data list */
110  NextEntry = KdpDebuggerDataListHead.Flink;
111  while (NextEntry != &KdpDebuggerDataListHead)
112  {
113  /* Get the header for this entry */
114  CurrentHeader = CONTAINING_RECORD(NextEntry,
116  List);
117 
118  /* Move to the next one */
119  NextEntry = NextEntry->Flink;
120 
121  /* Check if we already have this data block */
122  if ((CurrentHeader == DataHeader) || (CurrentHeader->OwnerTag == Tag))
123  {
124  /* Release the lock and fail */
126  return FALSE;
127  }
128  }
129 
130  /* Setup the header */
131  DataHeader->OwnerTag = Tag;
132  DataHeader->Size = Size;
133 
134  /* Insert it into the list and release the lock */
135  InsertTailList(&KdpDebuggerDataListHead, (PLIST_ENTRY)&DataHeader->List);
137  return TRUE;
138 }
139 
140 BOOLEAN
141 NTAPI
143  IN PLOADER_PARAMETER_BLOCK LoaderBlock)
144 {
145  BOOLEAN EnableKd, DisableKdAfterInit = FALSE, BlockEnable;
146  LPSTR CommandLine, DebugLine, DebugOptionStart, DebugOptionEnd;
148  PLDR_DATA_TABLE_ENTRY LdrEntry;
149  PLIST_ENTRY NextEntry;
150  ULONG i, j, Length;
151  SIZE_T DebugOptionLength;
152  SIZE_T MemSizeMBs;
153  CHAR NameBuffer[256];
154  PWCHAR Name;
155 
156 #if defined(__GNUC__)
157  /* Make gcc happy */
158  BlockEnable = FALSE;
159 #endif
160 
161  /* Check if this is Phase 1 */
162  if (BootPhase)
163  {
164  /* Just query the performance counter */
166  return TRUE;
167  }
168 
169  /* Check if we already initialized once */
170  if (KdDebuggerEnabled) return TRUE;
171 
172  /* Set the Debug Routine as the Stub for now */
174 
175  /* Disable break after symbol load for now */
177 
178  /* Check if the Debugger Data Block was already initialized */
180  {
181  /* It wasn't...Initialize the KD Data Listhead */
183 
184  /* Register the Debugger Data Block */
187  sizeof(KdDebuggerDataBlock));
188 
189  /* Fill out the KD Version Block */
192 
193 #ifdef CONFIG_SMP
194  /* This is an MP Build */
196 #endif
197 
198  /* Save Pointers to Loaded Module List and Debugger Data */
201 
202  /* Set protocol limits */
207  KdVersionBlock.Unused[0] = 0;
208 
209  /* Link us in the KPCR */
210  KeGetPcr()->KdVersionBlock = &KdVersionBlock;
211  }
212 
213  /* Check if we have a loader block */
214  if (LoaderBlock)
215  {
216  /* Get the image entry */
217  LdrEntry = CONTAINING_RECORD(LoaderBlock->LoadOrderListHead.Flink,
219  InLoadOrderLinks);
220 
221  /* Save the Kernel Base */
222  PsNtosImageBase = (ULONG_PTR)LdrEntry->DllBase;
224 
225  /* Check if we have a command line */
226  CommandLine = LoaderBlock->LoadOptions;
227  if (CommandLine)
228  {
229  /* Upcase it */
230  _strupr(CommandLine);
231 
232  /* Assume we'll disable KD */
233  EnableKd = FALSE;
234 
235  /* Check for CRASHDEBUG, NODEBUG and just DEBUG */
236  if (strstr(CommandLine, "CRASHDEBUG"))
237  {
238  /* Don't enable KD now, but allow it to be enabled later */
240  }
241  else if (strstr(CommandLine, "NODEBUG"))
242  {
243  /* Don't enable KD and don't let it be enabled later */
245  }
246  else if ((DebugLine = strstr(CommandLine, "DEBUG")) != NULL)
247  {
248  /* Enable KD */
249  EnableKd = TRUE;
250 
251  /* Check if there are any options */
252  if (DebugLine[5] == '=')
253  {
254  /* Save pointers */
255  DebugOptionStart = DebugOptionEnd = &DebugLine[6];
256 
257  /* Scan the string for debug options */
258  for (;;)
259  {
260  /* Loop until we reach the end of the string */
261  while (*DebugOptionEnd != ANSI_NULL)
262  {
263  /* Check if this is a comma, a space or a tab */
264  if ((*DebugOptionEnd == ',') ||
265  (*DebugOptionEnd == ' ') ||
266  (*DebugOptionEnd == '\t'))
267  {
268  /*
269  * We reached the end of the option or
270  * the end of the string, break out
271  */
272  break;
273  }
274  else
275  {
276  /* Move on to the next character */
277  DebugOptionEnd++;
278  }
279  }
280 
281  /* Calculate the length of the current option */
282  DebugOptionLength = (DebugOptionEnd - DebugOptionStart);
283 
284  /*
285  * Break out if we reached the last option
286  * or if there were no options at all
287  */
288  if (!DebugOptionLength) break;
289 
290  /* Now check which option this is */
291  if ((DebugOptionLength == 10) &&
292  !(strncmp(DebugOptionStart, "AUTOENABLE", 10)))
293  {
294  /*
295  * Disable the debugger, but
296  * allow it to be reenabled
297  */
298  DisableKdAfterInit = TRUE;
299  BlockEnable = FALSE;
301  }
302  else if ((DebugOptionLength == 7) &&
303  !(strncmp(DebugOptionStart, "DISABLE", 7)))
304  {
305  /* Disable the debugger */
306  DisableKdAfterInit = TRUE;
307  BlockEnable = TRUE;
309  }
310  else if ((DebugOptionLength == 6) &&
311  !(strncmp(DebugOptionStart, "NOUMEX", 6)))
312  {
313  /* Ignore user mode exceptions */
315  }
316 
317  /*
318  * If there are more options then
319  * the next character should be a comma
320  */
321  if (*DebugOptionEnd != ',')
322  {
323  /* It isn't, break out */
324  break;
325  }
326 
327  /* Move on to the next option */
328  DebugOptionEnd++;
329  DebugOptionStart = DebugOptionEnd;
330  }
331  }
332  }
333  }
334  else
335  {
336  /* No command line options? Disable debugger by default */
338  EnableKd = FALSE;
339  }
340  }
341  else
342  {
343  /* Called from a bugcheck or a re-enable. Save the Kernel Base */
345 
346  /* Unconditionally enable KD */
347  EnableKd = TRUE;
348  }
349 
350  /* Set the Kernel Base in the Data Block */
352 
353  /* Initialize the debugger if requested */
354  if (EnableKd && (NT_SUCCESS(KdDebuggerInitialize0(LoaderBlock))))
355  {
356  /* Now set our real KD routine */
358 
359  /* Check if we've already initialized our structures */
361  {
362  /* Set the Debug Switch Routine and Retries */
365 
366  /* Initialize breakpoints owed flag and table */
368  for (i = 0; i < KD_BREAKPOINT_MAX; i++)
369  {
373  }
374 
375  /* Initialize the Time Slip DPC */
379 
380  /* First-time initialization done! */
382  }
383 
384  /* Initialize the timer */
386 
387  /* Officially enable KD */
390 
391  /* Let user-mode know that it's enabled as well */
392  SharedUserData->KdDebuggerEnabled = TRUE;
393 
394  /* Display separator + ReactOS version at start of the debug log */
395  MemSizeMBs = KdpGetMemorySizeInMBs(KeLoaderBlock);
396  KdpPrintBanner(MemSizeMBs);
397 
398  /* Check if the debugger should be disabled initially */
399  if (DisableKdAfterInit)
400  {
401  /* Disable it */
403 
404  /*
405  * Save the enable block state and return initialized
406  * (the debugger is active but disabled).
407  */
408  KdBlockEnable = BlockEnable;
409  return TRUE;
410  }
411 
412  /* Check if we have a loader block */
413  if (LoaderBlock)
414  {
415  /* Loop boot images */
416  NextEntry = LoaderBlock->LoadOrderListHead.Flink;
417  i = 0;
418  while ((NextEntry != &LoaderBlock->LoadOrderListHead) && (i < 2))
419  {
420  /* Get the image entry */
421  LdrEntry = CONTAINING_RECORD(NextEntry,
423  InLoadOrderLinks);
424 
425  /* Generate the image name */
426  Name = LdrEntry->FullDllName.Buffer;
427  Length = LdrEntry->FullDllName.Length / sizeof(WCHAR);
428  j = 0;
429  do
430  {
431  /* Do cheap Unicode to ANSI conversion */
432  NameBuffer[j++] = (CHAR)*Name++;
433  } while (j < Length);
434 
435  /* Null-terminate */
436  NameBuffer[j] = ANSI_NULL;
437 
438  /* Load symbols for image */
439  RtlInitString(&ImageName, NameBuffer);
441  LdrEntry->DllBase,
443 
444  /* Go to the next entry */
445  NextEntry = NextEntry->Flink;
446  i++;
447  }
448  }
449 
450  /* Check for incoming breakin and break on symbol load if we have it */
452  }
453  else
454  {
455  /* Disable debugger */
457  }
458 
459  /* Return initialized */
460  return TRUE;
461 }
NTSTATUS NTAPI KdDebuggerInitialize0(IN PLOADER_PARAMETER_BLOCK LoaderBlock OPTIONAL)
Definition: kdcom.c:147
#define IN
Definition: typedefs.h:38
#define LONG_PTR
Definition: treelist.c:79
LARGE_INTEGER NTAPI KeQueryPerformanceCounter(IN PLARGE_INTEGER PerformanceFreq)
Definition: timer.c:138
#define TRUE
Definition: types.h:120
DBGKD_GET_VERSION64 KdVersionBlock
Definition: kddata.c:371
PSTR ArcBootDeviceName
Definition: arc.h:503
BOOLEAN KdpDebuggerStructuresInitialized
Definition: kddata.c:88
#define DbgKdMaximumStateChange
Definition: windbgkd.h:62
PKDEBUG_ROUTINE KiDebugRoutine
Definition: kdmain.c:504
char * strstr(char *String1, char *String2)
Definition: utclib.c:653
char CHAR
Definition: xmlstorage.h:175
BOOLEAN KdAutoEnableOnEvent
Definition: kddata.c:84
BOOLEAN NTAPI KdpStub(IN PKTRAP_FRAME TrapFrame, IN PKEXCEPTION_FRAME ExceptionFrame, IN PEXCEPTION_RECORD ExceptionRecord, IN PCONTEXT ContextRecord, IN KPROCESSOR_MODE PreviousMode, IN BOOLEAN SecondChanceException)
Definition: kdtrap.c:271
BOOLEAN KdBlockEnable
Definition: kddata.c:85
uint16_t * PWCHAR
Definition: typedefs.h:54
#define InsertTailList(ListHead, Entry)
ULONG64 KernBase
Definition: wdbgexts.h:180
char * LPSTR
Definition: xmlstorage.h:182
BOOLEAN NTAPI KdInitSystem(ULONG BootPhase, PLOADER_PARAMETER_BLOCK LoaderBlock)
Definition: kdinit.c:174
PKDEBUG_SWITCH_ROUTINE KiDebugSwitchRoutine
Definition: kddata.c:75
#define KeGetPcr()
Definition: ke.h:25
uint32_t ULONG_PTR
Definition: typedefs.h:63
PVOID DllBase
Definition: btrfs_drv.h:1805
UCHAR KIRQL
Definition: env_spec_w32.h:591
LARGE_INTEGER KdTimerStart
Definition: kd64.h:548
#define DbgKdMaximumManipulate
Definition: windbgkd.h:117
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
PVOID KeUserCallbackDispatcher
Definition: ke.h:138
NTSTATUS(* NTAPI)(IN PFILE_FULL_EA_INFORMATION EaBuffer, IN ULONG EaLength, OUT PULONG ErrorOffset)
Definition: IoEaTest.cpp:117
#define ANSI_NULL
ULONG_PTR DirectoryTableBase
Definition: kd64.h:51
VOID NTAPI KdUpdateDataBlock(VOID)
Definition: kdinit.c:89
Definition: arc.h:130
LARGE_INTEGER KdPerformanceCounterRate
Definition: kddata.c:91
BOOLEAN KdpOweBreakpoint
Definition: kddata.c:98
ULONG_PTR PsNtosImageBase
Definition: sysldr.c:38
BOOLEAN NTAPI KdPollBreakIn(VOID)
Definition: kdmain.c:367
struct NameRec_ * Name
Definition: cdprocs.h:464
static SIZE_T INIT_FUNCTION KdpGetMemorySizeInMBs(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
Definition: kdinit.c:31
unsigned char BOOLEAN
smooth NULL
Definition: ftsmooth.c:416
WORK_QUEUE_ITEM KdpTimeSlipWorkItem
Definition: kddata.c:118
BOOLEAN KdDebuggerEnabled
Definition: kdmain.c:16
VOID NTAPI KeInitializeTimer(OUT PKTIMER Timer)
Definition: timerobj.c:233
KSPIN_LOCK KdpDataSpinLock
Definition: kddata.c:366
static VOID INIT_FUNCTION KdpPrintBanner(IN SIZE_T MemSizeMBs)
Definition: kdinit.c:72
PLOADER_PARAMETER_BLOCK KeLoaderBlock
Definition: krnlinit.c:29
PFLT_MESSAGE_WAITER_QUEUE CONTAINING_RECORD(Csq, DEVICE_EXTENSION, IrpQueue)) -> WaiterQ.mLock) _IRQL_raises_(DISPATCH_LEVEL) VOID NTAPI FltpAcquireMessageWaiterLock(_In_ PIO_CSQ Csq, _Out_ PKIRQL Irql)
Definition: Messaging.c:560
ULONG64 KeUserCallbackDispatcher
Definition: wdbgexts.h:188
KD_CONTEXT KdpContext
Definition: kdmain.c:23
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 GLint GLint j
Definition: glfuncs.h:250
ULONG Flags
Definition: kd64.h:50
#define KDBG_TAG
Definition: wdbgexts.h:28
struct _LIST_ENTRY * Flink
Definition: typedefs.h:119
#define ExInitializeWorkItem(Item, Routine, Context)
Definition: exfuncs.h:265
LIST_ENTRY List
Definition: psmgr.c:57
if(!(yy_init))
Definition: macro.lex.yy.c:714
NTSTATUS NTAPI KdDisableDebuggerWithLock(IN BOOLEAN NeedLock)
Definition: kdapi.c:2035
__wchar_t WCHAR
Definition: xmlstorage.h:180
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
LIST_ENTRY PsLoadedModuleList
Definition: sysldr.c:34
#define KeAcquireSpinLock(sl, irql)
Definition: env_spec_w32.h:609
int strncmp(const char *String1, const char *String2, ACPI_SIZE Count)
Definition: utclib.c:534
ULONG64 PsLoadedModuleList
Definition: wdbgexts.h:160
#define DbgKdMinimumManipulate
Definition: windbgkd.h:73
KDDEBUGGER_DATA64 * KdDebuggerDataBlock
Definition: kdpacket.c:21
USHORT Unused[1]
Definition: wdbgexts.h:158
_In_ ULONG _In_ ULONG _In_ ULONG Length
Definition: ntddpcm.h:101
ULONG NtBuildNumber
Definition: init.c:47
std::wstring STRING
Definition: fontsub.cpp:33
unsigned __int64 ULONG64
Definition: imports.h:198
#define SharedUserData
static const char * ImageName
Definition: image.c:34
_Requires_lock_held_ Interrupt _Releases_lock_ Interrupt _In_ _IRQL_restores_ KIRQL OldIrql
Definition: kefuncs.h:803
Definition: btrfs_drv.h:1801
#define PAGE_SIZE
Definition: env_spec_w32.h:49
#define KD_BREAKPOINT_MAX
Definition: kd64.h:23
Definition: typedefs.h:117
IN PVOID IN PVOID IN USHORT IN USHORT Size
Definition: pci.h:359
CCHAR KeNumberProcessors
Definition: krnlinit.c:35
#define DbgKdMinimumStateChange
Definition: windbgkd.h:58
NTSYSAPI VOID NTAPI RtlInitString(PSTRING DestinationString, PCSZ SourceString)
BOOLEAN KdPitchDebugger
Definition: kdmain.c:21
KDPC KdpTimeSlipDpc
Definition: kddata.c:116
BOOLEAN NTAPI KdpTrap(IN PKTRAP_FRAME TrapFrame, IN PKEXCEPTION_FRAME ExceptionFrame, IN PEXCEPTION_RECORD ExceptionRecord, IN PCONTEXT ContextRecord, IN KPROCESSOR_MODE PreviousMode, IN BOOLEAN SecondChanceException)
Definition: kdtrap.c:135
ULONG_PTR SIZE_T
Definition: typedefs.h:78
_CRTIMP char *__cdecl _strupr(_Inout_z_ char *_String)
unsigned short USHORT
Definition: pedump.c:61
LIST_ENTRY KdpDebuggerDataListHead
Definition: kddata.c:365
#define DBGKD_VERS_FLAG_MP
Definition: wdbgexts.h:21
#define InitializeListHead(ListHead)
Definition: env_spec_w32.h:944
BOOLEAN KdIgnoreUmExceptions
Definition: kdmain.c:22
UNICODE_STRING FullDllName
Definition: btrfs_drv.h:1807
BREAKPOINT_ENTRY KdpBreakpointTable[KD_BREAKPOINT_MAX]
Definition: kddata.c:96
__int3264 LONG_PTR
Definition: mstsclib_h.h:276
HANDLE NTAPI PsGetCurrentProcessId(VOID)
Definition: process.c:1123
#define KeReleaseSpinLock(sl, irql)
Definition: env_spec_w32.h:627
VOID NTAPI KdpTimeSlipDpcRoutine(IN PKDPC Dpc, IN PVOID DeferredContext, IN PVOID SystemArgument1, IN PVOID SystemArgument2)
Definition: kdapi.c:1785
VOID NTAPI KdpTimeSlipWork(IN PVOID Context)
Definition: kdapi.c:1811
VOID NTAPI DbgLoadImageSymbols(_In_ PSTRING Name, _In_ PVOID Base, _In_ ULONG_PTR ProcessId)
ULONG KdpDefaultRetries
Definition: windbgkd.h:226
#define DPRINT1
Definition: precomp.h:8
IN ULONG IN ULONG Tag
Definition: evtlib.h:159
PVOID Address
Definition: kd64.h:52
unsigned int ULONG
Definition: retypes.h:1
#define ULONG_PTR
Definition: config.h:101
#define ALIGN_UP_BY(size, align)
BOOLEAN NTAPI KdpSwitchProcessor(IN PEXCEPTION_RECORD ExceptionRecord, IN OUT PCONTEXT ContextRecord, IN BOOLEAN SecondChanceException)
Definition: kdapi.c:1833
VOID NTAPI KeInitializeDpc(IN PKDPC Dpc, IN PKDEFERRED_ROUTINE DeferredRoutine, IN PVOID DeferredContext)
Definition: dpc.c:711
DBGKD_DEBUG_DATA_HEADER64 Header
Definition: wdbgexts.h:179
#define CHAR(Char)
KTIMER KdpTimeSlipTimer
Definition: kddata.c:117
BOOLEAN KdBreakAfterSymbolLoad
Definition: kdmain.c:19
BOOLEAN NTAPI KdRegisterDebuggerDataBlock(IN ULONG Tag, IN PDBGKD_DEBUG_DATA_HEADER64 DataHeader, IN ULONG Size)
Definition: kdinit.c:98
BOOLEAN KdDebuggerNotPresent
Definition: kdmain.c:18
ULONG64 DebuggerDataList
Definition: wdbgexts.h:161
LONGLONG QuadPart
Definition: typedefs.h:112
_In_ PSTORAGE_PROPERTY_ID _Outptr_ PSTORAGE_DESCRIPTOR_HEADER * Descriptor
Definition: classpnp.h:966