- Initialize the used page count for the non paged pool in MmInitializeBalancer.
[reactos.git] / reactos / ntoskrnl / include / internal / mm.h
index bfe8408..9dd2742 100644 (file)
@@ -28,6 +28,7 @@ typedef ULONG SWAPENTRY;
 #define MEMORY_AREA_SHARED_DATA          (10)
 #define MEMORY_AREA_KERNEL_STACK         (11)
 #define MEMORY_AREA_PAGED_POOL           (12)
+#define MEMORY_AREA_NO_ACCESS            (13)
 
 #define PAGE_TO_SECTION_PAGE_DIRECTORY_OFFSET(x) \
                           ((x) / (4*1024*1024))
@@ -78,7 +79,7 @@ typedef struct _MM_SECTION_SEGMENT
   ULONG Attributes;
   ULONG Length;
   ULONG RawLength;
-  KMUTEX Lock;
+  FAST_MUTEX Lock;
   ULONG ReferenceCount;
   SECTION_PAGE_DIRECTORY PageDirectory;
   ULONG Flags;
@@ -87,19 +88,8 @@ typedef struct _MM_SECTION_SEGMENT
   BOOLEAN WriteCopy;
 } MM_SECTION_SEGMENT, *PMM_SECTION_SEGMENT;
 
