#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))
{
PMEMORY_AREA MemoryAreaRoot;
PVOID LowestAddress;
- struct _EPROCESS* Process;
+ PEPROCESS Process;
PUSHORT PageTableRefCountTable;
- ULONG PageTableRefCountTableSize;
+ PEX_PUSH_LOCK Lock;
} MADDRESS_SPACE, *PMADDRESS_SPACE;
typedef struct
ULONG Type: 2;
ULONG Consumer: 3;
ULONG Zero: 1;
+ ULONG StartOfAllocation: 1;
+ ULONG EndOfAllocation: 1;
}
Flags;
ULONG AllFlags;
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
/* 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(
PVOID BaseAddress
);
+VOID
+NTAPI
+MmMapMemoryArea(PVOID BaseAddress,
+ ULONG Length,
+ ULONG Consumer,
+ ULONG Protection);
+
/* npool.c *******************************************************************/
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(
/* 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);
VOID
NTAPI
-MmSetLRULastPage(PFN_TYPE Page);
+MmInsertLRULastUserPage(PFN_TYPE Page);
+
+VOID
+NTAPI
+MmRemoveLRUUserPage(PFN_TYPE Page);
VOID
NTAPI
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