ReactOS 0.4.15-dev-5664-g3bf4ef6
kdinit.c File Reference
#include <ntoskrnl.h>
#include <reactos/buildno.h>
#include <debug.h>
Include dependency graph for kdinit.c:

Go to the source code of this file.

Macros

#define NDEBUG
 

Functions

static CODE_SEG ("INIT")
 
VOID NTAPI KdUpdateDataBlock (VOID)
 
BOOLEAN NTAPI KdRegisterDebuggerDataBlock (IN ULONG Tag, IN PDBGKD_DEBUG_DATA_HEADER64 DataHeader, IN ULONG Size)
 
BOOLEAN NTAPI KdInitSystem (_In_ ULONG BootPhase, _In_opt_ PLOADER_PARAMETER_BLOCK LoaderBlock)
 

Macro Definition Documentation

◆ NDEBUG

#define NDEBUG

Definition at line 14 of file kdinit.c.

Function Documentation

◆ CODE_SEG()

static CODE_SEG ( "INIT"  )
static

Definition at line 29 of file kdinit.c.

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}
#define ALIGN_UP_BY(size, align)
#define PAGE_SIZE
Definition: env_spec_w32.h:49
@ LoaderBad
Definition: arc.h:130
@ LoaderHALCachedMemory
Definition: arc.h:153
@ LoaderFirmwarePermanent
Definition: arc.h:133
@ LoaderSpecialMemory
Definition: arc.h:149
@ LoaderBBTMemory
Definition: arc.h:150
Definition: typedefs.h:120
struct _LIST_ENTRY * Flink
Definition: typedefs.h:121
ULONG_PTR SIZE_T
Definition: typedefs.h:80
#define CONTAINING_RECORD(address, type, field)
Definition: typedefs.h:260
_Must_inspect_result_ _In_ WDFIORESLIST _In_ PIO_RESOURCE_DESCRIPTOR Descriptor
Definition: wdfresource.h:342

◆ KdInitSystem()

BOOLEAN NTAPI KdInitSystem ( _In_ ULONG  BootPhase,
_In_opt_ PLOADER_PARAMETER_BLOCK  LoaderBlock 
)

