Fix the Release build by marking MmPageArraySize as unreferenced.
[reactos.git] / reactos / ntoskrnl / include / internal / mm.h
index 2a95790..39686a1 100644 (file)
@@ -5,7 +5,7 @@
 
 /* TYPES *********************************************************************/
 
-struct _ROS_EPROCESS;
+struct _EPROCESS;
 
 extern ULONG MiFreeSwapPages;
 extern ULONG MiUsedSwapPages;
@@ -13,10 +13,16 @@ extern ULONG MmPagedPoolSize;
 extern ULONG MmTotalPagedPoolQuota;
 extern ULONG MmTotalNonPagedPoolQuota;
 extern PHYSICAL_ADDRESS MmSharedDataPagePhysicalAddress;
+extern ULONG MmNumberOfPhysicalPages;
 
 extern PVOID MmPagedPoolBase;
 extern ULONG MmPagedPoolSize;
 
+extern PMEMORY_ALLOCATION_DESCRIPTOR MiFreeDescriptor;
+extern MEMORY_ALLOCATION_DESCRIPTOR MiFreeDescriptorOrg;
+extern ULONG MmHighestPhysicalPage;
+extern PVOID MmPfnDatabase;
+
 struct _KTRAP_FRAME;
 struct _EPROCESS;
 struct _MM_RMAP_ENTRY;
@@ -50,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))
 
@@ -60,11 +72,10 @@ typedef ULONG PFN_TYPE, *PPFN_TYPE;
 #define NR_SECTION_PAGE_ENTRIES             1024
 
 #define TEB_BASE                            0x7FFDE000
-#define KPCR_BASE                           0xFF000000
 
 /* Although Microsoft says this isn't hardcoded anymore,
    they won't be able to change it. Stuff depends on it */
-#define MM_VIRTMEM_GRANULARITY              (64 * 1024) 
+#define MM_VIRTMEM_GRANULARITY              (64 * 1024)
 
 #define STATUS_MM_RESTART_OPERATION         ((NTSTATUS)0xD0000001)
 
@@ -165,12 +176,12 @@ typedef struct
 
 typedef struct _MM_SECTION_SEGMENT
 {
-    LONGLONG FileOffset;
-    ULONG_PTR VirtualAddress;
-    ULONG RawLength;
-    ULONG Length;
+    LONG FileOffset;           /* start offset into the file for image sections */
+    ULONG_PTR VirtualAddress;  /* dtart offset into the address range for image sections */
+    ULONG RawLength;           /* length of the segment which is part of the mapped file */
+    ULONG Length;                      /* absolute length of the segment */
     ULONG Protection;
-    FAST_MUTEX Lock;
+    FAST_MUTEX Lock;           /* lock which protects the page directory */
     ULONG ReferenceCount;
     SECTION_PAGE_DIRECTORY PageDirectory;
     ULONG Flags;
@@ -184,13 +195,14 @@ typedef struct _MM_IMAGE_SECTION_OBJECT
     ULONG_PTR StackReserve;
     ULONG_PTR StackCommit;
     ULONG_PTR EntryPoint;
-    ULONG Subsystem;
-    ULONG ImageCharacteristics;
+    USHORT Subsystem;
+    USHORT ImageCharacteristics;
     USHORT MinorSubsystemVersion;
     USHORT MajorSubsystemVersion;
     USHORT Machine;
     BOOLEAN Executable;
     ULONG NrSegments;
+    ULONG ImageSize;
     PMM_SECTION_SEGMENT Segments;
 } MM_IMAGE_SECTION_OBJECT, *PMM_IMAGE_SECTION_OBJECT;
 
@@ -219,7 +231,6 @@ typedef struct _MEMORY_AREA
     ULONG Type;
     ULONG Protect;
     ULONG Flags;
-    ULONG LockCount;
     BOOLEAN DeleteInProgress;
     ULONG PageOpCount;
     union
@@ -242,18 +253,16 @@ typedef struct _MEMORY_AREA
 typedef struct _MADDRESS_SPACE
 {
     PMEMORY_AREA MemoryAreaRoot;
-    FAST_MUTEX Lock;
     PVOID LowestAddress;
-    struct _ROS_EPROCESS* Process;
+    PEPROCESS Process;
     PUSHORT PageTableRefCountTable;
-    ULONG PageTableRefCountTableSize;
+    PEX_PUSH_LOCK Lock;
 } MADDRESS_SPACE, *PMADDRESS_SPACE;
 
 typedef struct
 {
     ULONG NrTotalPages;
     ULONG NrSystemPages;
-    ULONG NrReservedPages;
     ULONG NrUserPages;
     ULONG NrFreePages;
     ULONG NrDirtyPages;
@@ -263,6 +272,31 @@ typedef struct
     ULONG PagingRequestsInLastFifteenMinutes;
 } MM_STATS;
 
