Fix the Release build by marking MmPageArraySize as unreferenced.
[reactos.git] / reactos / ntoskrnl / include / internal / mm.h
index b897fb7..39686a1 100644 (file)
@@ -56,6 +56,12 @@ typedef ULONG PFN_TYPE, *PPFN_TYPE;
 #define MM_PAGEOP_PAGESYNCH                 (3)
 #define MM_PAGEOP_ACCESSFAULT               (4)
 
+/* Number of list heads to use */
+#define MI_FREE_POOL_LISTS 4
+
+/* Signature of free pool blocks */
+#define MM_FREE_POOL_TAG    TAG('F', 'r', 'p', 'l')
+
 #define PAGE_TO_SECTION_PAGE_DIRECTORY_OFFSET(x) \
     ((x) / (4*1024*1024))
 
@@ -248,9 +254,9 @@ typedef struct _MADDRESS_SPACE
 {
     PMEMORY_AREA MemoryAreaRoot;
     PVOID LowestAddress;
-    struct _EPROCESS* Process;
+    PEPROCESS Process;
     PUSHORT PageTableRefCountTable;
-    ULONG PageTableRefCountTableSize;
+    PEX_PUSH_LOCK Lock;
 } MADDRESS_SPACE, *PMADDRESS_SPACE;
 
 typedef struct
@@ -275,6 +281,8 @@ typedef struct _PHYSICAL_PAGE
             ULONG Type: 2;
             ULONG Consumer: 3;
             ULONG Zero: 1;
+            ULONG StartOfAllocation: 1;
+            ULONG EndOfAllocation: 1;
         }
         Flags;
         ULONG AllFlags;
@@ -337,6 +345,28 @@ typedef struct _MM_REGION
     LIST_ENTRY RegionListEntry;
 } MM_REGION, *PMM_REGION;
 
+/* Entry describing free pool memory */
+typedef struct _MMFREE_POOL_ENTRY
+{
+    LIST_ENTRY List;
+    PFN_NUMBER Size;
+    ULONG Signature;
+    struct _MMFREE_POOL_ENTRY *Owner;
+} MMFREE_POOL_ENTRY, *PMMFREE_POOL_ENTRY;
+
+/* Paged pool information */
+typedef struct _MM_PAGED_POOL_INFO
+{  
+    PRTL_BITMAP PagedPoolAllocationMap;
+    PRTL_BITMAP EndOfPagedPoolBitmap;
+    PMMPTE FirstPteForPagedPool;
+    PMMPTE LastPteForPagedPool;
+    PMMPTE NextPdeForPagedPoolExpansion;
+    ULONG PagedPoolHint;
+    SIZE_T PagedPoolCommit;
+    SIZE_T AllocatedPagedPool;
+} MM_PAGED_POOL_INFO, *PMM_PAGED_POOL_INFO;
+
 extern MM_MEMORY_CONSUMER MiMemoryConsumers[MC_MAXIMUM];
 
 typedef VOID
@@ -362,26 +392,10 @@ typedef VOID
 
 /* aspace.c ******************************************************************/
 
-VOID
-NTAPI
-MmLockAddressSpace(PMADDRESS_SPACE AddressSpace);
-
-VOID
-NTAPI
-MmUnlockAddressSpace(PMADDRESS_SPACE AddressSpace);
-
 VOID
 NTAPI
 MmInitializeKernelAddressSpace(VOID);
 
-PMADDRESS_SPACE
-NTAPI
-MmGetCurrentAddressSpace(VOID);
-
-PMADDRESS_SPACE
-NTAPI
-MmGetKernelAddressSpace(VOID);
-
 NTSTATUS
 NTAPI
 MmInitializeAddressSpace(
@@ -473,6 +487,13 @@ MmReleaseMemoryAreaIfDecommitted(
     PVOID BaseAddress
 );
 
+VOID
+NTAPI
+MmMapMemoryArea(PVOID BaseAddress,
+                ULONG Length,
+                ULONG Consumer,
+                ULONG Protection);
+
 /* npool.c *******************************************************************/
 
 VOID
@@ -487,6 +508,25 @@ VOID
 NTAPI
 MiInitializeNonPagedPool(VOID);
 
+PVOID
+NTAPI
+MiAllocatePoolPages(
+    IN POOL_TYPE PoolType,
+    IN SIZE_T SizeInBytes
+);
+
+POOL_TYPE
+NTAPI
+MmDeterminePoolType(
+    IN PVOID VirtualAddress
+);
+
+ULONG
+NTAPI
+MiFreePoolPages(
+    IN PVOID StartingAddress
+);
+
 PVOID
 NTAPI
 MmGetMdlPageAddress(
@@ -936,6 +976,32 @@ MmPageOutPhysicalAddress(PFN_TYPE Page);
 
 /* freelist.c **********************************************************/
 
+#define ASSERT_PFN(x) ASSERT((x)->Flags.Type != 0)
+
+FORCEINLINE
+PPHYSICAL_PAGE
+MiGetPfnEntry(IN PFN_TYPE Pfn)
+{
+    PPHYSICAL_PAGE Page;
+    extern PPHYSICAL_PAGE MmPageArray;
+    extern ULONG MmPageArraySize;
+
+    /* Mark MmPageArraySize as unreferenced, otherwise it will appear as an unused variable on a Release build */
+    UNREFERENCED_PARAMETER(MmPageArraySize);
+
+    /* Make sure the PFN number is valid */
+    ASSERT(Pfn <= MmPageArraySize);
+
+    /* Get the entry */
+    Page = &MmPageArray[Pfn];
+
+    /* Make sure it's valid */
+    ASSERT_PFN(Page);
+
+    /* Return it */
+    return Page;
+};
+
 PFN_TYPE
 NTAPI
 MmGetLRUNextUserPage(PFN_TYPE PreviousPage);
@@ -946,7 +1012,11 @@ MmGetLRUFirstUserPage(VOID);
 
 VOID
 NTAPI
-MmSetLRULastPage(PFN_TYPE Page);
+MmInsertLRULastUserPage(PFN_TYPE Page);
+
+VOID
+NTAPI
+MmRemoveLRUUserPage(PFN_TYPE Page);
 
 VOID
 NTAPI
@@ -1501,4 +1571,37 @@ MiSyncThreadProcessViews(IN PVOID Process,
     MmUpdatePageDir((PEPROCESS)Process, Address, Size);
 }
 
+
+extern MADDRESS_SPACE MmKernelAddressSpace;
+
+FORCEINLINE
+VOID
+MmLockAddressSpace(PMADDRESS_SPACE AddressSpace)
+{
+    KeEnterCriticalRegion();
+    ExAcquirePushLockExclusive(AddressSpace->Lock);
+}
+
+FORCEINLINE
+VOID
+MmUnlockAddressSpace(PMADDRESS_SPACE AddressSpace)
+{
+    ExReleasePushLock(AddressSpace->Lock);
+    KeLeaveCriticalRegion();
+}
+
+FORCEINLINE
+PMADDRESS_SPACE
+MmGetCurrentAddressSpace(VOID)
+{
+    return (PMADDRESS_SPACE)&((PEPROCESS)KeGetCurrentThread()->ApcState.Process)->VadRoot;
+}
+
+FORCEINLINE
+PMADDRESS_SPACE
+MmGetKernelAddressSpace(VOID)
+{
+    return &MmKernelAddressSpace;
+}
+
 #endif