Definition at line 142 of file kdinit.c.

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}
unsigned char BOOLEAN
char * strstr(char *String1, char *String2)
Definition: utclib.c:653
int strncmp(const char *String1, const char *String2, ACPI_SIZE Count)
Definition: utclib.c:534
struct NameRec_ * Name
Definition: cdprocs.h:460
#define CHAR(Char)
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
VOID NTAPI KeInitializeDpc(IN PKDPC Dpc, IN PKDEFERRED_ROUTINE DeferredRoutine, IN PVOID DeferredContext)
Definition: dpc.c:712
#define ULONG_PTR
Definition: config.h:101
#define InitializeListHead(ListHead)
Definition: env_spec_w32.h:944
std::wstring STRING
Definition: fontsub.cpp:33
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
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
LARGE_INTEGER NTAPI KeQueryPerformanceCounter(IN PLARGE_INTEGER PerformanceFreq)
Definition: timer.c:138
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
#define KD_BREAKPOINT_MAX
Definition: kd64.h:28
BREAKPOINT_ENTRY KdpBreakpointTable[KD_BREAKPOINT_MAX]
Definition: kddata.c:96
BOOLEAN KdPitchDebugger
Definition: kddata.c:81
NTSTATUS NTAPI KdDisableDebuggerWithLock(IN BOOLEAN NeedLock)
Definition: kdapi.c:2035
BOOLEAN KdBlockEnable
Definition: kddata.c:85
LARGE_INTEGER KdPerformanceCounterRate
Definition: kddata.c:91
BOOLEAN KdBreakAfterSymbolLoad
Definition: kddata.c:80
KDPC KdpTimeSlipDpc
Definition: kddata.c:116
BOOLEAN NTAPI KdpSwitchProcessor(IN PEXCEPTION_RECORD ExceptionRecord, IN OUT PCONTEXT ContextRecord, IN BOOLEAN SecondChanceException)
Definition: kdapi.c:1833
DBGKD_GET_VERSION64 KdVersionBlock
Definition: kddata.c:496
VOID NTAPI KdpTimeSlipWork(IN PVOID Context)
Definition: kdapi.c:1811
LARGE_INTEGER KdTimerStart
Definition: kd64.h:562
BOOLEAN KdIgnoreUmExceptions
Definition: kddata.c:86
PKDEBUG_ROUTINE KiDebugRoutine
Definition: kddata.c:74
PKDEBUG_SWITCH_ROUTINE KiDebugSwitchRoutine
Definition: kddata.c:75
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
WORK_QUEUE_ITEM KdpTimeSlipWorkItem
Definition: kddata.c:118
KD_CONTEXT KdpContext
Definition: kddata.c:65
LIST_ENTRY KdpDebuggerDataListHead
Definition: kddata.c:490
BOOLEAN KdpDebuggerStructuresInitialized
Definition: kddata.c:88
VOID NTAPI KdpTimeSlipDpcRoutine(IN PKDPC Dpc, IN PVOID DeferredContext, IN PVOID SystemArgument1, IN PVOID SystemArgument2)
Definition: kdapi.c:1785
BOOLEAN KdpOweBreakpoint
Definition: kddata.c:98
KTIMER KdpTimeSlipTimer
Definition: kddata.c:117
BOOLEAN KdAutoEnableOnEvent
Definition: kddata.c:84
NTSTATUS NTAPI KdDebuggerInitialize0(IN PLOADER_PARAMETER_BLOCK LoaderBlock OPTIONAL)
Definition: kdcom.c:158
BOOLEAN KdDebuggerNotPresent
Definition: kddata.c:82
BOOLEAN KdDebuggerEnabled
Definition: kddata.c:83
KDDEBUGGER_DATA64 * KdDebuggerDataBlock
Definition: kdpacket.c:21
BOOLEAN NTAPI KdRegisterDebuggerDataBlock(IN ULONG Tag, IN PDBGKD_DEBUG_DATA_HEADER64 DataHeader, IN ULONG Size)
Definition: kdinit.c:98
BOOLEAN NTAPI KdPollBreakIn(VOID)
Definition: kdlock.c:75
PLOADER_PARAMETER_BLOCK KeLoaderBlock
Definition: krnlinit.c:29
if(dx< 0)
Definition: linetemp.h:194
signed char * PSTR
Definition: retypes.h:7
unsigned int ULONG
Definition: retypes.h:1
unsigned __int64 ULONG64
Definition: imports.h:198
static const char * ImageName
Definition: image.c:34
__int3264 LONG_PTR
Definition: mstsclib_h.h:276
VOID NTAPI DbgLoadImageSymbols(_In_ PSTRING Name, _In_ PVOID Base, _In_ ULONG_PTR ProcessId)
NTSYSAPI VOID NTAPI RtlInitString(PSTRING DestinationString, PCSZ SourceString)
#define ANSI_NULL
_In_ ULONG _In_ ULONG _In_ ULONG Length
Definition: ntddpcm.h:102
HANDLE NTAPI PsGetCurrentProcessId(VOID)
Definition: process.c:1123
unsigned short USHORT
Definition: pedump.c:61
LIST_ENTRY PsLoadedModuleList
Definition: sysldr.c:21
ULONG_PTR PsNtosImageBase
Definition: sysldr.c:25
_CRTIMP char *__cdecl _strupr(_Inout_z_ char *_String)
#define DBGKD_VERS_FLAG_MP
Definition: wdbgexts.h:27
#define KDBG_TAG
Definition: wdbgexts.h:34
@ DBGKD_MAJOR_NT
Definition: wdbgexts.h:38
#define SharedUserData
#define KeGetPcr()
Definition: ke.h:26
ULONG NtBuildNumber
Definition: init.c:50
ULONG_PTR DirectoryTableBase
Definition: kd64.h:56
ULONG Flags
Definition: kd64.h:55
PVOID Address
Definition: kd64.h:57
ULONG64 DebuggerDataList
Definition: wdbgexts.h:167
ULONG64 PsLoadedModuleList
Definition: wdbgexts.h:166
USHORT Unused[1]
Definition: wdbgexts.h:164
DBGKD_DEBUG_DATA_HEADER64 Header
Definition: wdbgexts.h:192
ULONG64 KernBase
Definition: wdbgexts.h:193
ULONG KdpDefaultRetries
Definition: windbgkd.h:226
Definition: btrfs_drv.h:1876
UNICODE_STRING FullDllName
Definition: btrfs_drv.h:1882
PVOID DllBase
Definition: btrfs_drv.h:1880
VOID NTAPI KeInitializeTimer(OUT PKTIMER Timer)
Definition: timerobj.c:233
#define LONG_PTR
Definition: treelist.c:79
uint32_t ULONG_PTR
Definition: typedefs.h:65
uint16_t * PWCHAR
Definition: typedefs.h:56
LONGLONG QuadPart
Definition: typedefs.h:114
#define DbgKdMaximumStateChange
Definition: windbgkd.h:62
#define DbgKdMinimumStateChange
Definition: windbgkd.h:58
#define DbgKdMaximumManipulate
Definition: windbgkd.h:117
#define DbgKdMinimumManipulate
Definition: windbgkd.h:73
#define ExInitializeWorkItem(Item, Routine, Context)
Definition: exfuncs.h:265
__wchar_t WCHAR
Definition: xmlstorage.h:180
char CHAR
Definition: xmlstorage.h:175

