https://git.reactos.org/?p=reactos.git;a=commitdiff;h=a3f8813fff8c89737aada…
commit a3f8813fff8c89737aadadd22dacfd8338e9eeb0
Author: Pierre Schweitzer <pierre(a)reactos.org>
AuthorDate: Tue Jan 8 08:42:51 2019 +0100
Commit: Pierre Schweitzer <pierre(a)reactos.org>
CommitDate: Tue Jan 8 08:43:23 2019 +0100
[NTOSKRNL] Add support for large allocations in !poolfind
---
ntoskrnl/mm/ARM3/kdbg.c | 35 ++++++++++++++++++++++++++++++++++-
1 file changed, 34 insertions(+), 1 deletion(-)
diff --git a/ntoskrnl/mm/ARM3/kdbg.c b/ntoskrnl/mm/ARM3/kdbg.c
index ebaf494df6..e3a9ef3adf 100644
--- a/ntoskrnl/mm/ARM3/kdbg.c
+++ b/ntoskrnl/mm/ARM3/kdbg.c
@@ -26,6 +26,10 @@ typedef struct _IRP_FIND_CTXT
} IRP_FIND_CTXT, *PIRP_FIND_CTXT;
extern PVOID MmNonPagedPoolEnd0;
+extern SIZE_T PoolBigPageTableSize;
+extern PPOOL_TRACKER_BIG_PAGES PoolBigPageTable;
+
+#define POOL_BIG_TABLE_ENTRY_FREE 0x1
/* Pool block/header/list access macros */
#define POOL_ENTRY(x) (PPOOL_HEADER)((ULONG_PTR)(x) - sizeof(POOL_HEADER))
@@ -210,6 +214,34 @@ ExpKdbgExtPoolUsed(
return TRUE;
}
+static
+VOID
+ExpKdbgExtPoolFindLargePool(
+ ULONG Tag,
+ ULONG Mask)
+{
+ ULONG i;
+
+ KdbpPrint("Scanning large pool allocation table for Tag: %.4s (%p : %p)\n",
(PCHAR)&Tag, &PoolBigPageTable[0], &PoolBigPageTable[PoolBigPageTableSize -
1]);
+
+ for (i = 0; i < PoolBigPageTableSize; i++)
+ {
+ /* Free entry? */
+ if ((ULONG_PTR)PoolBigPageTable[i].Va & POOL_BIG_TABLE_ENTRY_FREE)
+ {
+ continue;
+ }
+
+ if ((PoolBigPageTable[i].Key & Mask) == (Tag & Mask))
+ {
+ /* Print the line */
+ KdbpPrint("%p: tag %.4s, size: %I64x\n",
+ PoolBigPageTable[i].Va, (PCHAR)&PoolBigPageTable[i].Key,
+ PoolBigPageTable[i].NumberOfPages << PAGE_SHIFT);
+ }
+ }
+}
+
static
BOOLEAN
ExpKdbgExtValidatePoolHeader(
@@ -423,7 +455,8 @@ ExpKdbgExtPoolFind(
}
}
- /* FIXME: What about large pool? */
+ /* First search for large allocations */
+ ExpKdbgExtPoolFindLargePool(Tag, Mask);
if (PoolType == NonPagedPool)
{