struct _KTRAP_FRAME;
struct _EPROCESS;
struct _MM_RMAP_ENTRY;
-struct _MM_PAGEOP;
typedef ULONG_PTR SWAPENTRY;
//
#define MM_CORE_DUMP_TYPE_MINIMAL (0x1)
#define MM_CORE_DUMP_TYPE_FULL (0x2)
-#define MM_PAGEOP_PAGEIN (1)
-#define MM_PAGEOP_PAGEOUT (2)
-#define MM_PAGEOP_PAGESYNCH (3)
-#define MM_PAGEOP_ACCESSFAULT (4)
-#define MM_PAGEOP_CHANGEPROTECT (5)
-
/* Number of list heads to use */
#define MI_FREE_POOL_LISTS 4
(PAGE_WRITECOPY | \
PAGE_EXECUTE_WRITECOPY)
+//
+// Wait entry for marking pages that are being serviced
+//
+#define MM_WAIT_ENTRY 0x7ffffc00
#define InterlockedCompareExchangePte(PointerPte, Exchange, Comperand) \
InterlockedCompareExchange((PLONG)(PointerPte), Exchange, Comperand)
typedef struct _MM_IMAGE_SECTION_OBJECT
{
- ULONG_PTR ImageBase;
- ULONG_PTR StackReserve;
- ULONG_PTR StackCommit;
- ULONG_PTR EntryPoint;
- USHORT Subsystem;
- USHORT ImageCharacteristics;
- USHORT MinorSubsystemVersion;
- USHORT MajorSubsystemVersion;
- USHORT Machine;
- BOOLEAN Executable;
+ SECTION_IMAGE_INFORMATION ImageInformation;
+ PVOID BasedAddress;
ULONG NrSegments;
- ULONG ImageSize;
PMM_SECTION_SEGMENT Segments;
} MM_IMAGE_SECTION_OBJECT, *PMM_IMAGE_SECTION_OBJECT;
ULONG Protect;
ULONG Flags;
BOOLEAN DeleteInProgress;
- ULONG PageOpCount;
+ ULONG Magic;
PVOID Vad;
union
{
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
{
struct
{
- USHORT ReferenceCount; // ReferenceCount
+ USHORT ReferenceCount;
MMPFNENTRY e1;
};
struct
union
{
MMPTE OriginalPte;
- LONG AweReferenceCount; // RmapListHead
+ LONG AweReferenceCount;
+
+ // HACK for ROSPFN
+ PMM_RMAP_ENTRY RmapListHead;
};
union
{
MI_PFN_USAGES PfnUsage;
CHAR ProcessName[16];
#endif
+
+ // HACK until WS lists are supported
+ MMWSLE Wsle;
} MMPFN, *PMMPFN;
extern PMMPFN MmPfnDatabase;
extern MMPFNLIST MmModifiedPageListHead;
extern MMPFNLIST MmModifiedNoWritePageListHead;
-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;
- ULONG Hash;
- struct _MM_PAGEOP* Next;
- struct _ETHREAD* Thread;
- /*
- * These fields are used to identify the operation if it is against a
- * virtual memory area.
- */
- HANDLE Pid;
- PVOID Address;
- /*
- * These fields are used to identify the operation if it is against a
- * section mapping.
- */
- PMM_SECTION_SEGMENT Segment;
- ULONGLONG Offset;
-} MM_PAGEOP, *PMM_PAGEOP;
-
typedef struct _MM_MEMORY_CONSUMER
{
ULONG PagesUsed;
IN PVOID Address
);
+ULONG
+NTAPI
+MmGetSessionId(
+ IN PEPROCESS Process
+);
+
+ULONG
+NTAPI
+MmGetSessionIdEx(
+ IN PEPROCESS Process
+);
+
/* marea.c *******************************************************************/
NTSTATUS
PMEMORY_AREA *Result,
BOOLEAN FixedAddress,
ULONG AllocationFlags,
- PHYSICAL_ADDRESS BoundaryAddressMultiple OPTIONAL
+ ULONG AllocationGranularity
);
PMEMORY_AREA
ULONG Consumer,
ULONG Protection);
+VOID
+NTAPI
+MiRosCheckMemoryAreas(
+ PMMSUPPORT AddressSpace);
+
+VOID
+NTAPI
+MiCheckAllProcessMemoryAreas(VOID);
+
/* npool.c *******************************************************************/
VOID
PMMSUPPORT AddressSpace,
PMEMORY_AREA MemoryArea,
PVOID Address,
- struct _MM_PAGEOP* PageOp
+ PFN_NUMBER Page
);
NTSTATUS
PMMSUPPORT AddressSpace,
PMEMORY_AREA MArea,
PVOID Address,
- PMM_PAGEOP PageOp
+ PFN_NUMBER Page
);
/* kmap.c ********************************************************************/
NTSTATUS
NTAPI
MiCopyFromUserPage(
- PFN_NUMBER Page,
- PVOID SourceAddress
+ PFN_NUMBER NewPage,
+ PFN_NUMBER OldPage
);
NTSTATUS
FASTCALL
MmSafeReadPtr(PVOID Source);
-/* pageop.c ******************************************************************/
-
-VOID
-NTAPI
-MmReleasePageOp(PMM_PAGEOP PageOp);
-
-PMM_PAGEOP
-NTAPI
-MmGetPageOp(
- PMEMORY_AREA MArea,
- HANDLE Pid,
- PVOID Address,
- PMM_SECTION_SEGMENT Segment,
- ULONGLONG Offset,
- ULONG OpType,
- BOOLEAN First
-);
-
-PMM_PAGEOP
-NTAPI
-MmCheckForPageOp(
- PMEMORY_AREA MArea,
- HANDLE Pid,
- PVOID Address,
- PMM_SECTION_SEGMENT Segment,
- ULONGLONG Offset
-);
-
-VOID
-NTAPI
-MmInitializePageOp(VOID);
-
/* process.c *****************************************************************/
PVOID
PVOID Address
);
-VOID
+BOOLEAN
NTAPI
-MmInitGlobalKernelPageDirectory(VOID);
+MmIsDisabledPage(
+ struct _EPROCESS* Process,
+ PVOID Address
+);
VOID
NTAPI
-MmDisableVirtualMapping(
- struct _EPROCESS *Process,
- PVOID Address,
- BOOLEAN* WasDirty,
- PPFN_NUMBER Page
-);
+MmInitGlobalKernelPageDirectory(VOID);
VOID
NTAPI
PVOID Address
);
-VOID
-NTAPI
-MmRawDeleteVirtualMapping(PVOID Address);
-
-
VOID
NTAPI
MmGetPageFileMapping(
/* section.c *****************************************************************/
+VOID
+NTAPI
+MmGetImageInformation(
+ OUT PSECTION_IMAGE_INFORMATION ImageInformation
+);
+
PFILE_OBJECT
NTAPI
MmGetFileObjectForSection(
PMMSUPPORT AddressSpace,
PMEMORY_AREA MemoryArea,
PVOID Address,
- struct _MM_PAGEOP *PageOp
+ ULONG_PTR Entry
);
NTSTATUS
MmLockAddressSpace(PMMSUPPORT AddressSpace)
{
KeAcquireGuardedMutex(&CONTAINING_RECORD(AddressSpace, EPROCESS, Vm)->AddressCreationLock);
- //ASSERT(Thread->OwnsProcessAddressSpaceExclusive == 0);
- //Thread->OwnsProcessAddressSpaceExclusive = TRUE;
}
FORCEINLINE
VOID
MmUnlockAddressSpace(PMMSUPPORT AddressSpace)
{
- //ASSERT(Thread->OwnsProcessAddressSpaceExclusive == 1);
KeReleaseGuardedMutex(&CONTAINING_RECORD(AddressSpace, EPROCESS, Vm)->AddressCreationLock);
- //Thread->OwnsProcessAddressSpaceExclusive = 0;
}
FORCEINLINE
{
return MmKernelAddressSpace;
}
+
+
+/* expool.c ******************************************************************/
+
+VOID
+NTAPI
+ExpCheckPoolAllocation(
+ PVOID P,
+ POOL_TYPE PoolType,
+ ULONG Tag);
+
+
+/* mmsup.c *****************************************************************/
+
+NTSTATUS
+NTAPI
+MmAdjustWorkingSetSize(
+ IN SIZE_T WorkingSetMinimumInBytes,
+ IN SIZE_T WorkingSetMaximumInBytes,
+ IN ULONG SystemCache,
+ IN BOOLEAN IncreaseOkay);
+
+
+/* session.c *****************************************************************/
+
+_IRQL_requires_max_(APC_LEVEL)
+NTSTATUS
+NTAPI
+MmAttachSession(
+ _Inout_ PVOID SessionEntry,
+ _Out_ PKAPC_STATE ApcState);
+
+_IRQL_requires_max_(APC_LEVEL)
+VOID
+NTAPI
+MmDetachSession(
+ _Inout_ PVOID SessionEntry,
+ _Out_ PKAPC_STATE ApcState);
+
+VOID
+NTAPI
+MmQuitNextSession(
+ _Inout_ PVOID SessionEntry);
+
+PVOID
+NTAPI
+MmGetSessionById(
+ _In_ ULONG SessionId);
+
+_IRQL_requires_max_(APC_LEVEL)
+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);
+