ReactOS  0.4.15-dev-5499-g1341c38
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 CODE_SEG("INIT")
30 SIZE_T
31 KdpGetMemorySizeInMBs(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
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 CODE_SEG("INIT")
71 VOID
72 KdpPrintBanner(IN SIZE_T MemSizeMBs)
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_ ULONG BootPhase,
144  _In_opt_ PLOADER_PARAMETER_BLOCK LoaderBlock)
145 {
146  BOOLEAN EnableKd, DisableKdAfterInit = FALSE, BlockEnable;
147  PSTR CommandLine, DebugLine, DebugOptionStart, DebugOptionEnd;
149  PLDR_DATA_TABLE_ENTRY LdrEntry;
150  PLIST_ENTRY NextEntry;
151  ULONG i, j, Length;
152  SIZE_T DebugOptionLength;
153  SIZE_T MemSizeMBs;
154  CHAR NameBuffer[256];
155  PWCHAR Name;
156 
157 #if defined(__GNUC__)
158  /* Make gcc happy */
159  BlockEnable = FALSE;
160 #endif
161 
162  /* Check if this is Phase 1 */
163  if (BootPhase)
164  {
165  /* Just query the performance counter */
167  return TRUE;
168  }
169 
170  /* Check if we already initialized once */
171  if (KdDebuggerEnabled) return TRUE;
172 
173  /* Set the Debug Routine as the Stub for now */
175 
176  /* Disable break after symbol load for now */
178 
179  /* Check if the Debugger Data Block was already initialized */
181  {
182  /* It wasn't...Initialize the KD Data Listhead */
184 
185  /* Register the Debugger Data Block */
188  sizeof(KdDebuggerDataBlock));
189 
190  /* Fill out the KD Version Block */
193 
194 #ifdef CONFIG_SMP
195  /* This is an MP Build */
197 #endif
198 
199  /* Save Pointers to Loaded Module List and Debugger Data */
202 
203  /* Set protocol limits */
208  KdVersionBlock.Unused[0] = 0;
209 
210  /* Link us in the KPCR */
211  KeGetPcr()->KdVersionBlock = &KdVersionBlock;
212  }
213 
214  /* Check if we have a loader block */
215  if (LoaderBlock)
216  {
217  /* Get the image entry */
218  LdrEntry = CONTAINING_RECORD(LoaderBlock->LoadOrderListHead.Flink,
220  InLoadOrderLinks);
221 
222  /* Save the Kernel Base */
223  PsNtosImageBase = (ULONG_PTR)LdrEntry->DllBase;
225 
226  /* Check if we have a command line */
227  CommandLine = LoaderBlock->LoadOptions;
228  if (CommandLine)
229  {
230  /* Upcase it */
231  _strupr(CommandLine);
232 
233  /* Assume we'll disable KD */
234  EnableKd = FALSE;
235 
236  /* Check for CRASHDEBUG, NODEBUG and just DEBUG */
237  if (strstr(CommandLine, "CRASHDEBUG"))
238  {
239  /* Don't enable KD now, but allow it to be enabled later */
241  }
242  else if (strstr(CommandLine, "NODEBUG"))
243  {
244  /* Don't enable KD and don't let it be enabled later */
246  }
247  else if ((DebugLine = strstr(CommandLine, "DEBUG")) != NULL)
248  {
249  /* Enable KD */
250  EnableKd = TRUE;
251 
252  /* Check if there are any options */
253  if (DebugLine[5] == '=')
254  {
255  /* Save pointers */
256  DebugOptionStart = DebugOptionEnd = &DebugLine[6];
257 
258  /* Scan the string for debug options */
259  for (;;)
260  {
261  /* Loop until we reach the end of the string */
262  while (*DebugOptionEnd != ANSI_NULL)
263  {
264  /* Check if this is a comma, a space or a tab */
265  if ((*DebugOptionEnd == ',') ||
266  (*DebugOptionEnd == ' ') ||
267  (*DebugOptionEnd == '\t'))
268  {
269  /*
270  * We reached the end of the option or
271  * the end of the string, break out
272  */
273  break;
274  }
275  else
276  {
277  /* Move on to the next character */
278  DebugOptionEnd++;
279  }
280  }
281 
282  /* Calculate the length of the current option */
283  DebugOptionLength = (DebugOptionEnd - DebugOptionStart);
284 
285  /*
286  * Break out if we reached the last option
287  * or if there were no options at all
288  */
289  if (!DebugOptionLength) break;
290 
291  /* Now check which option this is */
292  if ((DebugOptionLength == 10) &&
293  !(strncmp(DebugOptionStart, "AUTOENABLE", 10)))
294  {
295  /*
296  * Disable the debugger, but
297  * allow it to be reenabled
298  */
299  DisableKdAfterInit = TRUE;
300  BlockEnable = FALSE;
302  }
303  else if ((DebugOptionLength == 7) &&
304  !(strncmp(DebugOptionStart, "DISABLE", 7)))
305  {
306  /* Disable the debugger */
307  DisableKdAfterInit = TRUE;
308  BlockEnable = TRUE;
310  }
311  else if ((DebugOptionLength == 6) &&
312  !(strncmp(DebugOptionStart, "NOUMEX", 6)))
313  {
314  /* Ignore user mode exceptions */
316  }
317 
318  /*
319  * If there are more options then
320  * the next character should be a comma
321  */
322  if (*DebugOptionEnd != ',')
323  {
324  /* It isn't, break out */
325  break;
326  }
327 
328  /* Move on to the next option */
329  DebugOptionEnd++;
330  DebugOptionStart = DebugOptionEnd;
331  }
332  }
333  }
334  }
335  else
336  {
337  /* No command line options? Disable debugger by default */
339  EnableKd = FALSE;
340  }
341  }
342  else
343  {
344  /* Called from a bugcheck or a re-enable. Save the Kernel Base. */
346 
347  /* Unconditionally enable KD */
348  EnableKd = TRUE;
349  }
350 
351  /* Set the Kernel Base in the Data Block */
353 
354  /* Initialize the debugger if requested */
355  if (EnableKd && (NT_SUCCESS(KdDebuggerInitialize0(LoaderBlock))))
356  {
357  /* Now set our real KD routine */
359 
360  /* Check if we've already initialized our structures */
362  {
363  /* Set the Debug Switch Routine and Retries */
366 
367  /* Initialize breakpoints owed flag and table */
369  for (i = 0; i < KD_BREAKPOINT_MAX; i++)
370  {
374  }
375 
376  /* Initialize the Time Slip DPC */
380 
381  /* First-time initialization done! */
383  }
384 
385  /* Initialize the timer */
387 
388  /* Officially enable KD */
391 
392  /* Let user-mode know that it's enabled as well */
393  SharedUserData->KdDebuggerEnabled = TRUE;
394 
395  /* Display separator + ReactOS version at start of the debug log */
396  MemSizeMBs = KdpGetMemorySizeInMBs(KeLoaderBlock);
397  KdpPrintBanner(MemSizeMBs);
398 
399  /* Check if the debugger should be disabled initially */
400  if (DisableKdAfterInit)
401  {
402  /* Disable it */
404 
405  /*
406  * Save the enable block state and return initialized
407  * (the debugger is active but disabled).
408  */
409  KdBlockEnable = BlockEnable;
410  return TRUE;
411  }
412 
413  /* Check if we have a loader block */
414  if (LoaderBlock)
415  {
416  /* Loop boot images */
417  NextEntry = LoaderBlock->LoadOrderListHead.Flink;
418  i = 0;
419  while ((NextEntry != &LoaderBlock->LoadOrderListHead) && (i < 2))
420  {
421  /* Get the image entry */
422  LdrEntry = CONTAINING_RECORD(NextEntry,
424  InLoadOrderLinks);
425 
426  /* Generate the image name */
427  Name = LdrEntry->FullDllName.Buffer;
428  Length = LdrEntry->FullDllName.Length / sizeof(WCHAR);
429  j = 0;
430  do
431  {
432  /* Do cheap Unicode to ANSI conversion */
433  NameBuffer[j++] = (CHAR)*Name++;
434  } while (j < Length);
435 
436  /* Null-terminate */
437  NameBuffer[j] = ANSI_NULL;
438 
439  /* Load symbols for image */
440  RtlInitString(&ImageName, NameBuffer);
442  LdrEntry->DllBase,
444 
445  /* Go to the next entry */
446  NextEntry = NextEntry->Flink;
447  i++;
448  }
449  }
450 
451  /* Check for incoming breakin and break on symbol load if we have it */
453  }
454  else
455  {
456  /* Disable debugger */
458  }
459 
460  /* Return initialized */
461  return TRUE;
462 }
NTSTATUS NTAPI KdDebuggerInitialize0(IN PLOADER_PARAMETER_BLOCK LoaderBlock OPTIONAL)
Definition: kdcom.c:158
BOOLEAN KdDebuggerEnabled
Definition: kddata.c:83
BOOLEAN NTAPI KdInitSystem(_In_ ULONG BootPhase, _In_opt_ PLOADER_PARAMETER_BLOCK LoaderBlock)
Definition: kdinit.c:142
#define IN
Definition: typedefs.h:39
#define LONG_PTR
Definition: treelist.c:79
LARGE_INTEGER NTAPI KeQueryPerformanceCounter(IN PLARGE_INTEGER PerformanceFreq)
Definition: timer.c:138
DBGKD_GET_VERSION64 KdVersionBlock
Definition: kddata.c:496
PSTR ArcBootDeviceName
Definition: arc.h:503
_In_ ULONG _In_ ULONG _In_ ULONG Length
Definition: ntddpcm.h:101
_Must_inspect_result_ _In_ WDFIORESLIST _In_ PIO_RESOURCE_DESCRIPTOR Descriptor
Definition: wdfresource.h:339
#define _In_opt_
Definition: ms_sal.h:309
BOOLEAN KdpDebuggerStructuresInitialized
Definition: kddata.c:88
#define DbgKdMaximumStateChange
Definition: windbgkd.h:62
PKDEBUG_ROUTINE KiDebugRoutine
Definition: kddata.c:74
BOOLEAN NTAPI KdRegisterDebuggerDataBlock(IN ULONG Tag, IN PDBGKD_DEBUG_DATA_HEADER64 DataHeader, IN ULONG Size)
Definition: kdinit.c:98
#define TRUE
Definition: types.h:120
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:266
VOID NTAPI KeAcquireSpinLock(PKSPIN_LOCK SpinLock, PKIRQL OldIrql)
Definition: spinlock.c:50
BOOLEAN KdPitchDebugger
Definition: kddata.c:81
IN PVOID IN PVOID IN USHORT IN USHORT Size
Definition: pci.h:361
BOOLEAN KdBlockEnable
Definition: kddata.c:85
uint16_t * PWCHAR
Definition: typedefs.h:56
#define InsertTailList(ListHead, Entry)
ULONG64 KernBase
Definition: wdbgexts.h:193
if(dx==0 &&dy==0)
Definition: linetemp.h:174
PKDEBUG_SWITCH_ROUTINE KiDebugSwitchRoutine
Definition: kddata.c:75
#define KeGetPcr()
Definition: ke.h:26
uint32_t ULONG_PTR
Definition: typedefs.h:65
PVOID DllBase
Definition: btrfs_drv.h:1880
UCHAR KIRQL
Definition: env_spec_w32.h:591
BOOLEAN KdDebuggerNotPresent
Definition: kddata.c:82
LARGE_INTEGER KdTimerStart
Definition: kd64.h:562
#define DbgKdMaximumManipulate
Definition: windbgkd.h:117
PVOID KeUserCallbackDispatcher
Definition: ke.h:143
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 ANSI_NULL
ULONG_PTR DirectoryTableBase
Definition: kd64.h:56
Definition: arc.h:130
LARGE_INTEGER KdPerformanceCounterRate
Definition: kddata.c:91
BOOLEAN KdpOweBreakpoint
Definition: kddata.c:98
ULONG_PTR PsNtosImageBase
Definition: sysldr.c:25
struct NameRec_ * Name
Definition: cdprocs.h:459
unsigned char BOOLEAN
WORK_QUEUE_ITEM KdpTimeSlipWorkItem
Definition: kddata.c:118
#define _In_
Definition: ms_sal.h:308
VOID NTAPI KeInitializeTimer(OUT PKTIMER Timer)
Definition: timerobj.c:233
KSPIN_LOCK KdpDataSpinLock
Definition: kddata.c:491
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:201
KD_CONTEXT KdpContext
Definition: kddata.c:65
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:55
#define KDBG_TAG
Definition: wdbgexts.h:34
BOOLEAN KdIgnoreUmExceptions
Definition: kddata.c:86
struct _LIST_ENTRY * Flink
Definition: typedefs.h:121
#define ExInitializeWorkItem(Item, Routine, Context)
Definition: exfuncs.h:265
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:21
int strncmp(const char *String1, const char *String2, ACPI_SIZE Count)
Definition: utclib.c:534
ULONG64 PsLoadedModuleList
Definition: wdbgexts.h:166
#define DbgKdMinimumManipulate
Definition: windbgkd.h:73
KDDEBUGGER_DATA64 * KdDebuggerDataBlock
Definition: kdpacket.c:21
USHORT Unused[1]
Definition: wdbgexts.h:164
ULONG NtBuildNumber
Definition: init.c:50
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:792
_Must_inspect_result_ _In_ WDFCMRESLIST List
Definition: wdfresource.h:550
Definition: btrfs_drv.h:1876
#define PAGE_SIZE
Definition: env_spec_w32.h:49
VOID NTAPI KdUpdateDataBlock(VOID)
Definition: kdinit.c:89
#define KD_BREAKPOINT_MAX
Definition: kd64.h:28
Definition: typedefs.h:119
BOOLEAN NTAPI KdPollBreakIn(VOID)
Definition: kdlock.c:75
_Must_inspect_result_ _In_ WDFDEVICE _In_ BOOLEAN _In_opt_ PVOID Tag
Definition: wdfdevice.h:4061
CCHAR KeNumberProcessors
Definition: krnlinit.c:35
#define DbgKdMinimumStateChange
Definition: windbgkd.h:58
NTSYSAPI VOID NTAPI RtlInitString(PSTRING DestinationString, PCSZ SourceString)
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:80
_CRTIMP char *__cdecl _strupr(_Inout_z_ char *_String)
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
static CODE_SEG("INIT")
Definition: kdinit.c:29
unsigned short USHORT
Definition: pedump.c:61
LIST_ENTRY KdpDebuggerDataListHead
Definition: kddata.c:490
#define DBGKD_VERS_FLAG_MP
Definition: wdbgexts.h:27
#define InitializeListHead(ListHead)
Definition: env_spec_w32.h:944
signed char * PSTR
Definition: retypes.h:7
UNICODE_STRING FullDllName
Definition: btrfs_drv.h:1882
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 NULL
Definition: types.h:112
BOOLEAN KdBreakAfterSymbolLoad
Definition: kddata.c:80
#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
PVOID Address
Definition: kd64.h:57
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:712
DBGKD_DEBUG_DATA_HEADER64 Header
Definition: wdbgexts.h:192
#define CHAR(Char)
KTIMER KdpTimeSlipTimer
Definition: kddata.c:117
ULONG64 DebuggerDataList
Definition: wdbgexts.h:167
LONGLONG QuadPart
Definition: typedefs.h:114