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;
|
|
|
|
|
2001-01-08 02:14:06 +00:00
|
|
|
#define MEMORY_AREA_INVALID (0)
|
|
|
|
#define MEMORY_AREA_SECTION_VIEW_COMMIT (1)
|
|
|
|
#define MEMORY_AREA_CONTINUOUS_MEMORY (2)
|
|
|
|
#define MEMORY_AREA_NO_CACHE (3)
|
|
|
|
#define MEMORY_AREA_IO_MAPPING (4)
|
|
|
|
#define MEMORY_AREA_SYSTEM (5)
|
|
|
|
#define MEMORY_AREA_MDL_MAPPING (7)
|
|
|
|
#define MEMORY_AREA_VIRTUAL_MEMORY (8)
|
|
|
|
#define MEMORY_AREA_SECTION_VIEW_RESERVE (9)
|
|
|
|
#define MEMORY_AREA_CACHE_SEGMENT (10)
|
|
|
|
#define MEMORY_AREA_SHARED_DATA (11)
|
2001-02-06 00:11:20 +00:00
|
|
|
#define MEMORY_AREA_WORKING_SET (12)
|
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
|
|
|
|
2001-01-08 02:14:06 +00:00
|
|
|
/*
|
|
|
|
* Flags for section objects
|
|
|
|
*/
|
2000-12-28 03:38:08 +00:00
|
|
|
#define SO_PHYSICAL_MEMORY (0x1)
|
|
|
|
|
2001-01-08 02:14:06 +00:00
|
|
|
/*
|
|
|
|
* Additional flags for protection attributes
|
|
|
|
*/
|
|
|
|
#define PAGE_WRITETHROUGH (1024)
|
|
|
|
#define PAGE_SYSTEM (2048)
|
|
|
|
#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)
|
|
|
|
|
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;
|
|
|
|
|
2001-02-10 22:51:11 +00:00
|
|
|
#define MM_PAGEFILE_SECTION (0x1)
|
|
|
|
#define MM_IMAGE_SECTION (0x2)
|
|
|
|
|
|
|
|
#define MM_SECTION_SEGMENT_BSS (0x1)
|
|
|
|
|
|
|
|
typedef struct _MM_SECTION_SEGMENT
|
2001-01-12 21:00:08 +00:00
|
|
|
{
|
|
|
|
ULONG FileOffset;
|
|
|
|
ULONG Protection;
|
|
|
|
ULONG Attributes;
|
2001-02-10 22:51:11 +00:00
|
|
|
ULONG Length;
|
|
|
|
ULONG RawLength;
|
2001-01-12 21:00:08 +00:00
|
|
|
KMUTEX Lock;
|
2001-02-10 22:51:11 +00:00
|
|
|
ULONG ReferenceCount;
|
|
|
|
SECTION_PAGE_DIRECTORY PageDirectory;
|
|
|
|
ULONG Flags;
|
|
|
|
PVOID VirtualAddress;
|
|
|
|
ULONG Characteristics;
|
|
|
|
} MM_SECTION_SEGMENT, *PMM_SECTION_SEGMENT;
|
2001-01-12 21:00:08 +00:00
|
|
|
|
1998-09-05 17:34:23 +00:00
|
|
|
typedef struct
|
1998-08-25 04:27:41 +00:00
|
|
|
{
|
2000-12-28 03:38:08 +00:00
|
|
|
CSHORT Type;
|
|
|
|
CSHORT Size;
|
|
|
|
LARGE_INTEGER MaximumSize;
|
|
|
|
ULONG SectionPageProtection;
|
|
|
|
ULONG AllocateAttributes;
|
|
|
|
PFILE_OBJECT FileObject;
|
|
|
|
LIST_ENTRY ViewListHead;
|
|
|
|
KSPIN_LOCK ViewListLock;
|
|
|
|
KMUTEX Lock;
|
|
|
|
ULONG Flags;
|
2001-02-10 22:51:11 +00:00
|
|
|
ULONG NrSegments;
|
|
|
|
PMM_SECTION_SEGMENT Segments;
|
|
|
|
PVOID ImageBase;
|
|
|
|
PVOID EntryPoint;
|
|
|
|
ULONG StackReserve;
|
|
|
|
ULONG StackCommit;
|
|
|
|
ULONG Subsystem;
|
|
|
|
ULONG MinorSubsystemVersion;
|
|
|
|
ULONG MajorSubsystemVersion;
|
|
|
|
ULONG ImageCharacteristics;
|
|
|
|
USHORT Machine;
|
|
|
|
BOOLEAN Executable;
|
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;
|
2001-02-10 22:51:11 +00:00
|
|
|
PMM_SECTION_SEGMENT Segment;
|
1998-09-13 15:55:55 +00:00
|
|
|
} SectionData;
|
2000-08-18 22:27:09 +00:00
|
|
|
struct
|
|
|
|
{
|
|
|
|
LIST_ENTRY SegmentListHead;
|
|
|
|
} VirtualMemoryData;
|
1998-09-13 15:55:55 +00:00
|
|
|
} Data;
|
1998-10-05 04:01:30 +00:00
|
|
|
} MEMORY_AREA, *PMEMORY_AREA;
|
1998-09-05 17:34:23 +00:00
|
|
|
|
2000-07-04 08:52:47 +00:00
|
|
|
typedef struct _MADDRESS_SPACE
|
|
|
|
{
|
2001-02-06 00:11:20 +00:00
|
|
|
LIST_ENTRY MAreaListHead;
|
|
|
|
KMUTEX Lock;
|
|
|
|
ULONG LowestAddress;
|
|
|
|
struct _EPROCESS* Process;
|
|
|
|
PMEMORY_AREA WorkingSetArea;
|
|
|
|
ULONG WorkingSetSize;
|
|
|
|
ULONG WorkingSetLruFirst;
|
|
|
|
ULONG WorkingSetLruLast;
|
|
|
|
ULONG WorkingSetPagesAllocated;
|
|
|
|
ULONG WorkingSetMaximumLength;
|
|
|
|
PUSHORT PageTableRefCountTable;
|
|
|
|
ULONG PageTableRefCountTableSize;
|
2000-07-04 08:52:47 +00:00
|
|
|
} 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,
|
2001-02-10 22:51:11 +00:00
|
|
|
VOID (*FreePage)(PVOID Context, PVOID Address),
|
|
|
|
PVOID FreePageContext);
|
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);
|
2000-08-20 17:02:10 +00:00
|
|
|
VOID MmDeleteVirtualMapping(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);
|
2001-02-10 22:51:11 +00:00
|
|
|
NTSTATUS STDCALL
|
|
|
|
MmUnmapViewOfSection(struct _EPROCESS* Process, PVOID BaseAddress);
|
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);
|
|
|
|
|
2001-02-14 02:53:54 +00:00
|
|
|
NTSTATUS
|
|
|
|
MmAccessFault(KPROCESSOR_MODE Mode,
|
|
|
|
ULONG Address,
|
|
|
|
BOOLEAN FromMdl);
|
|
|
|
NTSTATUS
|
|
|
|
MmNotPresentFault(KPROCESSOR_MODE Mode,
|
|
|
|
ULONG Address,
|
|
|
|
BOOLEAN FromMdl);
|
|
|
|
NTSTATUS
|
|
|
|
MmNotPresentFaultVirtualMemory(PMADDRESS_SPACE AddressSpace,
|
|
|
|
MEMORY_AREA* MemoryArea,
|
|
|
|
PVOID Address,
|
|
|
|
BOOLEAN Locked);
|
|
|
|
NTSTATUS
|
|
|
|
MmNotPresentFaultSectionView(PMADDRESS_SPACE AddressSpace,
|
|
|
|
MEMORY_AREA* MemoryArea,
|
|
|
|
PVOID Address,
|
|
|
|
BOOLEAN Locked);
|
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);
|
2001-02-10 22:51:11 +00:00
|
|
|
VOID MmAddPageToWorkingSet(struct _EPROCESS* Process,
|
|
|
|
PVOID Address);
|
2000-07-04 08:52:47 +00:00
|
|
|
|
|
|
|
VOID MmInitPagingFile(VOID);
|
2001-02-10 22:51:11 +00:00
|
|
|
BOOLEAN MmReserveSwapPages(ULONG Nr);
|
2000-07-04 08:52:47 +00:00
|
|
|
VOID MmDereserveSwapPages(ULONG Nr);
|
|
|
|
SWAPENTRY MmAllocSwapPage(VOID);
|
|
|
|
VOID MmFreeSwapPage(SWAPENTRY Entry);
|
|
|
|
|
2000-10-07 13:41:58 +00:00
|
|
|
VOID MmInit1(ULONG FirstKernelPhysAddress,
|
|
|
|
ULONG LastKernelPhysAddress,
|
|
|
|
ULONG LastKernelAddress);
|
2000-07-04 08:52:47 +00:00
|
|
|
VOID MmInit2(VOID);
|
|
|
|
VOID MmInit3(VOID);
|
|
|
|
NTSTATUS MmInitPagerThread(VOID);
|
|
|
|
|
|
|
|
VOID MmInitKernelMap(PVOID BaseAddress);
|
|
|
|
|
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;
|
|
|
|
|
2001-02-16 18:32:20 +00:00
|
|
|
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);
|
2000-07-07 10:30:57 +00:00
|
|
|
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
|
|
|
|
2000-10-07 13:41:58 +00:00
|
|
|
NTSTATUS MmSafeCopyFromUser(PVOID Dest, PVOID Src, ULONG Count);
|
|
|
|
NTSTATUS MmSafeCopyToUser(PVOID Dest, PVOID Src, ULONG Count);
|
2000-12-28 03:38:08 +00:00
|
|
|
NTSTATUS
|
|
|
|
MmCreatePhysicalMemorySection(VOID);
|
2000-12-29 23:17:12 +00:00
|
|
|
PVOID
|
|
|
|
MmGetContinuousPages(ULONG NumberOfBytes,
|
2001-02-28 18:23:32 +00:00
|
|
|
PHYSICAL_ADDRESS HighestAcceptableAddress,
|
|
|
|
ULONG Alignment);
|
2000-10-07 13:41:58 +00:00
|
|
|
|
2000-07-07 10:30:57 +00:00
|
|
|
#define MM_PHYSICAL_PAGE_MPW_PENDING (0x8)
|
|
|
|
|
2001-02-10 22:51:11 +00:00
|
|
|
NTSTATUS
|
|
|
|
MmAccessFaultSectionView(PMADDRESS_SPACE AddressSpace,
|
2001-02-14 02:53:54 +00:00
|
|
|
MEMORY_AREA* MemoryArea,
|
|
|
|
PVOID Address,
|
|
|
|
BOOLEAN Locked);
|
2001-02-10 22:51:11 +00:00
|
|
|
ULONG
|
|
|
|
MmGetPageProtect(struct _EPROCESS* Process, PVOID Address);
|
|
|
|
PVOID
|
|
|
|
ExAllocatePageWithPhysPage(ULONG PhysPage);
|
|
|
|
ULONG
|
|
|
|
MmGetReferenceCountPage(PVOID PhysicalAddress);
|
|
|
|
BOOLEAN
|
|
|
|
MmIsUsablePage(PVOID PhysicalAddress);
|
|
|
|
|
2001-02-16 18:32:20 +00:00
|
|
|
typedef struct _MM_PAGEOP
|
|
|
|
{
|
|
|
|
/* Type of operation. */
|
|
|
|
ULONG OpType;
|
|
|
|
/* Number of threads interested in this operation. */
|
|
|
|
ULONG ReferenceCount;
|
|
|
|
/* Event that will be set when the operation is completed. */
|
|
|
|
KEVENT CompletionEvent;
|
|
|
|
/* Status of the operation once it is completed. */
|
|
|
|
NTSTATUS Status;
|
|
|
|
/* TRUE if the operation was abandoned. */
|
|
|
|
BOOLEAN Abandoned;
|
|
|
|
/* The memory area to be affected by the operation. */
|
|
|
|
PMEMORY_AREA MArea;
|
|
|
|
struct _MM_PAGEOP* Next;
|
|
|
|
/*
|
|
|
|
* These fields are used to identify the operation if it is against a
|
|
|
|
* virtual memory area.
|
|
|
|
*/
|
|
|
|
ULONG Pid;
|
|
|
|
PVOID Address;
|
|
|
|
/*
|
|
|
|
* These fields are used to identify the operation if it is against a
|
|
|
|
* section mapping.
|
|
|
|
*/
|
|
|
|
PMM_SECTION_SEGMENT Segment;
|
|
|
|
ULONG Offset;
|
|
|
|
} MM_PAGEOP, *PMM_PAGEOP;
|
|
|
|
|
1998-08-25 04:27:41 +00:00
|
|
|
#endif
|