X-Git-Url: https://git.reactos.org/?p=reactos.git;a=blobdiff_plain;f=ntoskrnl%2Finclude%2Finternal%2Fmm.h;h=694c51f1f0d377f7a3badd95e8c2603d35e9eb45;hp=40019a925e9a78ae3483600197298b889ab30338;hb=24856b8de6abc6abb569d9cd3158e7eeac70fdb4;hpb=3224e67cfc2cd5df024635d95f05bced8ace4afd diff --git a/ntoskrnl/include/internal/mm.h b/ntoskrnl/include/internal/mm.h index 40019a925e9..694c51f1f0d 100644 --- a/ntoskrnl/include/internal/mm.h +++ b/ntoskrnl/include/internal/mm.h @@ -9,9 +9,6 @@ struct _EPROCESS; extern PMMSUPPORT MmKernelAddressSpace; extern PFN_COUNT MiFreeSwapPages; extern PFN_COUNT MiUsedSwapPages; -extern SIZE_T MmTotalPagedPoolQuota; -extern SIZE_T MmTotalNonPagedPoolQuota; -extern PHYSICAL_ADDRESS MmSharedDataPagePhysicalAddress; extern PFN_COUNT MmNumberOfPhysicalPages; extern UCHAR MmDisablePagingExecutive; extern PFN_NUMBER MmLowestPhysicalPage; @@ -19,9 +16,6 @@ extern PFN_NUMBER MmHighestPhysicalPage; extern PFN_NUMBER MmAvailablePages; extern PFN_NUMBER MmResidentAvailablePages; -extern PMEMORY_ALLOCATION_DESCRIPTOR MiFreeDescriptor; -extern MEMORY_ALLOCATION_DESCRIPTOR MiFreeDescriptorOrg; - extern LIST_ENTRY MmLoadedUserImageList; extern KMUTANT MmSystemLoadLock; @@ -43,8 +37,8 @@ extern SIZE_T MmPagedPoolCommit; extern SIZE_T MmPeakCommitment; extern SIZE_T MmtotalCommitLimitMaximum; -extern PVOID MiDebugMapping; -extern PMMPTE MmDebugPte; +extern PVOID MiDebugMapping; // internal +extern PMMPTE MmDebugPte; // internal struct _KTRAP_FRAME; struct _EPROCESS; @@ -66,7 +60,7 @@ typedef ULONG_PTR SWAPENTRY; // #define MMDBG_COPY_MAX_SIZE 0x8 -#if defined(_X86_) +#if defined(_X86_) // intenal for marea.c #define MI_STATIC_MEMORY_AREAS (14) #else #define MI_STATIC_MEMORY_AREAS (13) @@ -77,19 +71,6 @@ typedef ULONG_PTR SWAPENTRY; #define MEMORY_AREA_OWNED_BY_ARM3 (15) #define MEMORY_AREA_STATIC (0x80000000) -#define MM_PHYSICAL_PAGE_MPW_PENDING (0x8) - -#define MM_CORE_DUMP_TYPE_NONE (0x0) -#define MM_CORE_DUMP_TYPE_MINIMAL (0x1) -#define MM_CORE_DUMP_TYPE_FULL (0x2) - -/* Number of list heads to use */ -#define MI_FREE_POOL_LISTS 4 - - -/* Signature of free pool blocks */ -#define MM_FREE_POOL_TAG 'lprF' - /* 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) @@ -119,32 +100,13 @@ typedef ULONG_PTR SWAPENTRY; #define SESSION_POOL_MASK 32 #define VERIFIER_POOL_MASK 64 -#define MM_PAGED_POOL_SIZE (100*1024*1024) -#define MM_NONPAGED_POOL_SIZE (100*1024*1024) - -/* - * Paged and non-paged pools are 8-byte aligned - */ -#define MM_POOL_ALIGNMENT 8 - +// FIXME: use ALIGN_UP_BY #define MM_ROUND_UP(x,s) \ ((PVOID)(((ULONG_PTR)(x)+(s)-1) & ~((ULONG_PTR)(s)-1))) #define MM_ROUND_DOWN(x,s) \ ((PVOID)(((ULONG_PTR)(x)) & ~((ULONG_PTR)(s)-1))) -#define PAGE_FLAGS_VALID_FROM_USER_MODE \ - (PAGE_READONLY | \ - PAGE_READWRITE | \ - PAGE_WRITECOPY | \ - PAGE_EXECUTE | \ - PAGE_EXECUTE_READ | \ - PAGE_EXECUTE_READWRITE | \ - PAGE_EXECUTE_WRITECOPY | \ - PAGE_GUARD | \ - PAGE_NOACCESS | \ - PAGE_NOCACHE) - #define PAGE_FLAGS_VALID_FOR_SECTION \ (PAGE_READONLY | \ PAGE_READWRITE | \ @@ -153,7 +115,8 @@ typedef ULONG_PTR SWAPENTRY; PAGE_EXECUTE_READ | \ PAGE_EXECUTE_READWRITE | \ PAGE_EXECUTE_WRITECOPY | \ - PAGE_NOACCESS) + PAGE_NOACCESS | \ + PAGE_NOCACHE) #define PAGE_IS_READABLE \ (PAGE_READONLY | \ @@ -237,13 +200,13 @@ typedef struct _ROS_SECTION_OBJECT }; } ROS_SECTION_OBJECT, *PROS_SECTION_OBJECT; +#define MA_GetStartingAddress(_MemoryArea) ((_MemoryArea)->VadNode.StartingVpn << PAGE_SHIFT) +#define MA_GetEndingAddress(_MemoryArea) (((_MemoryArea)->VadNode.EndingVpn + 1) << PAGE_SHIFT) + typedef struct _MEMORY_AREA { - PVOID StartingAddress; - PVOID EndingAddress; - struct _MEMORY_AREA *Parent; - struct _MEMORY_AREA *LeftChild; - struct _MEMORY_AREA *RightChild; + MMVAD VadNode; + ULONG Type; ULONG Protect; ULONG Flags; @@ -331,18 +294,22 @@ typedef struct _MMPFNENTRY USHORT RemovalRequested:1; USHORT CacheAttribute:2; USHORT Rom:1; - USHORT ParityError:1; // HasRmap + USHORT ParityError:1; } MMPFNENTRY; +// Mm internal typedef struct _MMPFN { union { PFN_NUMBER Flink; - ULONG WsIndex; // SavedSwapEntry + ULONG WsIndex; PKEVENT Event; NTSTATUS ReadStatus; SINGLE_LIST_ENTRY NextStackPfn; + + // HACK for ROSPFN + SWAPENTRY SwapEntry; } u1; PMMPTE PteAddress; union @@ -354,7 +321,7 @@ typedef struct _MMPFN { struct { - USHORT ReferenceCount; // ReferenceCount + USHORT ReferenceCount; MMPFNENTRY e1; }; struct @@ -366,7 +333,10 @@ typedef struct _MMPFN union { MMPTE OriginalPte; - LONG AweReferenceCount; // RmapListHead + LONG AweReferenceCount; + + // HACK for ROSPFN + PMM_RMAP_ENTRY RmapListHead; }; union { @@ -385,6 +355,9 @@ typedef struct _MMPFN MI_PFN_USAGES PfnUsage; CHAR ProcessName[16]; #endif + + // HACK until WS lists are supported + MMWSLE Wsle; } MMPFN, *PMMPFN; extern PMMPFN MmPfnDatabase; @@ -418,6 +391,7 @@ typedef struct _MM_REGION LIST_ENTRY RegionListEntry; } MM_REGION, *PMM_REGION; +// Mm internal /* Entry describing free pool memory */ typedef struct _MMFREE_POOL_ENTRY { @@ -510,7 +484,6 @@ MmCreateMemoryArea( SIZE_T Length, ULONG Protection, PMEMORY_AREA *Result, - BOOLEAN FixedAddress, ULONG AllocationFlags, ULONG AllocationGranularity ); @@ -522,13 +495,6 @@ MmLocateMemoryAreaByAddress( PVOID Address ); -ULONG_PTR -NTAPI -MmFindGapAtAddress( - PMMSUPPORT AddressSpace, - PVOID Address -); - NTSTATUS NTAPI MmFreeMemoryArea( @@ -538,18 +504,11 @@ MmFreeMemoryArea( PVOID FreePageContext ); -NTSTATUS -NTAPI -MmFreeMemoryAreaByPtr( - PMMSUPPORT AddressSpace, - PVOID BaseAddress, - PMM_FREE_PAGE_FUNC FreePage, - PVOID FreePageContext -); - VOID NTAPI -MmDumpMemoryAreas(PMMSUPPORT AddressSpace); +MiRosCleanupMemoryArea( + PEPROCESS Process, + PMMVAD Vad); PMEMORY_AREA NTAPI @@ -568,21 +527,6 @@ MmFindGap( BOOLEAN TopDown ); -VOID -NTAPI -MmReleaseMemoryAreaIfDecommitted( - struct _EPROCESS *Process, - PMMSUPPORT AddressSpace, - PVOID BaseAddress -); - -VOID -NTAPI -MmMapMemoryArea(PVOID BaseAddress, - SIZE_T Length, - ULONG Consumer, - ULONG Protection); - VOID NTAPI MiRosCheckMemoryAreas( @@ -594,14 +538,6 @@ MiCheckAllProcessMemoryAreas(VOID); /* npool.c *******************************************************************/ -VOID -NTAPI -MiDebugDumpNonPagedPool(BOOLEAN NewOnly); - -VOID -NTAPI -MiDebugDumpNonPagedPoolStats(BOOLEAN NewOnly); - VOID NTAPI MiInitializeNonPagedPool(VOID); @@ -625,71 +561,8 @@ MiFreePoolPages( IN PVOID StartingAddress ); -PVOID -NTAPI -MmGetMdlPageAddress( - PMDL Mdl, - PVOID Offset -); - /* pool.c *******************************************************************/ -PVOID -NTAPI -ExAllocateNonPagedPoolWithTag( - POOL_TYPE type, - ULONG size, - ULONG Tag, - PVOID Caller -); - -PVOID -NTAPI -ExAllocatePagedPoolWithTag( - POOL_TYPE Type, - ULONG size, - ULONG Tag -); - -VOID -NTAPI -ExFreeNonPagedPool(PVOID block); - -VOID -NTAPI -ExFreePagedPool(IN PVOID Block); - -BOOLEAN -NTAPI -ExpIsPoolTagDebuggable(ULONG Tag); - -PVOID -NTAPI -ExpAllocateDebugPool( - POOL_TYPE Type, - ULONG Size, - ULONG Tag, - PVOID Caller, - BOOLEAN EndOfPage -); - -VOID -NTAPI -ExpFreeDebugPool(PVOID Block, BOOLEAN PagedPool); - -VOID -NTAPI -MmInitializePagedPool(VOID); - -PVOID -NTAPI -MiAllocateSpecialPool( - IN POOL_TYPE PoolType, - IN SIZE_T NumberOfBytes, - IN ULONG Tag, - IN ULONG Underrun -); - BOOLEAN NTAPI MiRaisePoolQuota( @@ -709,10 +582,6 @@ MmBuildMdlFromPages( /* mminit.c ******************************************************************/ -VOID -NTAPI -MiShutdownMemoryManager(VOID); - VOID NTAPI MmInit1( @@ -724,13 +593,6 @@ NTAPI MmInitSystem(IN ULONG Phase, IN PLOADER_PARAMETER_BLOCK LoaderBlock); -VOID -NTAPI -MiFreeInitMemory(VOID); - -VOID -NTAPI -MmInitializeMdlImplementation(VOID); /* pagefile.c ****************************************************************/ @@ -738,10 +600,6 @@ SWAPENTRY NTAPI MmAllocSwapPage(VOID); -VOID -NTAPI -MmDereserveSwapPages(ULONG Nr); - VOID NTAPI MmFreeSwapPage(SWAPENTRY Entry); @@ -761,10 +619,6 @@ MmReadFromSwapPage( PFN_NUMBER Page ); -BOOLEAN -NTAPI -MmReserveSwapPages(ULONG Nr); - NTSTATUS NTAPI MmWriteToSwapPage( @@ -772,25 +626,17 @@ MmWriteToSwapPage( PFN_NUMBER Page ); -NTSTATUS -NTAPI -MmDumpToPagingFile( - ULONG BugCode, - ULONG BugCodeParameter1, - ULONG BugCodeParameter2, - ULONG BugCodeParameter3, - ULONG BugCodeParameter4, - struct _KTRAP_FRAME* TrapFrame -); - -BOOLEAN -NTAPI -MmIsAvailableSwapPage(VOID); - VOID NTAPI MmShowOutOfSpaceMessagePagingFile(VOID); +NTSTATUS +NTAPI +MiReadPageFile( + _In_ PFN_NUMBER Page, + _In_ ULONG PageFileIndex, + _In_ ULONG_PTR PageFileOffset); + /* process.c ****************************************************************/ NTSTATUS @@ -862,7 +708,7 @@ MmPageFault( VOID NTAPI -MiInitializeSpecialPool(); +MiInitializeSpecialPool(VOID); BOOLEAN NTAPI @@ -875,6 +721,11 @@ NTAPI MmIsSpecialPoolAddress( IN PVOID P); +BOOLEAN +NTAPI +MmIsSpecialPoolAddressFree( + IN PVOID P); + PVOID NTAPI MmAllocateSpecialPool( @@ -899,75 +750,8 @@ MmAccessFault( IN PVOID TrapInformation ); -/* anonmem.c *****************************************************************/ - -NTSTATUS -NTAPI -MmNotPresentFaultVirtualMemory( - PMMSUPPORT AddressSpace, - MEMORY_AREA* MemoryArea, - PVOID Address -); - -NTSTATUS -NTAPI -MmPageOutVirtualMemory( - PMMSUPPORT AddressSpace, - PMEMORY_AREA MemoryArea, - PVOID Address, - PFN_NUMBER Page -); - -NTSTATUS -NTAPI -MmQueryAnonMem( - PMEMORY_AREA MemoryArea, - PVOID Address, - PMEMORY_BASIC_INFORMATION Info, - PSIZE_T ResultLength -); - -VOID -NTAPI -MmFreeVirtualMemory( - struct _EPROCESS* Process, - PMEMORY_AREA MemoryArea -); - -NTSTATUS -NTAPI -MmProtectAnonMem( - PMMSUPPORT AddressSpace, - PMEMORY_AREA MemoryArea, - PVOID BaseAddress, - SIZE_T Length, - ULONG Protect, - PULONG OldProtect -); - -NTSTATUS -NTAPI -MmWritePageVirtualMemory( - PMMSUPPORT AddressSpace, - PMEMORY_AREA MArea, - PVOID Address, - PFN_NUMBER Page -); - /* kmap.c ********************************************************************/ -PVOID -NTAPI -ExAllocatePage(VOID); - -VOID -NTAPI -ExUnmapPage(PVOID Addr); - -PVOID -NTAPI -ExAllocatePageWithPhysPage(PFN_NUMBER Page); - NTSTATUS NTAPI MiCopyFromUserPage( @@ -975,16 +759,6 @@ MiCopyFromUserPage( PFN_NUMBER OldPage ); -NTSTATUS -NTAPI -MiZeroPage(PFN_NUMBER Page); - -/* memsafe.s *****************************************************************/ - -PVOID -FASTCALL -MmSafeReadPtr(PVOID Source); - /* process.c *****************************************************************/ PVOID @@ -1140,40 +914,12 @@ VOID NTAPI MmRemoveLRUUserPage(PFN_NUMBER Page); -VOID -NTAPI -MmLockPage(PFN_NUMBER Page); - -VOID -NTAPI -MmUnlockPage(PFN_NUMBER Page); - -ULONG -NTAPI -MmGetLockCountPage(PFN_NUMBER Page); - -VOID -NTAPI -MmInitializePageList( - VOID -); - VOID NTAPI MmDumpArmPfnDatabase( IN BOOLEAN StatusOnly ); -PFN_NUMBER -NTAPI -MmGetContinuousPages( - ULONG NumberOfBytes, - PHYSICAL_ADDRESS LowestAcceptableAddress, - PHYSICAL_ADDRESS HighestAcceptableAddress, - PHYSICAL_ADDRESS BoundaryAddressMultiple, - BOOLEAN ZeroPages -); - VOID NTAPI MmZeroPageThread( @@ -1222,22 +968,6 @@ MmCreateHyperspaceMapping(IN PFN_NUMBER Page) /* i386/page.c *********************************************************/ -NTSTATUS -NTAPI -MmCreateVirtualMappingForKernel( - PVOID Address, - ULONG flProtect, - PPFN_NUMBER Pages, - ULONG PageCount -); - -NTSTATUS -NTAPI -MmCommitPagedPoolAddress( - PVOID Address, - BOOLEAN Locked -); - NTSTATUS NTAPI MmCreateVirtualMapping( @@ -1290,13 +1020,6 @@ VOID NTAPI MmInitGlobalKernelPageDirectory(VOID); -VOID -NTAPI -MmEnableVirtualMapping( - struct _EPROCESS *Process, - PVOID Address -); - VOID NTAPI MmGetPageFileMapping( @@ -1327,13 +1050,6 @@ MmIsPageSwapEntry( PVOID Address ); -VOID -NTAPI -MmTransferOwnershipPage( - PFN_NUMBER Page, - ULONG NewConsumer -); - VOID NTAPI MmSetDirtyPage( @@ -1347,16 +1063,6 @@ MmAllocPage( ULONG Consumer ); -LONG -NTAPI -MmAllocPagesSpecifyRange( - ULONG Consumer, - PHYSICAL_ADDRESS LowestAddress, - PHYSICAL_ADDRESS HighestAddress, - ULONG NumberOfPages, - PPFN_NUMBER Pages -); - VOID NTAPI MmDereferencePage(PFN_NUMBER Page); @@ -1390,10 +1096,6 @@ MmSetCleanPage( PVOID Address ); -NTSTATUS -NTAPI -MmCreatePageTable(PVOID PAddress); - VOID NTAPI MmDeletePageTable( @@ -1430,10 +1132,6 @@ MmInitializeHandBuiltProcess2( IN PEPROCESS Process ); -NTSTATUS -NTAPI -MmReleaseMmInfo(struct _EPROCESS *Process); - NTSTATUS NTAPI MmSetExecuteOptions(IN ULONG ExecuteOptions); @@ -1442,16 +1140,11 @@ NTSTATUS NTAPI MmGetExecuteOptions(IN PULONG ExecuteOptions); -VOID -NTAPI -MmDeleteProcessPageDirectory(struct _EPROCESS *Process); - VOID NTAPI MmDeleteVirtualMapping( struct _EPROCESS *Process, PVOID Address, - BOOLEAN FreePage, BOOLEAN* WasDirty, PPFN_NUMBER Page ); @@ -1463,30 +1156,6 @@ MmIsDirtyPage( PVOID Address ); -VOID -NTAPI -MmMarkPageMapped(PFN_NUMBER Page); - -VOID -NTAPI -MmMarkPageUnmapped(PFN_NUMBER Page); - -VOID -NTAPI -MmUpdatePageDir( - struct _EPROCESS *Process, - PVOID Address, - ULONG Size -); - -VOID -NTAPI -MiInitPageDirectoryMap(VOID); - -ULONG -NTAPI -MiGetUserPageDirectoryCount(VOID); - /* wset.c ********************************************************************/ NTSTATUS @@ -1556,13 +1225,6 @@ MmGetFileNameForSection( OUT POBJECT_NAME_INFORMATION *ModuleName ); -PVOID -NTAPI -MmAllocateSection( - IN SIZE_T Length, - PVOID BaseAddress -); - NTSTATUS NTAPI MmQuerySectionView( @@ -1621,41 +1283,6 @@ VOID NTAPI MmFreeSectionSegments(PFILE_OBJECT FileObject); -/* mpw.c *********************************************************************/ - -NTSTATUS -NTAPI -MmInitMpwThread(VOID); - -NTSTATUS -NTAPI -MmInitBsmThread(VOID); - -/* pager.c *******************************************************************/ - -BOOLEAN -NTAPI -MiIsPagerThread(VOID); - -VOID -NTAPI -MiStartPagerThread(VOID); - -VOID -NTAPI -MiStopPagerThread(VOID); - -NTSTATUS -FASTCALL -MiQueryVirtualMemory( - IN HANDLE ProcessHandle, - IN PVOID Address, - IN MEMORY_INFORMATION_CLASS VirtualMemoryInformationClass, - OUT PVOID VirtualMemoryInformation, - IN SIZE_T Length, - OUT PSIZE_T ResultLength -); - /* sysldr.c ******************************************************************/ VOID @@ -1757,6 +1384,22 @@ ExpCheckPoolAllocation( POOL_TYPE PoolType, ULONG Tag); +VOID +NTAPI +ExReturnPoolQuota( + IN PVOID P); + + +/* mmsup.c *****************************************************************/ + +NTSTATUS +NTAPI +MmAdjustWorkingSetSize( + IN SIZE_T WorkingSetMinimumInBytes, + IN SIZE_T WorkingSetMaximumInBytes, + IN ULONG SystemCache, + IN BOOLEAN IncreaseOkay); + /* session.c *****************************************************************/ @@ -1789,3 +1432,17 @@ VOID NTAPI MmSetSessionLocaleId( _In_ LCID LocaleId); + + +/* virtual.c *****************************************************************/ + +NTSTATUS +NTAPI +MmCopyVirtualMemory(IN PEPROCESS SourceProcess, + IN PVOID SourceAddress, + IN PEPROCESS TargetProcess, + OUT PVOID TargetAddress, + IN SIZE_T BufferSize, + IN KPROCESSOR_MODE PreviousMode, + OUT PSIZE_T ReturnSize); +