+typedef struct _PHYSICAL_PAGE
+{
+    union
+    {
+        struct
+        {
+            ULONG Type: 2;
+            ULONG Consumer: 3;
+            ULONG Zero: 1;
+            ULONG StartOfAllocation: 1;
+            ULONG EndOfAllocation: 1;
+        }
+        Flags;
+        ULONG AllFlags;
+    };
+    
+    LIST_ENTRY ListEntry;
+    ULONG ReferenceCount;
+    SWAPENTRY SavedSwapEntry;
+    ULONG LockCount;
+    ULONG MapCount;
+    struct _MM_RMAP_ENTRY* RmapListHead;
+}
+PHYSICAL_PAGE, *PPHYSICAL_PAGE;
+
 extern MM_STATS MmStats;
 
 typedef struct _MM_PAGEOP
@@ -311,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
@@ -334,35 +390,16 @@ typedef VOID
     BOOLEAN Dirty
 );
 
-
-/* FUNCTIONS */
-
 /* 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(
-    struct _ROS_EPROCESS* Process,
+    struct _EPROCESS* Process,
     PMADDRESS_SPACE AddressSpace);
 
 NTSTATUS
@@ -376,7 +413,7 @@ NTAPI
 MmInitMemoryAreas(VOID);
 
 NTSTATUS
-STDCALL
+NTAPI
 MmCreateMemoryArea(
     PMADDRESS_SPACE AddressSpace,
     ULONG Type,
@@ -390,21 +427,21 @@ MmCreateMemoryArea(
 );
 
 PMEMORY_AREA
-STDCALL
+NTAPI
 MmLocateMemoryAreaByAddress(
     PMADDRESS_SPACE AddressSpace,
     PVOID Address
 );
 
 ULONG_PTR
-STDCALL
+NTAPI
 MmFindGapAtAddress(
     PMADDRESS_SPACE AddressSpace,
     PVOID Address
 );
 
 NTSTATUS
-STDCALL
+NTAPI
 MmFreeMemoryArea(
     PMADDRESS_SPACE AddressSpace,
     PMEMORY_AREA MemoryArea,
@@ -413,7 +450,7 @@ MmFreeMemoryArea(
 );
 
 NTSTATUS
-STDCALL
+NTAPI
 MmFreeMemoryAreaByPtr(
     PMADDRESS_SPACE AddressSpace,
     PVOID BaseAddress,
@@ -422,11 +459,11 @@ MmFreeMemoryAreaByPtr(
 );
 
 VOID
-STDCALL
+NTAPI
 MmDumpMemoryAreas(PMADDRESS_SPACE AddressSpace);
 
 PMEMORY_AREA
-STDCALL
+NTAPI
 MmLocateMemoryAreaByRegion(
     PMADDRESS_SPACE AddressSpace,
     PVOID Address,
@@ -434,7 +471,7 @@ MmLocateMemoryAreaByRegion(
 );
 
 PVOID
-STDCALL
+NTAPI
 MmFindGap(
     PMADDRESS_SPACE AddressSpace,
     ULONG_PTR Length,
@@ -443,13 +480,20 @@ MmFindGap(
 );
 
 VOID
-STDCALL
+NTAPI
 MmReleaseMemoryAreaIfDecommitted(
-    struct _ROS_EPROCESS *Process,
+    struct _EPROCESS *Process,
     PMADDRESS_SPACE AddressSpace,
     PVOID BaseAddress
 );
 
+VOID
+NTAPI
+MmMapMemoryArea(PVOID BaseAddress,
+                ULONG Length,
+                ULONG Consumer,
+                ULONG Protection);
+
 /* npool.c *******************************************************************/
 
 VOID