Referenced by IoInitSystem(), KdEnableDebuggerWithLock(), KeEnterKernelDebugger(), KiInitializeSystem(), KiSystemStartup(), and Phase1InitializationDiscard().

◆ KdRegisterDebuggerDataBlock()

BOOLEAN NTAPI KdRegisterDebuggerDataBlock ( IN ULONG  Tag,
IN PDBGKD_DEBUG_DATA_HEADER64  DataHeader,
IN ULONG  Size 
)

Definition at line 98 of file kdinit.c.

101{
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 */
137 return TRUE;
138}
#define InsertTailList(ListHead, Entry)
UCHAR KIRQL
Definition: env_spec_w32.h:591
#define KeReleaseSpinLock(sl, irql)
Definition: env_spec_w32.h:627
#define KeAcquireSpinLock(sl, irql)
Definition: env_spec_w32.h:609
KSPIN_LOCK KdpDataSpinLock
Definition: kddata.c:491
_Must_inspect_result_ _In_ WDFDEVICE _In_ BOOLEAN _In_opt_ PVOID Tag
Definition: wdfdevice.h:4065
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_DEVICE_PROPERTY_DATA _In_ DEVPROPTYPE _In_ ULONG Size
Definition: wdfdevice.h:4533
_Must_inspect_result_ _In_ WDFCMRESLIST List
Definition: wdfresource.h:550
_Requires_lock_held_ Interrupt _Releases_lock_ Interrupt _In_ _IRQL_restores_ KIRQL OldIrql
Definition: kefuncs.h:792

Referenced by KdInitSystem().

◆ KdUpdateDataBlock()

VOID NTAPI KdUpdateDataBlock ( VOID  )

Definition at line 89 of file kdinit.c.

90{
91 /* Update the KeUserCallbackDispatcher pointer */
94}
PVOID KeUserCallbackDispatcher
Definition: ke.h:143
ULONG64 KeUserCallbackDispatcher
Definition: wdbgexts.h:201

Referenced by PspInitializeSystemDll().