- 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:
ReactOS Portable Systems Group 2009-06-27 09:54:56 +00:00
parent a932210bfa
commit fea1ac4782
4 changed files with 106 additions and 1 deletions

View file

@ -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 */

View file

@ -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(

View file

@ -85,6 +85,10 @@ KdpServiceDispatcher(ULONG Service,
case EnterDebugger:
DbgBreakPoint();
break;
case ThatsWhatSheSaid:
MmDumpPfnDatabase();
break;
default:
break;

View file

@ -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)