mirror of
https://github.com/reactos/reactos.git
synced 2025-02-23 08:55:19 +00:00
- This patch is lets you visually dump the entire ReactOS PFN database, useful for debugging. Surprising nobody had done in this in the past, since it wasn't too hard (but it took a bit long to figure out how to get it in there).
- That's what she said. svn path=/trunk/; revision=41639
This commit is contained in:
parent
a932210bfa
commit
fea1ac4782
4 changed files with 106 additions and 1 deletions
|
@ -342,7 +342,8 @@ typedef enum _KDP_DEBUG_SERVICE
|
|||
KdSpare1 = 0x23, /* h */
|
||||
KdSpare2 = 0x17, /* i */
|
||||
KdSpare3 = 0x24, /* j */
|
||||
EnterDebugger = 0x25 /* k */
|
||||
EnterDebugger = 0x25, /* k */
|
||||
ThatsWhatSheSaid = 69 /* FIGURE IT OUT */
|
||||
} KDP_DEBUG_SERVICE;
|
||||
|
||||
/* Dispatch Table for Wrapper Functions */
|
||||
|
|
|
@ -293,6 +293,12 @@ typedef struct
|
|||
ULONG PagingRequestsInLastFifteenMinutes;
|
||||
} MM_STATS;
|
||||
|
||||
//
|
||||
// These two mappings are actually used by Windows itself, based on the ASSERTS
|
||||
//
|
||||
#define StartOfAllocation ReadInProgress
|
||||
#define EndOfAllocation WriteInProgress
|
||||
|
||||
typedef struct _MMPFNENTRY
|
||||
{
|
||||
USHORT Modified:1;
|
||||
|
@ -1120,6 +1126,12 @@ MmInitializePageList(
|
|||
VOID
|
||||
);
|
||||
|
||||
VOID
|
||||
NTAPI
|
||||
MmDumpPfnDatabase(
|
||||
VOID
|
||||
);
|
||||
|
||||
PFN_TYPE
|
||||
NTAPI
|
||||
MmGetContinuousPages(
|
||||
|
|
|
@ -85,6 +85,10 @@ KdpServiceDispatcher(ULONG Service,
|
|||
case EnterDebugger:
|
||||
DbgBreakPoint();
|
||||
break;
|
||||
|
||||
case ThatsWhatSheSaid:
|
||||
MmDumpPfnDatabase();
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
|
|
|
@ -251,6 +251,94 @@ MmAllocEarlyPage(VOID)
|
|||
return Pfn;
|
||||
}
|
||||
|
||||
VOID
|
||||
NTAPI
|
||||
MmDumpPfnDatabase(VOID)
|
||||
{
|
||||
ULONG i;
|
||||
PPHYSICAL_PAGE Pfn1;
|
||||
PCHAR State = "????", Consumer = "Unknown";
|
||||
KIRQL OldIrql;
|
||||
|
||||
OldIrql = KfRaiseIrql(HIGH_LEVEL);
|
||||
|
||||
//
|
||||
// Loop the PFN database
|
||||
//
|
||||
for (i = 0; i <= MmHighestPhysicalPage; i++)
|
||||
{
|
||||
Pfn1 = MiGetPfnEntry(i);
|
||||
|
||||
//
|
||||
// Get the consumer
|
||||
//
|
||||
switch (Pfn1->Flags.Consumer)
|
||||
{
|
||||
case MC_NPPOOL:
|
||||
|
||||
Consumer = "Nonpaged Pool";
|
||||
break;
|
||||
|
||||
case MC_PPOOL:
|
||||
|
||||
Consumer = "Paged Pool";
|
||||
break;
|
||||
|
||||
case MC_CACHE:
|
||||
|
||||
Consumer = "File System Cache";
|
||||
break;
|
||||
|
||||
case MC_USER:
|
||||
|
||||
Consumer = "Process Working Set";
|
||||
break;
|
||||
|
||||
case MC_SYSTEM:
|
||||
|
||||
Consumer = "System";
|
||||
break;
|
||||
}
|
||||
|
||||
//
|
||||
// Get the type
|
||||
//
|
||||
switch (Pfn1->Flags.Type)
|
||||
{
|
||||
case MM_PHYSICAL_PAGE_USED:
|
||||
|
||||
State = "Used";
|
||||
break;
|
||||
|
||||
case MM_PHYSICAL_PAGE_FREE:
|
||||
|
||||
State = "Free";
|
||||
Consumer = "Free";
|
||||
break;
|
||||
|
||||
case MM_PHYSICAL_PAGE_BIOS:
|
||||
|
||||
State = "BIOS";
|
||||
Consumer = "System Reserved";
|
||||
break;
|
||||
}
|
||||
|
||||
//
|
||||
// Pretty-print the page
|
||||
//
|
||||
DbgPrint("0x%08p:\t%04s\t%20s\t(%02d.%02d.%02d) [%08p])\n",
|
||||
i << PAGE_SHIFT,
|
||||
State,
|
||||
Consumer,
|
||||
Pfn1->ReferenceCount,
|
||||
Pfn1->MapCount,
|
||||
Pfn1->LockCount,
|
||||
Pfn1->RmapListHead);
|
||||
}
|
||||
|
||||
KeLowerIrql(OldIrql);
|
||||
}
|
||||
|
||||
VOID
|
||||
NTAPI
|
||||
MmInitializePageList(VOID)
|
||||
|
|
Loading…
Reference in a new issue