} 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))
return TRUE;
}
+static
+VOID
+ExpKdbgExtPoolFindLargePool(
+ ULONG Tag,
+ ULONG Mask,
+ VOID (NTAPI* FoundCallback)(PVOID, PVOID),
+ PVOID CallbackContext)
+{
+ 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))
+ {
+ if (FoundCallback != NULL)
+ {
+ FoundCallback(PoolBigPageTable[i].Va, CallbackContext);
+ }
+ else
+ {
+ /* 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(
}
}
- /* FIXME: What about large pool? */
+ /* First search for large allocations */
+ ExpKdbgExtPoolFindLargePool(Tag, Mask, NULL, NULL);
if (PoolType == NonPagedPool)
{
PVOID Context)
{
PIRP Irp;
+ BOOLEAN IsComplete = FALSE;
PIRP_FIND_CTXT FindCtxt = Context;
PIO_STACK_LOCATION IoStack = NULL;
- PUNICODE_STRING DriverName;
+ PUNICODE_STRING DriverName = NULL;
ULONG_PTR SData = FindCtxt->SData;
ULONG Criteria = FindCtxt->Criteria;
/* Get associated driver */
if (IoStack->DeviceObject && IoStack->DeviceObject->DriverObject)
DriverName = &IoStack->DeviceObject->DriverObject->DriverName;
- else
- DriverName = NULL;
+ }
+ else
+ {
+ IsComplete = TRUE;
}
/* Display if: no data, no criteria or if criteria matches data */
(Criteria & 0x8 && SData == (ULONG_PTR)Irp->Tail.Overlay.Thread) ||
(Criteria & 0x10 && SData == (ULONG_PTR)Irp->UserEvent))
{
- KdbpPrint("%p Thread %p current stack belongs to %wZ\n", Irp, Irp->Tail.Overlay.Thread, DriverName);
+ if (!IsComplete)
+ {
+ KdbpPrint("%p Thread %p current stack (%x, %x) belongs to %wZ\n", Irp, Irp->Tail.Overlay.Thread, IoStack->MajorFunction, IoStack->MinorFunction, DriverName);
+ }
+ else
+ {
+ KdbpPrint("%p Thread %p is complete (CurrentLocation %d > StackCount %d)\n", Irp, Irp->Tail.Overlay.Thread, Irp->CurrentLocation, Irp->StackCount + 1);
+ }
}
}