1998-08-25 04:27:41 +00:00
|
|
|
/*
|
|
|
|
* Higher level memory managment definitions
|
|
|
|
*/
|
|
|
|
|
1998-09-05 17:34:23 +00:00
|
|
|
#ifndef __INCLUDE_INTERNAL_MM_H
|
|
|
|
#define __INCLUDE_INTERNAL_MM_H
|
1998-08-25 04:27:41 +00:00
|
|
|
|
1998-09-05 17:34:23 +00:00
|
|
|
#include <internal/ntoskrnl.h>
|
2000-06-29 23:35:53 +00:00
|
|
|
#include <internal/mmhal.h>
|
1998-08-25 04:27:41 +00:00
|
|
|
|
1998-09-05 17:34:23 +00:00
|
|
|
/* TYPES *********************************************************************/
|
|
|
|
|
2000-07-04 08:52:47 +00:00
|
|
|
struct _EPROCESS;
|
|
|
|
typedef ULONG SWAPENTRY;
|
|
|
|
|
1998-09-05 17:34:23 +00:00
|
|
|
enum
|
|
|
|
{
|
|
|
|
MEMORY_AREA_INVALID,
|
1998-10-05 04:01:30 +00:00
|
|
|
MEMORY_AREA_SECTION_VIEW_COMMIT,
|
1998-09-05 17:34:23 +00:00
|
|
|
MEMORY_AREA_CONTINUOUS_MEMORY,
|
|
|
|
MEMORY_AREA_NO_CACHE,
|
|
|
|
MEMORY_AREA_IO_MAPPING,
|
|
|
|
MEMORY_AREA_SYSTEM,
|
|
|
|
MEMORY_AREA_MDL_MAPPING,
|
1998-10-05 04:01:30 +00:00
|
|
|
MEMORY_AREA_COMMIT,
|
|
|
|
MEMORY_AREA_RESERVE,
|
|
|
|
MEMORY_AREA_SECTION_VIEW_RESERVE,
|
1999-04-05 15:04:46 +00:00
|
|
|
MEMORY_AREA_CACHE_SEGMENT,
|
2000-08-12 19:33:23 +00:00
|
|
|
MEMORY_AREA_SHARED_DATA,
|
1998-09-05 17:34:23 +00:00
|
|
|
};
|
|
|
|
|
2000-05-24 22:29:38 +00:00
|
|
|
#define PAGE_TO_SECTION_PAGE_DIRECTORY_OFFSET(x) \
|
|
|
|
((x) / (4*1024*1024))
|
|
|
|
#define PAGE_TO_SECTION_PAGE_TABLE_OFFSET(x) \
|
|
|
|
((((x)) % (4*1024*1024)) / (4*1024))
|
2000-04-03 21:54:42 +00:00
|
|
|
|
|
|
|
#define NR_SECTION_PAGE_TABLES (1024)
|
|
|
|
#define NR_SECTION_PAGE_ENTRIES (1024)
|
|
|
|
|
2000-06-29 23:35:53 +00:00
|
|
|
#define SPE_PAGEIN_PENDING (0x1)
|
|
|
|
#define SPE_MPW_PENDING (0x2)
|
|
|
|
#define SPE_PAGEOUT_PENDING (0x4)
|
2000-07-04 08:52:47 +00:00
|
|
|
#define SPE_DIRTY (0x8)
|
|
|
|
#define SPE_IN_PAGEFILE (0x10)
|
2000-06-25 03:59:17 +00:00
|
|
|
|
2000-04-03 21:54:42 +00:00
|
|
|
typedef struct
|
|
|
|
{
|
2000-06-25 03:59:17 +00:00
|
|
|
ULONG Pages[NR_SECTION_PAGE_ENTRIES];
|
2000-04-03 21:54:42 +00:00
|
|
|
} SECTION_PAGE_TABLE, *PSECTION_PAGE_TABLE;
|
|
|
|
|
|
|
|
typedef struct
|
|
|
|
{
|
|
|
|
PSECTION_PAGE_TABLE PageTables[NR_SECTION_PAGE_TABLES];
|
|
|
|
} SECTION_PAGE_DIRECTORY, *PSECTION_PAGE_DIRECTORY;
|
|
|
|
|
1998-09-05 17:34:23 +00:00
|
|
|
typedef struct
|
1998-08-25 04:27:41 +00:00
|
|
|
{
|
1998-09-13 15:55:55 +00:00
|
|
|
CSHORT Type;
|
|
|
|
CSHORT Size;
|
1998-10-05 04:01:30 +00:00
|
|
|
LARGE_INTEGER MaximumSize;
|
|
|
|
ULONG SectionPageProtection;
|
|
|
|
ULONG AllocateAttributes;
|
|
|
|
PFILE_OBJECT FileObject;
|
1999-11-24 11:51:55 +00:00
|
|
|
LIST_ENTRY ViewListHead;
|
|
|
|
KSPIN_LOCK ViewListLock;
|
2000-04-03 21:54:42 +00:00
|
|
|
KMUTEX Lock;
|
|
|
|
SECTION_PAGE_DIRECTORY PageDirectory;
|
1998-10-05 04:01:30 +00:00
|
|
|
} SECTION_OBJECT, *PSECTION_OBJECT;
|
1998-08-25 04:27:41 +00:00
|
|
|
|
1998-09-05 17:34:23 +00:00
|
|
|
typedef struct
|
|
|
|
{
|
|
|
|
ULONG Type;
|
1998-10-05 04:01:30 +00:00
|
|
|
PVOID BaseAddress;
|
1998-09-05 17:34:23 +00:00
|
|
|
ULONG Length;
|
|
|
|
ULONG Attributes;
|
|
|
|
LIST_ENTRY Entry;
|
1998-09-13 15:55:55 +00:00
|
|
|
ULONG LockCount;
|
2000-07-04 08:52:47 +00:00
|
|
|
struct _EPROCESS* Process;
|
1998-09-05 17:34:23 +00:00
|
|
|
union
|
|
|
|
{
|
1998-09-13 15:55:55 +00:00
|
|
|
struct
|
|
|
|
{
|
|
|
|
SECTION_OBJECT* Section;
|
|
|
|
ULONG ViewOffset;
|
1999-11-24 11:51:55 +00:00
|
|
|
LIST_ENTRY ViewListEntry;
|
1998-09-13 15:55:55 +00:00
|
|
|
} SectionData;
|
|
|
|
} Data;
|
1998-10-05 04:01:30 +00:00
|
|
|
} MEMORY_AREA, *PMEMORY_AREA;
|
1998-09-05 17:34:23 +00:00
|
|
|
|
2000-07-08 16:53:33 +00:00
|
|
|
#define WSET_ADDRESSES_IN_PAGE (1020)
|
|
|
|
|
2000-07-04 08:52:47 +00:00
|
|
|
typedef struct _MWORKING_SET
|
|
|
|
{
|
2000-07-08 16:53:33 +00:00
|
|
|
PVOID Address[WSET_ADDRESSES_IN_PAGE];
|
2000-07-04 08:52:47 +00:00
|
|
|
struct _MWORKING_SET* Next;
|
|
|
|
} MWORKING_SET, *PMWORKING_SET;
|
|
|
|
|
|
|
|
typedef struct _MADDRESS_SPACE
|
|
|
|
{
|
|
|
|
LIST_ENTRY MAreaListHead;
|
|
|
|
KMUTEX Lock;
|
|
|
|
ULONG LowestAddress;
|
|
|
|
struct _EPROCESS* Process;
|
|
|
|
ULONG WorkingSetSize;
|
|
|
|
ULONG WorkingSetLruFirst;
|
|
|
|
ULONG WorkingSetLruLast;
|
|
|
|
ULONG WorkingSetPagesAllocated;
|
|
|
|
} MADDRESS_SPACE, *PMADDRESS_SPACE;
|
1998-09-05 17:34:23 +00:00
|
|
|
|
2000-03-19 09:14:52 +00:00
|
|
|
/* FUNCTIONS */
|
|
|
|
|
2000-03-29 13:11:55 +00:00
|
|
|
VOID MmLockAddressSpace(PMADDRESS_SPACE AddressSpace);
|
|
|
|
VOID MmUnlockAddressSpace(PMADDRESS_SPACE AddressSpace);
|
|
|
|
VOID MmInitializeKernelAddressSpace(VOID);
|
|
|
|
PMADDRESS_SPACE MmGetCurrentAddressSpace(VOID);
|
|
|
|
PMADDRESS_SPACE MmGetKernelAddressSpace(VOID);
|
2000-07-04 08:52:47 +00:00
|
|
|
NTSTATUS MmInitializeAddressSpace(struct _EPROCESS* Process,
|
2000-04-07 02:24:03 +00:00
|
|
|
PMADDRESS_SPACE AddressSpace);
|
2000-03-29 13:11:55 +00:00
|
|
|
NTSTATUS MmDestroyAddressSpace(PMADDRESS_SPACE AddressSpace);
|
|
|
|
PVOID STDCALL MmAllocateSection (IN ULONG Length);
|
2000-07-04 08:52:47 +00:00
|
|
|
NTSTATUS MmCreateMemoryArea(struct _EPROCESS* Process,
|
2000-03-29 13:11:55 +00:00
|
|
|
PMADDRESS_SPACE AddressSpace,
|
1998-09-05 17:34:23 +00:00
|
|
|
ULONG Type,
|
1998-10-05 04:01:30 +00:00
|
|
|
PVOID* BaseAddress,
|
1998-09-05 17:34:23 +00:00
|
|
|
ULONG Length,
|
|
|
|
ULONG Attributes,
|
|
|
|
MEMORY_AREA** Result);
|
2000-03-29 13:11:55 +00:00
|
|
|
MEMORY_AREA* MmOpenMemoryAreaByAddress(PMADDRESS_SPACE AddressSpace,
|
|
|
|
PVOID Address);
|
1998-09-05 17:34:23 +00:00
|
|
|
NTSTATUS MmInitMemoryAreas(VOID);
|
|
|
|
VOID ExInitNonPagedPool(ULONG BaseAddress);
|
2000-03-29 13:11:55 +00:00
|
|
|
NTSTATUS MmFreeMemoryArea(PMADDRESS_SPACE AddressSpace,
|
1998-10-05 04:01:30 +00:00
|
|
|
PVOID BaseAddress,
|
1998-09-05 17:34:23 +00:00
|
|
|
ULONG Length,
|
|
|
|
BOOLEAN FreePages);
|
1998-10-05 04:01:30 +00:00
|
|
|
VOID MmDumpMemoryAreas(PLIST_ENTRY ListHead);
|
|
|
|
NTSTATUS MmLockMemoryArea(MEMORY_AREA* MemoryArea);
|
|
|
|
NTSTATUS MmUnlockMemoryArea(MEMORY_AREA* MemoryArea);
|
|
|
|
NTSTATUS MmInitSectionImplementation(VOID);
|
|
|
|
|
|
|
|
#define MM_LOWEST_USER_ADDRESS (4096)
|
|
|
|
|
2000-07-04 08:52:47 +00:00
|
|
|
PMEMORY_AREA MmSplitMemoryArea(struct _EPROCESS* Process,
|
2000-03-29 13:11:55 +00:00
|
|
|
PMADDRESS_SPACE AddressSpace,
|
1998-10-05 04:01:30 +00:00
|
|
|
PMEMORY_AREA OriginalMemoryArea,
|
|
|
|
PVOID BaseAddress,
|
|
|
|
ULONG Length,
|
|
|
|
ULONG NewType,
|
|
|
|
ULONG NewAttributes);
|
1999-03-31 10:59:32 +00:00
|
|
|
PVOID MmInitializePageList(PVOID FirstPhysKernelAddress,
|
|
|
|
PVOID LastPhysKernelAddress,
|
|
|
|
ULONG MemorySizeInPages,
|
|
|
|
ULONG LastKernelBase);
|
|
|
|
|
2000-07-04 08:52:47 +00:00
|
|
|
PVOID MmAllocPage(SWAPENTRY SavedSwapEntry);
|
1999-12-20 02:14:40 +00:00
|
|
|
VOID MmDereferencePage(PVOID PhysicalAddress);
|
|
|
|
VOID MmReferencePage(PVOID PhysicalAddress);
|
2000-07-04 08:52:47 +00:00
|
|
|
VOID MmDeletePageTable(struct _EPROCESS* Process,
|
|
|
|
PVOID Address);
|
|
|
|
NTSTATUS MmCopyMmInfo(struct _EPROCESS* Src,
|
|
|
|
struct _EPROCESS* Dest);
|
|
|
|
NTSTATUS MmReleaseMmInfo(struct _EPROCESS* Process);
|
|
|
|
NTSTATUS Mmi386ReleaseMmInfo(struct _EPROCESS* Process);
|
|
|
|
VOID MmDeletePageEntry(struct _EPROCESS* Process,
|
|
|
|
PVOID Address,
|
|
|
|
BOOL FreePage);
|
1999-12-02 20:53:55 +00:00
|
|
|
|
2000-07-06 14:34:52 +00:00
|
|
|
VOID MmBuildMdlFromPages(PMDL Mdl, PULONG Pages);
|
1999-11-12 12:01:17 +00:00
|
|
|
PVOID MmGetMdlPageAddress(PMDL Mdl, PVOID Offset);
|
1999-11-24 11:51:55 +00:00
|
|
|
VOID MiShutdownMemoryManager(VOID);
|
2000-07-04 08:52:47 +00:00
|
|
|
ULONG MmGetPhysicalAddressForProcess(struct _EPROCESS* Process,
|
1999-11-24 11:51:55 +00:00
|
|
|
PVOID Address);
|
2000-07-04 08:52:47 +00:00
|
|
|
NTSTATUS STDCALL MmUnmapViewOfSection(struct _EPROCESS* Process,
|
|
|
|
PMEMORY_AREA MemoryArea);
|
1999-11-25 10:47:58 +00:00
|
|
|
NTSTATUS MmSafeCopyFromUser(PVOID Dest, PVOID Src, ULONG NumberOfBytes);
|
|
|
|
NTSTATUS MmSafeCopyToUser(PVOID Dest, PVOID Src, ULONG NumberOfBytes);
|
1999-12-10 17:04:37 +00:00
|
|
|
VOID MmInitPagingFile(VOID);
|
1999-11-25 10:47:58 +00:00
|
|
|
|
2000-04-02 13:32:43 +00:00
|
|
|
/* FIXME: it should be in ddk/mmfuncs.h */
|
|
|
|
NTSTATUS
|
|
|
|
STDCALL
|
|
|
|
MmCreateSection (
|
|
|
|
OUT PSECTION_OBJECT * SectionObject,
|
|
|
|
IN ACCESS_MASK DesiredAccess,
|
|
|
|
IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
|
|
|
|
IN PLARGE_INTEGER MaximumSize,
|
|
|
|
IN ULONG SectionPageProtection,
|
|
|
|
IN ULONG AllocationAttributes,
|
|
|
|
IN HANDLE FileHandle OPTIONAL,
|
|
|
|
IN PFILE_OBJECT File OPTIONAL
|
|
|
|
);
|
|
|
|
|
2000-04-07 02:24:03 +00:00
|
|
|
NTSTATUS MmPageFault(ULONG Cs,
|
|
|
|
PULONG Eip,
|
|
|
|
PULONG Eax,
|
|
|
|
ULONG Cr2,
|
|
|
|
ULONG ErrorCode);
|
|
|
|
|
|
|
|
NTSTATUS MmAccessFault(KPROCESSOR_MODE Mode,
|
|
|
|
ULONG Address);
|
|
|
|
NTSTATUS MmNotPresentFault(KPROCESSOR_MODE Mode,
|
|
|
|
ULONG Address);
|
2000-05-13 13:51:08 +00:00
|
|
|
NTSTATUS MmNotPresentFaultVirtualMemory(PMADDRESS_SPACE AddressSpace,
|
|
|
|
MEMORY_AREA* MemoryArea,
|
|
|
|
PVOID Address);
|
|
|
|
NTSTATUS MmNotPresentFaultSectionView(PMADDRESS_SPACE AddressSpace,
|
|
|
|
MEMORY_AREA* MemoryArea,
|
|
|
|
PVOID Address);
|
2000-06-25 03:59:17 +00:00
|
|
|
NTSTATUS MmWaitForPage(PVOID Page);
|
|
|
|
VOID MmClearWaitPage(PVOID Page);
|
|
|
|
VOID MmSetWaitPage(PVOID Page);
|
2000-07-04 08:52:47 +00:00
|
|
|
BOOLEAN MmIsPageDirty(struct _EPROCESS* Process, PVOID Address);
|
2000-06-25 03:59:17 +00:00
|
|
|
BOOLEAN MmIsPageTablePresent(PVOID PAddress);
|
|
|
|
ULONG MmPageOutSectionView(PMADDRESS_SPACE AddressSpace,
|
|
|
|
MEMORY_AREA* MemoryArea,
|
2000-07-06 14:34:52 +00:00
|
|
|
PVOID Address,
|
|
|
|
PBOOLEAN Ul);
|
2000-06-25 03:59:17 +00:00
|
|
|
ULONG MmPageOutVirtualMemory(PMADDRESS_SPACE AddressSpace,
|
|
|
|
PMEMORY_AREA MemoryArea,
|
2000-07-06 14:34:52 +00:00
|
|
|
PVOID Address,
|
|
|
|
PBOOLEAN Ul);
|
2000-06-25 03:59:17 +00:00
|
|
|
MEMORY_AREA* MmOpenMemoryAreaByRegion(PMADDRESS_SPACE AddressSpace,
|
|
|
|
PVOID Address,
|
|
|
|
ULONG Length);
|
|
|
|
|
2000-06-29 23:35:53 +00:00
|
|
|
VOID ExUnmapPage(PVOID Addr);
|
|
|
|
PVOID ExAllocatePage(VOID);
|
2000-04-07 02:24:03 +00:00
|
|
|
|
2000-07-04 08:52:47 +00:00
|
|
|
VOID MmLockWorkingSet(struct _EPROCESS* Process);
|
|
|
|
VOID MmUnlockWorkingSet(struct _EPROCESS* Process);
|
|
|
|
VOID MmInitializeWorkingSet(struct _EPROCESS* Process,
|
|
|
|
PMADDRESS_SPACE AddressSpace);
|
|
|
|
ULONG MmTrimWorkingSet(struct _EPROCESS* Process,
|
|
|
|
ULONG ReduceHint);
|
|
|
|
VOID MmRemovePageFromWorkingSet(struct _EPROCESS* Process,
|
|
|
|
PVOID Address);
|
|
|
|
BOOLEAN MmAddPageToWorkingSet(struct _EPROCESS* Process,
|
|
|
|
PVOID Address);
|
|
|
|
|
|
|
|
VOID MmInitPagingFile(VOID);
|
|
|
|
VOID MmReserveSwapPages(ULONG Nr);
|
|
|
|
VOID MmDereserveSwapPages(ULONG Nr);
|
|
|
|
SWAPENTRY MmAllocSwapPage(VOID);
|
|
|
|
VOID MmFreeSwapPage(SWAPENTRY Entry);
|
|
|
|
|
2000-07-04 11:11:06 +00:00
|
|
|
VOID MmInit1(PLOADER_PARAMETER_BLOCK bp, ULONG LastKernelAddress);
|
2000-07-04 08:52:47 +00:00
|
|
|
VOID MmInit2(VOID);
|
|
|
|
VOID MmInit3(VOID);
|
|
|
|
NTSTATUS MmInitPagerThread(VOID);
|
|
|
|
|
|
|
|
VOID MmInitKernelMap(PVOID BaseAddress);
|
|
|
|
unsigned int alloc_pool_region(unsigned int nr_pages);
|
|
|
|
|
2000-07-06 14:34:52 +00:00
|
|
|
VOID MmWaitForFreePages(VOID);
|
|
|
|
PVOID MmMustAllocPage(SWAPENTRY SavedSwapEntry);
|
|
|
|
PVOID MmAllocPageMaybeSwap(SWAPENTRY SavedSwapEntry);
|
|
|
|
NTSTATUS MmCreatePageTable(PVOID PAddress);
|
|
|
|
|
2000-07-07 10:30:57 +00:00
|
|
|
typedef struct
|
|
|
|
{
|
|
|
|
ULONG NrTotalPages;
|
|
|
|
ULONG NrSystemPages;
|
|
|
|
ULONG NrReservedPages;
|
|
|
|
ULONG NrUserPages;
|
|
|
|
ULONG NrFreePages;
|
|
|
|
ULONG NrDirtyPages;
|
2000-07-08 16:53:33 +00:00
|
|
|
ULONG NrLockedPages;
|
2000-07-07 10:30:57 +00:00
|
|
|
ULONG PagingRequestsInLastMinute;
|
|
|
|
ULONG PagingRequestsInLastFiveMinutes;
|
|
|
|
ULONG PagingRequestsInLastFifteenMinutes;
|
|
|
|
} MM_STATS;
|
|
|
|
|
|
|
|
extern MM_STATS MmStats;
|
|
|
|
|
|
|
|
NTSTATUS MmWritePageSectionView(PMADDRESS_SPACE AddressSpace,
|
|
|
|
PMEMORY_AREA MArea,
|
|
|
|
PVOID Address);
|
|
|
|
NTSTATUS MmWritePageVirtualMemory(PMADDRESS_SPACE AddressSpace,
|
|
|
|
PMEMORY_AREA MArea,
|
|
|
|
PVOID Address);
|
|
|
|
PVOID MmGetDirtyPagesFromWorkingSet(struct _EPROCESS* Process);
|
|
|
|
NTSTATUS MmWriteToSwapPage(SWAPENTRY SwapEntry, PMDL Mdl);
|
|
|
|
NTSTATUS MmReadFromSwapPage(SWAPENTRY SwapEntry, PMDL Mdl);
|
|
|
|
VOID MmSetFlagsPage(PVOID PhysicalAddress, ULONG Flags);
|
|
|
|
ULONG MmGetFlagsPage(PVOID PhysicalAddress);
|
|
|
|
VOID MmSetSavedSwapEntryPage(PVOID PhysicalAddress,
|
|
|
|
SWAPENTRY SavedSwapEntry);
|
|
|
|
SWAPENTRY MmGetSavedSwapEntryPage(PVOID PhysicalAddress);
|
|
|
|
VOID MmSetCleanPage(struct _EPROCESS* Process, PVOID Address);
|
2000-07-08 16:53:33 +00:00
|
|
|
VOID MmLockPage(PVOID PhysicalPage);
|
|
|
|
VOID MmUnlockPage(PVOID PhysicalPage);
|
2000-07-07 10:30:57 +00:00
|
|
|
|
|
|
|
#define MM_PHYSICAL_PAGE_MPW_PENDING (0x8)
|
|
|
|
|
1998-08-25 04:27:41 +00:00
|
|
|
#endif
|