-typedef struct
+typedef struct _MM_IMAGE_SECTION_OBJECT
 {
-  CSHORT Type;
-  CSHORT Size;
-  LARGE_INTEGER MaximumSize;
-  ULONG SectionPageProtection;
-  ULONG AllocationAttributes;
-  PFILE_OBJECT FileObject;
-  LIST_ENTRY ViewListHead;
-  KSPIN_LOCK ViewListLock;
-  KMUTEX Lock;
-  ULONG NrSegments;
-  PMM_SECTION_SEGMENT Segments;
   PVOID ImageBase;
   PVOID EntryPoint;
   ULONG StackReserve;
@@ -110,7 +100,32 @@ typedef struct
   ULONG ImageCharacteristics;
   USHORT Machine;
   BOOLEAN Executable;
-} SECTION_OBJECT, *PSECTION_OBJECT;
+  ULONG NrSegments;
+  MM_SECTION_SEGMENT Segments[0];
+} MM_IMAGE_SECTION_OBJECT, *PMM_IMAGE_SECTION_OBJECT;
+
+typedef struct _SECTION_OBJECT
+{
+  CSHORT Type;
+  CSHORT Size;
+  LARGE_INTEGER MaximumSize;
+  ULONG SectionPageProtection;
+  ULONG AllocationAttributes;
+  PFILE_OBJECT FileObject;
+  LIST_ENTRY ViewListHead;
+  KSPIN_LOCK ViewListLock;
+  union
+  {
+    PMM_IMAGE_SECTION_OBJECT ImageSection;
+    PMM_SECTION_SEGMENT Segment;
+  };
+} SECTION_OBJECT;
+
+#ifndef __USE_W32API
+
+typedef struct _SECTION_OBJECT *PSECTION_OBJECT;
+
+#endif /* __USE_W32API */
 
 typedef struct
 {
@@ -126,7 +141,7 @@ typedef struct
   union
   {
     struct
-    {       
+    {
       SECTION_OBJECT* Section;
       ULONG ViewOffset;
       LIST_ENTRY ViewListEntry;
@@ -151,6 +166,15 @@ typedef struct _MADDRESS_SPACE
   ULONG PageTableRefCountTableSize;
 } MADDRESS_SPACE, *PMADDRESS_SPACE;
 
+
+#ifndef __USE_W32API
+/* VARIABLES */
+
+extern PVOID MmSystemRangeStart;
+
+#endif /* __USE_W32API */
+
+
 /* FUNCTIONS */
 
 VOID MmLockAddressSpace(PMADDRESS_SPACE AddressSpace);
@@ -169,11 +193,12 @@ NTSTATUS MmCreateMemoryArea(struct _EPROCESS* Process,
                            ULONG Length,
                            ULONG Attributes,
                            MEMORY_AREA** Result,
-                           BOOL FixedAddress);
+                           BOOL FixedAddress,
+                           BOOL TopDown);
 MEMORY_AREA* MmOpenMemoryAreaByAddress(PMADDRESS_SPACE AddressSpace, 
                                       PVOID Address);
 NTSTATUS MmInitMemoryAreas(VOID);
-VOID ExInitNonPagedPool(ULONG BaseAddress);
+VOID MiInitializeNonPagedPool(VOID);
 NTSTATUS MmFreeMemoryArea(PMADDRESS_SPACE AddressSpace,
                          PVOID BaseAddress,
                          ULONG Length,
@@ -186,7 +211,9 @@ NTSTATUS MmLockMemoryArea(MEMORY_AREA* MemoryArea);
 NTSTATUS MmUnlockMemoryArea(MEMORY_AREA* MemoryArea);
 NTSTATUS MmInitSectionImplementation(VOID);
 
+#ifndef __USE_W32API
 #define MM_LOWEST_USER_ADDRESS (4096)
+#endif
 
 PMEMORY_AREA MmSplitMemoryArea(struct _EPROCESS* Process,
                               PMADDRESS_SPACE AddressSpace,
@@ -218,6 +245,7 @@ MmDeleteVirtualMapping(struct _EPROCESS* Process,
                       BOOL FreePage,
                       BOOL* WasDirty,
                       PHYSICAL_ADDRESS* PhysicalPage);
+VOID MmUpdateStackPageDir(PULONG LocalPageDir, struct _KTHREAD* KThread);
 
 #define MM_PAGE_CLEAN     (0)
 #define MM_PAGE_DIRTY     (1)
@@ -288,11 +316,10 @@ MmPageOutSectionView(PMADDRESS_SPACE AddressSpace,
 MEMORY_AREA* MmOpenMemoryAreaByRegion(PMADDRESS_SPACE AddressSpace, 
                                      PVOID Address,
                                      ULONG Length);
-PVOID MmFindGap(PMADDRESS_SPACE AddressSpace, ULONG Length);
+PVOID MmFindGap(PMADDRESS_SPACE AddressSpace, ULONG Length, BOOL TopDown);
 VOID ExUnmapPage(PVOID Addr);
 PVOID ExAllocatePage(VOID);
 
-VOID MmInitPagingFile(VOID);
 BOOLEAN MmReserveSwapPages(ULONG Nr);
 VOID MmDereserveSwapPages(ULONG Nr);
 SWAPENTRY MmAllocSwapPage(VOID);
@@ -302,12 +329,15 @@ VOID MmInit1(ULONG FirstKernelPhysAddress,
             ULONG LastKernelPhysAddress,
             ULONG LastKernelAddress,
        PADDRESS_RANGE BIOSMemoryMap,
-       ULONG AddressRangeCount);
+       ULONG AddressRangeCount,
+       ULONG MaxMemInMeg);
 VOID MmInit2(VOID);
 VOID MmInit3(VOID);
+VOID MiFreeInitMemory(VOID);
 NTSTATUS MmInitPagerThread(VOID);
+NTSTATUS MmInitZeroPageThread(VOID);
 
-VOID MmInitKernelMap(PVOID BaseAddress);
+VOID MiInitKernelMap(VOID);
 NTSTATUS MmCreatePageTable(PVOID PAddress);
 
 typedef struct
@@ -342,9 +372,10 @@ SWAPENTRY MmGetSavedSwapEntryPage(PHYSICAL_ADDRESS PhysicalAddress);
 VOID MmSetCleanPage(struct _EPROCESS* Process, PVOID Address);
 VOID MmLockPage(PHYSICAL_ADDRESS PhysicalPage);
 VOID MmUnlockPage(PHYSICAL_ADDRESS PhysicalPage);
+ULONG MmGetLockCountPage(PHYSICAL_ADDRESS PhysicalPage);
 
-NTSTATUS MmSafeCopyFromUser(PVOID Dest, PVOID Src, ULONG Count);
-NTSTATUS MmSafeCopyToUser(PVOID Dest, PVOID Src, ULONG Count);
+NTSTATUS MmSafeCopyFromUser(PVOID Dest, const VOID *Src, ULONG Count);
+NTSTATUS MmSafeCopyToUser(PVOID Dest, const VOID *Src, ULONG Count);
 NTSTATUS 
 MmCreatePhysicalMemorySection(VOID);
 PHYSICAL_ADDRESS
@@ -410,7 +441,11 @@ MmReleasePageOp(PMM_PAGEOP PageOp);
 PMM_PAGEOP
 MmGetPageOp(PMEMORY_AREA MArea, ULONG Pid, PVOID Address,
            PMM_SECTION_SEGMENT Segment, ULONG Offset, ULONG OpType);
-
+PMM_PAGEOP
+MmCheckForPageOp(PMEMORY_AREA MArea, ULONG Pid, PVOID Address,
+                PMM_SECTION_SEGMENT Segment, ULONG Offset);
+VOID
+MmInitializePageOp(VOID);
 VOID
 MiDebugDumpNonPagedPool(BOOLEAN NewOnly);
 VOID
@@ -422,11 +457,7 @@ MmMarkPageUnmapped(PHYSICAL_ADDRESS PhysicalAddress);
 VOID
 MmFreeSectionSegments(PFILE_OBJECT FileObject);
 
-typedef struct _MM_IMAGE_SECTION_OBJECT
-{
-  ULONG NrSegments;
-  MM_SECTION_SEGMENT Segments[0];
-} MM_IMAGE_SECTION_OBJECT, *PMM_IMAGE_SECTION_OBJECT;
+
 
 VOID 
 MmFreeVirtualMemory(struct _EPROCESS* Process, PMEMORY_AREA MemoryArea);
@@ -437,7 +468,7 @@ MiZeroPage(PHYSICAL_ADDRESS PhysPage);
 BOOLEAN 
 MmIsAccessedAndResetAccessPage(struct _EPROCESS* Process, PVOID Address);
 
-#define STATUS_MM_RESTART_OPERATION       (0xD0000001)
+#define STATUS_MM_RESTART_OPERATION       ((NTSTATUS)0xD0000001)
 
 NTSTATUS 
 MmCreateVirtualMappingForKernel(PVOID Address, 
@@ -462,13 +493,15 @@ VOID MmSetPageProtect(struct _EPROCESS* Process,
 BOOLEAN MmIsPagePresent(struct _EPROCESS* Process, 
                        PVOID Address);
 
+VOID MmInitGlobalKernelPageDirectory(VOID);
+
 /* Memory balancing. */
 VOID
 MmInitializeMemoryConsumer(ULONG Consumer, 
                           NTSTATUS (*Trim)(ULONG Target, ULONG Priority, 
                                            PULONG NrFreed));
 VOID
-MmInitializeBalancer(ULONG NrAvailablePages);
+MmInitializeBalancer(ULONG NrAvailablePages, ULONG NrSystemPages);
 NTSTATUS
 MmReleasePageMemoryConsumer(ULONG Consumer, PHYSICAL_ADDRESS Page);
 NTSTATUS
@@ -523,9 +556,6 @@ VOID MmSetDirtyPage(PEPROCESS Process, PVOID Address);
 VOID
 MmInitializeMdlImplementation(VOID);
 extern PHYSICAL_ADDRESS MmSharedDataPagePhysicalAddress;
-PMM_PAGEOP
-MmCheckForPageOp(PMEMORY_AREA MArea, ULONG Pid, PVOID Address,
-                PMM_SECTION_SEGMENT Segment, ULONG Offset);
 struct _KTRAP_FRAME;
 NTSTATUS STDCALL 
 MmDumpToPagingFile(ULONG BugCode,
@@ -606,5 +636,21 @@ BOOLEAN
 MmIsAvailableSwapPage(VOID);
 VOID
 MmShowOutOfSpaceMessagePagingFile(VOID);
+VOID
+MmRebalanceMemoryConsumers(VOID);
+BOOLEAN
+MiIsPagerThread(VOID);
+VOID
+MiStartPagerThread(VOID);
+VOID
+MmSetLRULastPage(PHYSICAL_ADDRESS PhysicalAddress);
+VOID
+MmRawDeleteVirtualMapping(PVOID Address);
+VOID
+MiStopPagerThread(VOID);
+NTSTATUS 
+MmCreateVirtualMappingDump(PVOID Address, 
+                          ULONG flProtect,
+                          PHYSICAL_ADDRESS PhysicalAddress);
 
 #endif