@@ -464,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(
@@ -474,7 +537,7 @@ MmGetMdlPageAddress(
 /* pool.c *******************************************************************/
 
 PVOID
-STDCALL
+NTAPI
 ExAllocateNonPagedPoolWithTag(
     POOL_TYPE type,
     ULONG size,
@@ -483,7 +546,7 @@ ExAllocateNonPagedPoolWithTag(
 );
 
 PVOID
-STDCALL
+NTAPI
 ExAllocatePagedPoolWithTag(
     POOL_TYPE Type,
     ULONG size,
@@ -491,19 +554,19 @@ ExAllocatePagedPoolWithTag(
 );
 
 VOID
-STDCALL
+NTAPI
 ExFreeNonPagedPool(PVOID block);
 
-VOID 
-STDCALL
+VOID
+NTAPI
 ExFreePagedPool(IN PVOID Block);
 
-VOID 
+VOID
 NTAPI
 MmInitializePagedPool(VOID);
 
 PVOID
-STDCALL
+NTAPI
 MiAllocateSpecialPool(
     IN POOL_TYPE PoolType,
     IN SIZE_T NumberOfBytes,
@@ -512,7 +575,7 @@ MiAllocateSpecialPool(
 );
 
 BOOLEAN
-STDCALL
+NTAPI
 MiRaisePoolQuota(
     IN POOL_TYPE PoolType,
     IN ULONG CurrentMaxQuota,
@@ -537,21 +600,13 @@ MiShutdownMemoryManager(VOID);
 VOID
 NTAPI
 MmInit1(
-    ULONG_PTR FirstKernelPhysAddress,
-    ULONG_PTR LastKernelPhysAddress,
-    ULONG_PTR LastKernelAddress,
-    PADDRESS_RANGE BIOSMemoryMap,
-    ULONG AddressRangeCount,
-    ULONG MaxMemInMeg
+    VOID
 );
 
-VOID
-NTAPI
-MmInit2(VOID);
-
-VOID
+BOOLEAN
 NTAPI
-MmInit3(VOID);
+MmInitSystem(IN ULONG Phase,
+             IN PLOADER_PARAMETER_BLOCK LoaderBlock);
 
 VOID
 NTAPI
@@ -598,7 +653,7 @@ MmWriteToSwapPage(
 );
 
 NTSTATUS
-STDCALL
+NTAPI
 MmDumpToPagingFile(
     ULONG BugCode,
     ULONG BugCodeParameter1,
@@ -619,29 +674,51 @@ MmShowOutOfSpaceMessagePagingFile(VOID);
 /* process.c ****************************************************************/
 
 NTSTATUS
-STDCALL
-MmCreateProcessAddressSpace(
-    IN struct _ROS_EPROCESS* Process,
-    IN PROS_SECTION_OBJECT Section OPTIONAL
+NTAPI
+MmInitializeProcessAddressSpace(
+    IN PEPROCESS Process,
+    IN PEPROCESS Clone OPTIONAL,
+    IN PVOID Section OPTIONAL,
+    IN OUT PULONG Flags,
+    IN POBJECT_NAME_INFORMATION *AuditName OPTIONAL
 );
 
 NTSTATUS
-STDCALL
-MmCreatePeb(struct _ROS_EPROCESS *Process);
+NTAPI
+MmCreatePeb(struct _EPROCESS *Process);
 
-struct _TEB*
-STDCALL
+PTEB
+NTAPI
 MmCreateTeb(
-    struct _ROS_EPROCESS *Process,
+    struct _EPROCESS *Process,
     PCLIENT_ID ClientId,
     PINITIAL_TEB InitialTeb
 );
 
 VOID
-STDCALL
+NTAPI
 MmDeleteTeb(
-    struct _ROS_EPROCESS *Process,
-    struct _TEB* Teb
+    struct _EPROCESS *Process,
+    PTEB Teb
+);
+
+VOID
+NTAPI
+MmCleanProcessAddressSpace(IN PEPROCESS Process);
+
+NTSTATUS
+NTAPI
+MmDeleteProcessAddressSpace(IN PEPROCESS Process);
+
+ULONG
+NTAPI
+MmGetSessionLocaleId(VOID);
+
+NTSTATUS
+NTAPI
+MmSetMemoryPriorityProcess(
+    IN PEPROCESS Process,
+    IN UCHAR MemoryPriority
 );
 
 /* i386/pfault.c *************************************************************/
@@ -661,17 +738,10 @@ MmPageFault(
 NTSTATUS
 NTAPI
 MmAccessFault(
-    KPROCESSOR_MODE Mode,
-    ULONG_PTR Address,
-    BOOLEAN FromMdl
-);
-
-NTSTATUS
-NTAPI
-MmNotPresentFault(
-    KPROCESSOR_MODE Mode,
-    ULONG_PTR Address,
-    BOOLEAN FromMdl
+    IN BOOLEAN StoreInstruction,
+    IN PVOID Address,
+    IN KPROCESSOR_MODE Mode,
+    IN PVOID TrapInformation
 );
 
 /* anonmem.c *****************************************************************/
@@ -695,7 +765,7 @@ MmPageOutVirtualMemory(
 );
 
 NTSTATUS
-STDCALL
+NTAPI
 MmQueryAnonMem(
     PMEMORY_AREA MemoryArea,
     PVOID Address,
@@ -706,7 +776,7 @@ MmQueryAnonMem(
 VOID
 NTAPI
 MmFreeVirtualMemory(
-    struct _ROS_EPROCESS* Process,
+    struct _EPROCESS* Process,
     PMEMORY_AREA MemoryArea
 );
 
@@ -796,11 +866,11 @@ MmInitializePageOp(VOID);
 /* process.c *****************************************************************/
 
 PVOID
-STDCALL
-MmCreateKernelStack(BOOLEAN GuiStack);
+NTAPI
+MmCreateKernelStack(BOOLEAN GuiStack, UCHAR Node);
 
 VOID
-STDCALL
+NTAPI
 MmDeleteKernelStack(PVOID Stack,
                     BOOLEAN GuiStack);
 
@@ -813,14 +883,14 @@ MmInitializeMemoryConsumer(
     NTSTATUS (*Trim)(ULONG Target, ULONG Priority, PULONG NrFreed)
 );
 
-VOID 
+VOID
 NTAPI
 MmInitializeBalancer(
     ULONG NrAvailablePages,
     ULONG NrSystemPages
 );
 
-NTSTATUS 
+NTSTATUS
 NTAPI
 MmReleasePageMemoryConsumer(
     ULONG Consumer,
@@ -860,7 +930,7 @@ VOID
 NTAPI
 MmInsertRmap(
     PFN_TYPE Page,
-    struct _ROS_EPROCESS *Process,
+    struct _EPROCESS *Process,
     PVOID Address
 );
 
@@ -869,14 +939,14 @@ NTAPI
 MmDeleteAllRmaps(
     PFN_TYPE Page,
     PVOID Context,
-    VOID (*DeleteMapping)(PVOID Context, struct _ROS_EPROCESS *Process, PVOID Address)
+    VOID (*DeleteMapping)(PVOID Context, struct _EPROCESS *Process, PVOID Address)
 );
 
 VOID
 NTAPI
 MmDeleteRmap(
     PFN_TYPE Page,
-    struct _ROS_EPROCESS *Process,
+    struct _EPROCESS *Process,
     PVOID Address
 );
 
@@ -906,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);
@@ -916,7 +1012,11 @@ MmGetLRUFirstUserPage(VOID);
 
 VOID
 NTAPI
-MmSetLRULastPage(PFN_TYPE Page);
+MmInsertLRULastUserPage(PFN_TYPE Page);
+
+VOID
+NTAPI
+MmRemoveLRUUserPage(PFN_TYPE Page);
 
 VOID
 NTAPI
@@ -934,15 +1034,10 @@ ULONG
 NTAPI
 MmGetLockCountPage(PFN_TYPE Page);
 
-PVOID
+VOID
 NTAPI
 MmInitializePageList(
-    ULONG_PTR FirstPhysKernelAddress,
-    ULONG_PTR LastPhysKernelAddress,
-    ULONG MemorySizeInPages,
-    ULONG_PTR LastKernelBase,
-    PADDRESS_RANGE BIOSMemoryMap,
-    ULONG AddressRangeCount
+    VOID
 );
 
 PFN_TYPE
@@ -956,7 +1051,9 @@ MmGetContinuousPages(
 
 NTSTATUS
 NTAPI
-MmInitZeroPageThread(VOID);
+MmZeroPageThreadMain(
+    PVOID Context
+);
 
 /* i386/page.c *********************************************************/
 
@@ -994,7 +1091,7 @@ MmCommitPagedPoolAddress(
 NTSTATUS
 NTAPI
 MmCreateVirtualMapping(
-    struct _ROS_EPROCESS* Process,
+    struct _EPROCESS* Process,
     PVOID Address,
     ULONG flProtect,
     PPFN_TYPE Pages,
@@ -1004,7 +1101,7 @@ MmCreateVirtualMapping(
 NTSTATUS
 NTAPI
 MmCreateVirtualMappingUnsafe(
-    struct _ROS_EPROCESS* Process,
+    struct _EPROCESS* Process,
     PVOID Address,
     ULONG flProtect,
     PPFN_TYPE Pages,
@@ -1014,13 +1111,13 @@ MmCreateVirtualMappingUnsafe(
 ULONG
 NTAPI
 MmGetPageProtect(
-    struct _ROS_EPROCESS* Process,
+    struct _EPROCESS* Process,
     PVOID Address);
 
 VOID
 NTAPI
 MmSetPageProtect(
-    struct _ROS_EPROCESS* Process,
+    struct _EPROCESS* Process,
     PVOID Address,
     ULONG flProtect
 );
@@ -1028,7 +1125,7 @@ MmSetPageProtect(
 BOOLEAN
 NTAPI
 MmIsPagePresent(
-    struct _ROS_EPROCESS* Process,
+    struct _EPROCESS* Process,
     PVOID Address
 );
 
@@ -1039,7 +1136,7 @@ MmInitGlobalKernelPageDirectory(VOID);
 VOID
 NTAPI
 MmDisableVirtualMapping(
-    struct _ROS_EPROCESS *Process,
+    struct _EPROCESS *Process,
     PVOID Address,
     BOOLEAN* WasDirty,
     PPFN_TYPE Page
@@ -1048,7 +1145,7 @@ MmDisableVirtualMapping(
 VOID
 NTAPI
 MmEnableVirtualMapping(
-    struct _ROS_EPROCESS *Process,
+    struct _EPROCESS *Process,
     PVOID Address
 );
 
@@ -1059,7 +1156,7 @@ MmRawDeleteVirtualMapping(PVOID Address);
 VOID
 NTAPI
 MmDeletePageFileMapping(
-    struct _ROS_EPROCESS *Process,
+    struct _EPROCESS *Process,
     PVOID Address,
     SWAPENTRY* SwapEntry
 );
@@ -1067,7 +1164,7 @@ MmDeletePageFileMapping(
 NTSTATUS
 NTAPI
 MmCreatePageFileMapping(
-    struct _ROS_EPROCESS *Process,
+    struct _EPROCESS *Process,
     PVOID Address,
     SWAPENTRY SwapEntry
 );
@@ -1075,7 +1172,7 @@ MmCreatePageFileMapping(
 BOOLEAN
 NTAPI
 MmIsPageSwapEntry(
-    struct _ROS_EPROCESS *Process,
+    struct _EPROCESS *Process,
     PVOID Address
 );
 
@@ -1089,7 +1186,7 @@ MmTransferOwnershipPage(
 VOID
 NTAPI
 MmSetDirtyPage(
-    struct _ROS_EPROCESS *Process,
+    struct _EPROCESS *Process,
     PVOID Address
 );
 
@@ -1125,7 +1222,7 @@ MmReferencePageUnsafe(PFN_TYPE Page);
 BOOLEAN
 NTAPI
 MmIsAccessedAndResetAccessPage(
-    struct _ROS_EPROCESS *Process,
+    struct _EPROCESS *Process,
     PVOID Address
 );
 
@@ -1135,7 +1232,7 @@ MmGetReferenceCountPage(PFN_TYPE Page);
 
 BOOLEAN
 NTAPI
-MmIsUsablePage(PFN_TYPE Page);
+MmIsPageInUse(PFN_TYPE Page);
 
 VOID
 NTAPI
@@ -1160,7 +1257,7 @@ MmGetSavedSwapEntryPage(PFN_TYPE Page);
 VOID
 NTAPI
 MmSetCleanPage(
-    struct _ROS_EPROCESS *Process,
+    struct _EPROCESS *Process,
     PVOID Address
 );
 
@@ -1171,37 +1268,51 @@ MmCreatePageTable(PVOID PAddress);
 VOID
 NTAPI
 MmDeletePageTable(
-    struct _ROS_EPROCESS *Process,
+    struct _EPROCESS *Process,
     PVOID Address
 );
 
 PFN_TYPE
 NTAPI
 MmGetPfnForProcess(
-    struct _ROS_EPROCESS *Process,
+    struct _EPROCESS *Process,
     PVOID Address
 );
 
+BOOLEAN
+NTAPI
+MmCreateProcessAddressSpace(
+    IN ULONG MinWs,
+    IN PEPROCESS Dest,
+    IN PLARGE_INTEGER DirectoryTableBase
+);
+
 NTSTATUS
-STDCALL
-MmCopyMmInfo(
-    struct _ROS_EPROCESS *Src,
-    struct _ROS_EPROCESS *Dest,
-    PPHYSICAL_ADDRESS DirectoryTableBase
+NTAPI
+MmInitializeHandBuiltProcess(
+    IN PEPROCESS Process,
+    IN PLARGE_INTEGER DirectoryTableBase
 );
 
+
 NTSTATUS
 NTAPI
-MmReleaseMmInfo(struct _ROS_EPROCESS *Process);
+MmInitializeHandBuiltProcess2(
+    IN PEPROCESS Process
+);
 
 NTSTATUS
 NTAPI
-Mmi386ReleaseMmInfo(struct _ROS_EPROCESS *Process);
+MmReleaseMmInfo(struct _EPROCESS *Process);
+
+NTSTATUS
+NTAPI
+Mmi386ReleaseMmInfo(struct _EPROCESS *Process);
 
 VOID
 NTAPI
 MmDeleteVirtualMapping(
-    struct _ROS_EPROCESS *Process,
+    struct _EPROCESS *Process,
     PVOID Address,
     BOOLEAN FreePage,
     BOOLEAN* WasDirty,
@@ -1211,7 +1322,7 @@ MmDeleteVirtualMapping(
 BOOLEAN
 NTAPI
 MmIsDirtyPage(
-    struct _ROS_EPROCESS *Process,
+    struct _EPROCESS *Process,
     PVOID Address
 );
 
@@ -1226,7 +1337,7 @@ MmMarkPageUnmapped(PFN_TYPE Page);
 VOID
 NTAPI
 MmUpdatePageDir(
-    struct _ROS_EPROCESS *Process,
+    struct _EPROCESS *Process,
     PVOID Address,
     ULONG Size
 );
@@ -1283,15 +1394,34 @@ MmFindRegion(
 
 /* section.c *****************************************************************/
 
-PVOID 
-STDCALL
+PFILE_OBJECT
+NTAPI
+MmGetFileObjectForSection(
+    IN PROS_SECTION_OBJECT Section
+);
+NTSTATUS
+NTAPI
+MmGetFileNameForAddress(
+    IN PVOID Address,
+    OUT PUNICODE_STRING ModuleName
+);
+
+NTSTATUS
+NTAPI
+MmGetFileNameForSection(
+    IN PROS_SECTION_OBJECT Section,
+    OUT POBJECT_NAME_INFORMATION *ModuleName
+);
+
+PVOID
+NTAPI
 MmAllocateSection(
     IN ULONG Length,
     PVOID BaseAddress
 );
 
 NTSTATUS
-STDCALL
+NTAPI
 MmQuerySectionView(
     PMEMORY_AREA MemoryArea,
     PVOID Address,
@@ -1364,6 +1494,10 @@ NTSTATUS
 NTAPI
 MmInitMpwThread(VOID);
 
+NTSTATUS
+NTAPI
+MmInitBsmThread(VOID);
+
 /* pager.c *******************************************************************/
 
 BOOLEAN
@@ -1389,4 +1523,85 @@ MiQueryVirtualMemory(
     OUT PULONG ResultLength
 );
 
+/* sysldr.c ******************************************************************/
+
+VOID
+NTAPI
+MiReloadBootLoadedDrivers(
+    IN PLOADER_PARAMETER_BLOCK LoaderBlock
+);
+
+BOOLEAN
+NTAPI
+MiInitializeLoadedModuleList(
+    IN PLOADER_PARAMETER_BLOCK LoaderBlock
+);
+
+NTSTATUS
+NTAPI
+MmLoadSystemImage(
+    IN PUNICODE_STRING FileName,
+    IN PUNICODE_STRING NamePrefix OPTIONAL,
+    IN PUNICODE_STRING LoadedName OPTIONAL,
+    IN ULONG Flags,
+    OUT PVOID *ModuleObject,
+    OUT PVOID *ImageBaseAddress
+);
+
+NTSTATUS
+NTAPI
+MmUnloadSystemImage(
+    IN PVOID ImageHandle
+);
+
+NTSTATUS
+NTAPI
+MmCheckSystemImage(
+    IN HANDLE ImageHandle,
+    IN BOOLEAN PurgeSection
+);
+
+FORCEINLINE
+VOID
+NTAPI
+MiSyncThreadProcessViews(IN PVOID Process,
+                         IN PVOID Address,
+                         IN ULONG Size)
+{
+    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