//
// ReactOS to NT Physical Page Descriptor Entry Legacy Mapping Definitions
//
-// REACTOS NT
-//
-#define Consumer PageLocation
-#define Type CacheAttribute
-#define Zero PrototypePte
-#define LockCount u3.e1.PageColor
-#define RmapListHead AweReferenceCount
-#define SavedSwapEntry u4.EntireFrame
-#define Flags u3.e1
-#define ReferenceCount u3.ReferenceCount
-#define RemoveEntryList(x) RemoveEntryList((PLIST_ENTRY)x)
-#define InsertTailList(x, y) InsertTailList(x, (PLIST_ENTRY)y)
-#define ListEntry u1
-#define PHYSICAL_PAGE MMPFN
-#define PPHYSICAL_PAGE PMMPFN
-
-PPHYSICAL_PAGE MmPfnDatabase;
+
+typedef union
+{
+ MMPFN Pfn;
+
+ struct
+ {
+ LIST_ENTRY ListEntry; // 0x000
+ ULONG_PTR RmapListHead; // 0x008
+ USHORT ReferenceCount; // 0x00C
+ struct // 0x00$
+ {
+ USHORT _unused1:1;
+ USHORT StartOfAllocation:1;
+ USHORT EndOfAllocation:1;
+ USHORT Zero:1;
+ USHORT LockCount:4;
+ USHORT Consumer:3;
+ USHORT _unused2:1;
+ USHORT Type:2;
+ USHORT _unused3:1;
+ USHORT _unused4:1;
+ } Flags;
+ LONG MapCount; // 0x10
+ ULONG_PTR SavedSwapEntry; // 0x018
+ };
+} PHYSICAL_PAGE, *PPHYSICAL_PAGE;
+
+C_ASSERT(sizeof(PHYSICAL_PAGE) == sizeof(MMPFN));
+
+#define MiGetPfnEntry(Pfn) ((PPHYSICAL_PAGE)MiGetPfnEntry(Pfn))
+#define MiGetPfnEntryIndex(x) MiGetPfnEntryIndex((struct _MMPFN*)x)
+#define LockCount Flags.LockCount
+
+PMMPFN MmPfnDatabase;
+#define MmPfnDatabase ((PPHYSICAL_PAGE)MmPfnDatabase)
+
+#define MMPFN PHYSICAL_PAGE
+#define PMMPFN PPHYSICAL_PAGE
ULONG MmAvailablePages;
ULONG MmResidentAvailablePages;
/* FUNCTIONS *************************************************************/
-PFN_TYPE
+PFN_NUMBER
NTAPI
MmGetLRUFirstUserPage(VOID)
{
return 0;
}
PageDescriptor = CONTAINING_RECORD(NextListEntry, PHYSICAL_PAGE, ListEntry);
- ASSERT_PFN(PageDescriptor);
+ ASSERT_PFN(&PageDescriptor->Pfn);
KeReleaseQueuedSpinLock(LockQueuePfnLock, oldIrql);
return PageDescriptor - MmPfnDatabase;
}
VOID
NTAPI
-MmInsertLRULastUserPage(PFN_TYPE Pfn)
+MmInsertLRULastUserPage(PFN_NUMBER Pfn)
{
KIRQL oldIrql;
PPHYSICAL_PAGE Page;
KeReleaseQueuedSpinLock(LockQueuePfnLock, oldIrql);
}
-PFN_TYPE
+PFN_NUMBER
NTAPI
-MmGetLRUNextUserPage(PFN_TYPE PreviousPfn)
+MmGetLRUNextUserPage(PFN_NUMBER PreviousPfn)
{
PLIST_ENTRY NextListEntry;
PHYSICAL_PAGE* PageDescriptor;
VOID
NTAPI
-MmRemoveLRUUserPage(PFN_TYPE Page)
+MmRemoveLRUUserPage(PFN_NUMBER Page)
{
RemoveEntryList(&MiGetPfnEntry(Page)->ListEntry);
}
NextEntry != &KeLoaderBlock->MemoryDescriptorListHead;
NextEntry = NextEntry->Flink)
{
-#undef ListEntry
/* Get the descriptor */
Md = CONTAINING_RECORD(NextEntry,
MEMORY_ALLOCATION_DESCRIPTOR,
ListEntry);
-#define ListEntry u1
/* Skip bad memory */
if ((Md->MemoryType == LoaderFirmwarePermanent) ||
VOID
NTAPI
-MmSetRmapListHeadPage(PFN_TYPE Pfn, struct _MM_RMAP_ENTRY* ListHead)
+MmSetRmapListHeadPage(PFN_NUMBER Pfn, struct _MM_RMAP_ENTRY* ListHead)
{
KIRQL oldIrql;
oldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock);
- MiGetPfnEntry(Pfn)->RmapListHead = (LONG)ListHead;
+ MiGetPfnEntry(Pfn)->RmapListHead = (LONG_PTR)ListHead;
KeReleaseQueuedSpinLock(LockQueuePfnLock, oldIrql);
}
struct _MM_RMAP_ENTRY*
NTAPI
-MmGetRmapListHeadPage(PFN_TYPE Pfn)
+MmGetRmapListHeadPage(PFN_NUMBER Pfn)
{
KIRQL oldIrql;
struct _MM_RMAP_ENTRY* ListHead;
VOID
NTAPI
-MmSetSavedSwapEntryPage(PFN_TYPE Pfn, SWAPENTRY SwapEntry)
+MmSetSavedSwapEntryPage(PFN_NUMBER Pfn, SWAPENTRY SwapEntry)
{
KIRQL oldIrql;
SWAPENTRY
NTAPI
-MmGetSavedSwapEntryPage(PFN_TYPE Pfn)
+MmGetSavedSwapEntryPage(PFN_NUMBER Pfn)
{
SWAPENTRY SwapEntry;
KIRQL oldIrql;
VOID
NTAPI
-MmReferencePage(PFN_TYPE Pfn)
+MmReferencePage(PFN_NUMBER Pfn)
{
PPHYSICAL_PAGE Page;
ULONG
NTAPI
-MmGetReferenceCountPage(PFN_TYPE Pfn)
+MmGetReferenceCountPage(PFN_NUMBER Pfn)
{
KIRQL oldIrql;
ULONG RCount;
BOOLEAN
NTAPI
-MmIsPageInUse(PFN_TYPE Pfn)
+MmIsPageInUse(PFN_NUMBER Pfn)
{
DPRINT("MmIsPageInUse(PhysicalAddress %x)\n", Pfn << PAGE_SHIFT);
VOID
NTAPI
-MmDereferencePage(PFN_TYPE Pfn)
+MmDereferencePage(PFN_NUMBER Pfn)
{
PPHYSICAL_PAGE Page;
{
MmAvailablePages++;
if (Page->Flags.Consumer == MC_USER) RemoveEntryList(&Page->ListEntry);
- if (Page->RmapListHead != (LONG)NULL)
+ if (Page->RmapListHead != (LONG_PTR)NULL)
{
DPRINT1("Freeing page with rmap entries.\n");
KeBugCheck(MEMORY_MANAGEMENT);
ULONG
NTAPI
-MmGetLockCountPage(PFN_TYPE Pfn)
+MmGetLockCountPage(PFN_NUMBER Pfn)
{
KIRQL oldIrql;
ULONG CurrentLockCount;
VOID
NTAPI
-MmLockPage(PFN_TYPE Pfn)
+MmLockPage(PFN_NUMBER Pfn)
{
PPHYSICAL_PAGE Page;
VOID
NTAPI
-MmUnlockPage(PFN_TYPE Pfn)
+MmUnlockPage(PFN_NUMBER Pfn)
{
PPHYSICAL_PAGE Page;
Page->LockCount--;
}
-PFN_TYPE
+PFN_NUMBER
NTAPI
MmAllocPage(ULONG Consumer, SWAPENTRY SwapEntry)
{
- PFN_TYPE PfnOffset;
+ PFN_NUMBER PfnOffset;
PLIST_ENTRY ListEntry;
PPHYSICAL_PAGE PageDescriptor;
BOOLEAN NeedClear = FALSE;
NTSTATUS
NTAPI
-MiZeroPage(PFN_TYPE Page)
+MiZeroPage(PFN_NUMBER Page)
{
KIRQL Irql;
PVOID TempAddress;
KIRQL oldIrql;
PLIST_ENTRY ListEntry;
PPHYSICAL_PAGE PageDescriptor;
- PFN_TYPE Pfn;
+ PFN_NUMBER Pfn;
ULONG Count;
/* Free initial kernel memory */