ReactOS 0.4.16-dev-122-g325d74c
kdbg.c
Go to the documentation of this file.
1/*
2 * PROJECT: ReactOS Kernel
3 * LICENSE: BSD - See COPYING.ARM in the top level directory
4 * FILE: ntoskrnl/mm/ARM3/kdbg.c
5 * PURPOSE: ARM Memory Manager Kernel Debugger routines
6 * PROGRAMMERS: ReactOS Portable Systems Group
7 * Pierre Schweitzer
8 */
9
10/* INCLUDES *******************************************************************/
11
12#include <ntoskrnl.h>
13#define NDEBUG
14#include <debug.h>
15
16#define MODULE_INVOLVED_IN_ARM3
17#include <mm/ARM3/miarm.h>
18
19/* GLOBALS ********************************************************************/
20
21typedef struct _IRP_FIND_CTXT
22{
27
31
32#define POOL_BIG_TABLE_ENTRY_FREE 0x1
33
34/* Pool block/header/list access macros */
35#define POOL_ENTRY(x) (PPOOL_HEADER)((ULONG_PTR)(x) - sizeof(POOL_HEADER))
36#define POOL_FREE_BLOCK(x) (PLIST_ENTRY)((ULONG_PTR)(x) + sizeof(POOL_HEADER))
37#define POOL_BLOCK(x, i) (PPOOL_HEADER)((ULONG_PTR)(x) + ((i) * POOL_BLOCK_SIZE))
38#define POOL_NEXT_BLOCK(x) POOL_BLOCK((x), (x)->BlockSize)
39#define POOL_PREV_BLOCK(x) POOL_BLOCK((x), -((x)->PreviousSize))
40
42
43/* PRIVATE FUNCTIONS **********************************************************/
44
45#if DBG && defined(KDBG)
46
47#include <kdbg/kdb.h>
48
51 ULONG Argc,
52 PCHAR Argv[])
53{
54 ULONG_PTR Address = 0, Flags = 0;
55 PVOID PoolPage;
57 BOOLEAN ThisOne;
59
60 if (Argc > 1)
61 {
62 /* Get address */
63 if (!KdbpGetHexNumber(Argv[1], &Address))
64 {
65 KdbpPrint("Invalid parameter: %s\n", Argv[1]);
66 return TRUE;
67 }
68 }
69
70 if (Argc > 2)
71 {
72 /* Get flags */
73 if (!KdbpGetHexNumber(Argv[2], &Flags))
74 {
75 KdbpPrint("Invalid parameter: %s\n", Argv[2]);
76 return TRUE;
77 }
78 }
79
80 /* Check if we got an address */
81 if (Address != 0)
82 {
83 /* Get the base page */
84 PoolPage = PAGE_ALIGN(Address);
85 }
86 else
87 {
88 KdbpPrint("Heap is unimplemented\n");
89 return TRUE;
90 }
91
92 /* No paging support! */
93 if (!MmIsAddressValid(PoolPage))
94 {
95 KdbpPrint("Address not accessible!\n");
96 return TRUE;
97 }
98
99 /* Get pool type */
101 KdbpPrint("Allocation is from PagedPool region\n");
103 KdbpPrint("Allocation is from NonPagedPool region\n");
104 else
105 {
106 KdbpPrint("Address 0x%p is not within any pool!\n", (PVOID)Address);
107 return TRUE;
108 }
109
110 /* Loop all entries of that page */
111 Entry = PoolPage;
112 do
113 {
114 /* Check if the address is within that entry */
115 ThisOne = ((Address >= (ULONG_PTR)Entry) &&
116 (Address < (ULONG_PTR)(Entry + Entry->BlockSize)));
117
118 if (!(Flags & 1) || ThisOne)
119 {
120 /* Print the line */
121 KdbpPrint("%c%p size: %4d previous size: %4d %s %.4s\n",
122 ThisOne ? '*' : ' ', Entry, Entry->BlockSize, Entry->PreviousSize,
123 (Flags & 0x80000000) ? "" : (Entry->PoolType ? "(Allocated)" : "(Free) "),
124 (Flags & 0x80000000) ? "" : (PCHAR)&Entry->PoolTag);
125 }
126
127 if (Flags & 1)
128 {
129 Data = (PULONG)(Entry + 1);
130 KdbpPrint(" %p %08lx %08lx %08lx %08lx\n"
131 " %p %08lx %08lx %08lx %08lx\n",
132 &Data[0], Data[0], Data[1], Data[2], Data[3],
133 &Data[4], Data[4], Data[5], Data[6], Data[7]);
134 }
135
136 /* Go to next entry */
137 Entry = POOL_BLOCK(Entry, Entry->BlockSize);
138 }
139 while ((Entry->BlockSize != 0) && ((ULONG_PTR)Entry < (ULONG_PTR)PoolPage + PAGE_SIZE));
140
141 return TRUE;
142}
143
144static
145VOID
146ExpKdbgExtPoolUsedGetTag(PCHAR Arg, PULONG Tag, PULONG Mask)
147{
148 CHAR Tmp[4];
149 SIZE_T Len;
150 USHORT i;
151
152 /* Get the tag */
153 Len = strlen(Arg);
154 if (Len > 4)
155 {
156 Len = 4;
157 }
158
159 /* Generate the mask to have wildcards support */
160 for (i = 0; i < Len; ++i)
161 {
162 Tmp[i] = Arg[i];
163 if (Tmp[i] != '?')
164 {
165 *Mask |= (0xFF << i * 8);
166 }
167 }
168
169 /* Get the tag in the ulong form */
170 *Tag = *((PULONG)Tmp);
171}
172
175 ULONG Argc,
176 PCHAR Argv[])
177{
178 ULONG Tag = 0;
179 ULONG Mask = 0;
180 ULONG_PTR Flags = 0;
181
182 if (Argc > 1)
183 {
184 /* If we have 2+ args, easy: flags then tag */
185 if (Argc > 2)
186 {
187 ExpKdbgExtPoolUsedGetTag(Argv[2], &Tag, &Mask);
188 if (!KdbpGetHexNumber(Argv[1], &Flags))
189 {
190 KdbpPrint("Invalid parameter: %s\n", Argv[1]);
191 }
192 }
193 else
194 {
195 /* Otherwise, try to find out whether that's flags */
196 if (strlen(Argv[1]) == 1 ||
197 (strlen(Argv[1]) == 3 && Argv[1][0] == '0' && (Argv[1][1] == 'x' || Argv[1][1] == 'X')))
198 {
199 /* Fallback: if reading flags failed, assume it's a tag */
200 if (!KdbpGetHexNumber(Argv[1], &Flags))
201 {
202 ExpKdbgExtPoolUsedGetTag(Argv[1], &Tag, &Mask);
203 }
204 }
205 /* Or tag */
206 else
207 {
208 ExpKdbgExtPoolUsedGetTag(Argv[1], &Tag, &Mask);
209 }
210 }
211 }
212
213 /* Call the dumper */
215
216 return TRUE;
217}
218
219static
220VOID
221ExpKdbgExtPoolFindLargePool(
222 ULONG Tag,
223 ULONG Mask,
224 VOID (NTAPI* FoundCallback)(PPOOL_TRACKER_BIG_PAGES, PVOID),
226{
227 ULONG i;
228
229 KdbpPrint("Scanning large pool allocation table for Tag: %.4s (%p : %p)\n", (PCHAR)&Tag, &PoolBigPageTable[0], &PoolBigPageTable[PoolBigPageTableSize - 1]);
230
231 for (i = 0; i < PoolBigPageTableSize; i++)
232 {
233 /* Free entry? */
235 {
236 continue;
237 }
238
239 if ((PoolBigPageTable[i].Key & Mask) == (Tag & Mask))
240 {
241 if (FoundCallback != NULL)
242 {
243 FoundCallback(&PoolBigPageTable[i], CallbackContext);
244 }
245 else
246 {
247 /* Print the line */
248 KdbpPrint("%p: tag %.4s, size: %I64x\n",
250 PoolBigPageTable[i].NumberOfPages << PAGE_SHIFT);
251 }
252 }
253 }
254}
255
256static
258ExpKdbgExtValidatePoolHeader(
259 PVOID BaseVa,
261 POOL_TYPE BasePoolTye)
262{
263 /* Block size cannot be NULL or negative and it must cover the page */
264 if (Entry->BlockSize <= 0)
265 {
266 return FALSE;
267 }
268 if (Entry->BlockSize * 8 + (ULONG_PTR)Entry - (ULONG_PTR)BaseVa > PAGE_SIZE)
269 {
270 return FALSE;
271 }
272
273 /*
274 * PreviousSize cannot be 0 unless on page begin
275 * And it cannot be bigger that our current
276 * position in page
277 */
278 if (Entry->PreviousSize == 0 && BaseVa != Entry)
279 {
280 return FALSE;
281 }
282 if (Entry->PreviousSize * 8 > (ULONG_PTR)Entry - (ULONG_PTR)BaseVa)
283 {
284 return FALSE;
285 }
286
287 /* Must be paged pool */
288 if (((Entry->PoolType - 1) & BASE_POOL_TYPE_MASK) != BasePoolTye)
289 {
290 return FALSE;
291 }
292
293 /* Match tag mask */
294 if ((Entry->PoolTag & 0x00808080) != 0)
295 {
296 return FALSE;
297 }
298
299 return TRUE;
300}
301
302static
303VOID
304ExpKdbgExtPoolFindPagedPool(
305 ULONG Tag,
306 ULONG Mask,
307 VOID (NTAPI* FoundCallback)(PPOOL_HEADER, PVOID),
309{
310 ULONG i = 0;
312 PVOID BaseVa;
313 PMMPDE PointerPde;
314
315 KdbpPrint("Searching Paged pool (%p : %p) for Tag: %.4s\n", MmPagedPoolStart, MmPagedPoolEnd, (PCHAR)&Tag);
316
317 /*
318 * To speed up paged pool search, we will use the allocation bipmap.
319 * This is possible because we live directly in the kernel :-)
320 */
322 while (i != 0xFFFFFFFF)
323 {
324 BaseVa = (PVOID)((ULONG_PTR)MmPagedPoolStart + (i << PAGE_SHIFT));
325 Entry = BaseVa;
326
327 /* Validate our address */
329 {
330 break;
331 }
332
333 /* Check whether we are beyond expansion */
334 PointerPde = MiAddressToPde(BaseVa);
336 {
337 break;
338 }
339
340 /* Check if allocation is valid */
341 if (MmIsAddressValid(BaseVa))
342 {
343 for (Entry = BaseVa;
344 (ULONG_PTR)Entry + sizeof(POOL_HEADER) < (ULONG_PTR)BaseVa + PAGE_SIZE;
345 Entry = (PVOID)((ULONG_PTR)Entry + 8))
346 {
347 /* Try to find whether we have a pool entry */
348 if (!ExpKdbgExtValidatePoolHeader(BaseVa, Entry, PagedPool))
349 {
350 continue;
351 }
352
353 if ((Entry->PoolTag & Mask) == (Tag & Mask))
354 {
355 if (FoundCallback != NULL)
356 {
357 FoundCallback(Entry, CallbackContext);
358 }
359 else
360 {
361 /* Print the line */
362 KdbpPrint("%p size: %4d previous size: %4d %s %.4s\n",
363 Entry, Entry->BlockSize, Entry->PreviousSize,
364 Entry->PoolType ? "(Allocated)" : "(Free) ",
365 (PCHAR)&Entry->PoolTag);
366 }
367 }
368 }
369 }
370
372 }
373}
374
375static
376VOID
377ExpKdbgExtPoolFindNonPagedPool(
378 ULONG Tag,
379 ULONG Mask,
380 VOID (NTAPI* FoundCallback)(PPOOL_HEADER, PVOID),
382{
384 PVOID BaseVa;
385
386 KdbpPrint("Searching NonPaged pool (%p : %p) for Tag: %.4s\n", MmNonPagedPoolStart, MmNonPagedPoolEnd0, (PCHAR)&Tag);
387
388 /* Brute force search: start browsing the whole non paged pool */
389 for (BaseVa = MmNonPagedPoolStart;
391 BaseVa = (PVOID)((ULONG_PTR)BaseVa + PAGE_SIZE))
392 {
393 Entry = BaseVa;
394
395 /* Check whether we are beyond expansion */
396 if (BaseVa >= MmNonPagedPoolExpansionStart)
397 {
398 break;
399 }
400
401 /* Check if allocation is valid */
402 if (!MmIsAddressValid(BaseVa))
403 {
404 continue;
405 }
406
407 for (Entry = BaseVa;
408 (ULONG_PTR)Entry + sizeof(POOL_HEADER) < (ULONG_PTR)BaseVa + PAGE_SIZE;
409 Entry = (PVOID)((ULONG_PTR)Entry + 8))
410 {
411 /* Try to find whether we have a pool entry */
412 if (!ExpKdbgExtValidatePoolHeader(BaseVa, Entry, NonPagedPool))
413 {
414 continue;
415 }
416
417 if ((Entry->PoolTag & Mask) == (Tag & Mask))
418 {
419 if (FoundCallback != NULL)
420 {
421 FoundCallback(Entry, CallbackContext);
422 }
423 else
424 {
425 /* Print the line */
426 KdbpPrint("%p size: %4d previous size: %4d %s %.4s\n",
427 Entry, Entry->BlockSize, Entry->PreviousSize,
428 Entry->PoolType ? "(Allocated)" : "(Free) ",
429 (PCHAR)&Entry->PoolTag);
430 }
431 }
432 }
433 }
434}
435
438 ULONG Argc,
439 PCHAR Argv[])
440{
441 ULONG Tag = 0;
442 ULONG Mask = 0;
444
445 if (Argc == 1)
446 {
447 KdbpPrint("Specify a tag string\n");
448 return TRUE;
449 }
450
451 /* First arg is tag */
452 if (strlen(Argv[1]) != 1 || Argv[1][0] != '*')
453 {
454 ExpKdbgExtPoolUsedGetTag(Argv[1], &Tag, &Mask);
455 }
456
457 /* Second arg might be pool to search */
458 if (Argc > 2)
459 {
460 PoolType = strtoul(Argv[2], NULL, 0);
461
462 if (PoolType > 1)
463 {
464 KdbpPrint("Only (non) paged pool are supported\n");
465 return TRUE;
466 }
467 }
468
469 /* First search for large allocations */
470 ExpKdbgExtPoolFindLargePool(Tag, Mask, NULL, NULL);
471
472 if (PoolType == NonPagedPool)
473 {
474 ExpKdbgExtPoolFindNonPagedPool(Tag, Mask, NULL, NULL);
475 }
476 else if (PoolType == PagedPool)
477 {
478 ExpKdbgExtPoolFindPagedPool(Tag, Mask, NULL, NULL);
479 }
480
481 return TRUE;
482}
483
484VOID
485NTAPI
486ExpKdbgExtIrpFindPrint(
489{
490 PIRP Irp;
491 BOOLEAN IsComplete = FALSE;
492 PIRP_FIND_CTXT FindCtxt = Context;
493 PIO_STACK_LOCATION IoStack = NULL;
494 PUNICODE_STRING DriverName = NULL;
495 ULONG_PTR SData = FindCtxt->SData;
496 ULONG Criteria = FindCtxt->Criteria;
497
498 /* Free entry, ignore */
499 if (Entry->PoolType == 0)
500 {
501 return;
502 }
503
504 /* Get the IRP */
506
507 /* Bail out if not matching restart address */
508 if ((ULONG_PTR)Irp < FindCtxt->RestartAddress)
509 {
510 return;
511 }
512
513 /* Avoid bogus IRP stack locations */
514 if (Irp->CurrentLocation <= Irp->StackCount + 1)
515 {
517
518 /* Get associated driver */
519 if (IoStack->DeviceObject && IoStack->DeviceObject->DriverObject)
520 DriverName = &IoStack->DeviceObject->DriverObject->DriverName;
521 }
522 else
523 {
524 IsComplete = TRUE;
525 }
526
527 /* Display if: no data, no criteria or if criteria matches data */
528 if (SData == 0 || Criteria == 0 ||
529 (Criteria & 0x1 && IoStack && SData == (ULONG_PTR)IoStack->DeviceObject) ||
530 (Criteria & 0x2 && SData == (ULONG_PTR)Irp->Tail.Overlay.OriginalFileObject) ||
531 (Criteria & 0x4 && Irp->MdlAddress && SData == (ULONG_PTR)Irp->MdlAddress->Process) ||
532 (Criteria & 0x8 && SData == (ULONG_PTR)Irp->Tail.Overlay.Thread) ||
533 (Criteria & 0x10 && SData == (ULONG_PTR)Irp->UserEvent))
534 {
535 if (!IsComplete)
536 {
537 KdbpPrint("%p Thread %p current stack (%x, %x) belongs to %wZ\n", Irp, Irp->Tail.Overlay.Thread, IoStack->MajorFunction, IoStack->MinorFunction, DriverName);
538 }
539 else
540 {
541 KdbpPrint("%p Thread %p is complete (CurrentLocation %d > StackCount %d)\n", Irp, Irp->Tail.Overlay.Thread, Irp->CurrentLocation, Irp->StackCount + 1);
542 }
543 }
544}
545
548 ULONG Argc,
549 PCHAR Argv[])
550{
552 IRP_FIND_CTXT FindCtxt;
553
554 /* Pool type */
555 if (Argc > 1)
556 {
557 PoolType = strtoul(Argv[1], NULL, 0);
558
559 if (PoolType > 1)
560 {
561 KdbpPrint("Only (non) paged pool are supported\n");
562 return TRUE;
563 }
564 }
565
566 RtlZeroMemory(&FindCtxt, sizeof(IRP_FIND_CTXT));
567
568 /* Restart address */
569 if (Argc > 2)
570 {
571 if (!KdbpGetHexNumber(Argv[2], &FindCtxt.RestartAddress))
572 {
573 KdbpPrint("Invalid parameter: %s\n", Argv[2]);
574 FindCtxt.RestartAddress = 0;
575 }
576 }
577
578 if (Argc > 4)
579 {
580 if (!KdbpGetHexNumber(Argv[4], &FindCtxt.SData))
581 {
582 FindCtxt.SData = 0;
583 }
584 else
585 {
586 if (strcmp(Argv[3], "device") == 0)
587 {
588 FindCtxt.Criteria = 0x1;
589 }
590 else if (strcmp(Argv[3], "fileobject") == 0)
591 {
592 FindCtxt.Criteria = 0x2;
593 }
594 else if (strcmp(Argv[3], "mdlprocess") == 0)
595 {
596 FindCtxt.Criteria = 0x4;
597 }
598 else if (strcmp(Argv[3], "thread") == 0)
599 {
600 FindCtxt.Criteria = 0x8;
601 }
602 else if (strcmp(Argv[3], "userevent") == 0)
603 {
604 FindCtxt.Criteria = 0x10;
605 }
606 else if (strcmp(Argv[3], "arg") == 0)
607 {
608 FindCtxt.Criteria = 0x1f;
609 }
610 }
611 }
612
613 if (PoolType == NonPagedPool)
614 {
615 ExpKdbgExtPoolFindNonPagedPool(TAG_IRP, 0xFFFFFFFF, ExpKdbgExtIrpFindPrint, &FindCtxt);
616 }
617 else if (PoolType == PagedPool)
618 {
619 ExpKdbgExtPoolFindPagedPool(TAG_IRP, 0xFFFFFFFF, ExpKdbgExtIrpFindPrint, &FindCtxt);
620 }
621
622 return TRUE;
623}
624
625#endif // DBG && defined(KDBG)
626
627/* EOF */
static PIO_STACK_LOCATION IoGetCurrentIrpStackLocation(PIRP Irp)
struct _IRP * PIRP
#define BASE_POOL_TYPE_MASK
Definition: ExPools.c:15
unsigned char BOOLEAN
int strcmp(const char *String1, const char *String2)
Definition: utclib.c:469
UINT32 strtoul(const char *String, char **Terminator, UINT32 Base)
Definition: utclib.c:696
ACPI_SIZE strlen(const char *String)
Definition: utclib.c:269
_In_ PIRP Irp
Definition: csq.h:116
#define RtlFindSetBits
Definition: dbgbitmap.h:340
#define Len
Definition: deflate.h:82
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define ULONG_PTR
Definition: config.h:101
#define PAGE_SIZE
Definition: env_spec_w32.h:49
#define PAGE_SHIFT
Definition: env_spec_w32.h:45
#define NonPagedPool
Definition: env_spec_w32.h:307
#define PagedPool
Definition: env_spec_w32.h:308
unsigned int Mask
Definition: fpcontrol.c:82
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
VOID KdbpPrint(_In_ PSTR Format, _In_ ...)
Prints the given string with printf-like formatting.
Definition: kdb_cli.c:3081
BOOLEAN NTAPI KdbpGetHexNumber(IN PCHAR pszNum, OUT ULONG_PTR *pulValue)
Definition: kdb_cli.c:450
BOOLEAN ExpKdbgExtPool(ULONG Argc, PCHAR Argv[])
BOOLEAN ExpKdbgExtPoolFind(ULONG Argc, PCHAR Argv[])
BOOLEAN ExpKdbgExtIrpFind(ULONG Argc, PCHAR Argv[])
BOOLEAN ExpKdbgExtPoolUsed(ULONG Argc, PCHAR Argv[])
PVOID MmPagedPoolStart
Definition: miarm.h:574
PVOID MmNonPagedPoolEnd
Definition: mminit.c:99
MM_PAGED_POOL_INFO MmPagedPoolInfo
Definition: pool.c:25
BOOLEAN NTAPI MmIsAddressValid(IN PVOID VirtualAddress)
Definition: mmsup.c:174
#define MiAddressToPde(x)
Definition: mmx86.c:20
PVOID MmNonPagedPoolExpansionStart
Definition: init.c:25
PVOID MmNonPagedPoolStart
Definition: init.c:24
PVOID MmPagedPoolEnd
Definition: init.c:26
#define POOL_BLOCK(x, i)
Definition: kdbg.c:37
#define POOL_FREE_BLOCK(x)
Definition: kdbg.c:36
SIZE_T PoolBigPageTableSize
Definition: expool.c:47
VOID MiDumpPoolConsumers(BOOLEAN CalledFromDbg, ULONG Tag, ULONG Mask, ULONG Flags)
PPOOL_TRACKER_BIG_PAGES PoolBigPageTable
Definition: expool.c:50
struct _IRP_FIND_CTXT * PIRP_FIND_CTXT
#define POOL_BIG_TABLE_ENTRY_FREE
Definition: kdbg.c:32
PVOID MmNonPagedPoolEnd0
Definition: pool.c:22
struct _IRP_FIND_CTXT IRP_FIND_CTXT
unsigned short USHORT
Definition: pedump.c:61
static WCHAR Address[46]
Definition: ping.c:68
base of all file and directory entries
Definition: entries.h:83
PDEVICE_OBJECT DeviceObject
Definition: iotypes.h:3223
ULONG_PTR RestartAddress
Definition: kdbg.c:23
ULONG_PTR SData
Definition: kdbg.c:24
ULONG Criteria
Definition: kdbg.c:25
PRTL_BITMAP PagedPoolAllocationMap
Definition: mm.h:486
PMMPDE NextPdeForPagedPoolExpansion
Definition: mm.h:490
uint32_t * PULONG
Definition: typedefs.h:59
INT POOL_TYPE
Definition: typedefs.h:78
#define NTAPI
Definition: typedefs.h:36
void * PVOID
Definition: typedefs.h:50
ULONG_PTR SIZE_T
Definition: typedefs.h:80
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262
uint32_t ULONG_PTR
Definition: typedefs.h:65
uint32_t ULONG
Definition: typedefs.h:59
char * PCHAR
Definition: typedefs.h:51
#define TAG_IRP
Definition: vfat.h:548
_Must_inspect_result_ _In_ WDFDEVICE _In_ BOOLEAN _In_opt_ PVOID Tag
Definition: wdfdevice.h:4065
_Must_inspect_result_ _In_ WDFDEVICE _In_ DEVICE_REGISTRY_PROPERTY _In_ _Strict_type_match_ POOL_TYPE PoolType
Definition: wdfdevice.h:3815
_IRQL_requires_same_ typedef _In_ ULONG _In_ UCHAR _In_ ULONGLONG _In_ ULONGLONG _In_opt_ PEVENT_FILTER_DESCRIPTOR _Inout_opt_ PVOID CallbackContext
Definition: wmitypes.h:60
_Must_inspect_result_ _In_ ULONG Flags
Definition: wsk.h:170
#define PAGE_ALIGN(Va)
char CHAR
Definition: xmlstorage.h:175