18 #define ADDR_TO_PDE_OFFSET MiAddressToPdeOffset 19 #define ADDR_TO_PAGE_TABLE(v) (((ULONG)(v)) / (1024 * PAGE_SIZE)) 23 #define PA_BIT_PRESENT (0) 24 #define PA_BIT_READWRITE (1) 25 #define PA_BIT_USER (2) 28 #define PA_BIT_ACCESSED (5) 29 #define PA_BIT_DIRTY (6) 30 #define PA_BIT_GLOBAL (8) 32 #define PA_PRESENT (1 << PA_BIT_PRESENT) 33 #define PA_READWRITE (1 << PA_BIT_READWRITE) 34 #define PA_USER (1 << PA_BIT_USER) 35 #define PA_DIRTY (1 << PA_BIT_DIRTY) 36 #define PA_WT (1 << PA_BIT_WT) 37 #define PA_CD (1 << PA_BIT_CD) 38 #define PA_ACCESSED (1 << PA_BIT_ACCESSED) 39 #define PA_GLOBAL (1 << PA_BIT_GLOBAL) 41 #define IS_HYPERSPACE(v) (((ULONG)(v) >= HYPER_SPACE && (ULONG)(v) <= HYPER_SPACE_END)) 43 #define PTE_TO_PFN(X) ((X) >> PAGE_SHIFT) 44 #define PFN_TO_PTE(X) ((X) << PAGE_SHIFT) 46 #define PAGE_MASK(x) ((x)&(~0xfff)) 56 PTE_READONLY | PTE_ENABLE_CACHE,
57 PTE_EXECUTE | PTE_ENABLE_CACHE,
58 PTE_EXECUTE_READ | PTE_ENABLE_CACHE,
59 PTE_READWRITE | PTE_ENABLE_CACHE,
60 PTE_WRITECOPY | PTE_ENABLE_CACHE,
61 PTE_EXECUTE_READWRITE | PTE_ENABLE_CACHE,
62 PTE_EXECUTE_WRITECOPY | PTE_ENABLE_CACHE,
67 PTE_READONLY | PTE_DISABLE_CACHE,
68 PTE_EXECUTE | PTE_DISABLE_CACHE,
69 PTE_EXECUTE_READ | PTE_DISABLE_CACHE,
70 PTE_READWRITE | PTE_DISABLE_CACHE,
71 PTE_WRITECOPY | PTE_DISABLE_CACHE,
72 PTE_EXECUTE_READWRITE | PTE_DISABLE_CACHE,
73 PTE_EXECUTE_WRITECOPY | PTE_DISABLE_CACHE,
78 PTE_READONLY | PTE_ENABLE_CACHE,
79 PTE_EXECUTE | PTE_ENABLE_CACHE,
80 PTE_EXECUTE_READ | PTE_ENABLE_CACHE,
81 PTE_READWRITE | PTE_ENABLE_CACHE,
82 PTE_WRITECOPY | PTE_ENABLE_CACHE,
83 PTE_EXECUTE_READWRITE | PTE_ENABLE_CACHE,
84 PTE_EXECUTE_WRITECOPY | PTE_ENABLE_CACHE,
89 PTE_READONLY | PTE_WRITECOMBINED_CACHE,
90 PTE_EXECUTE | PTE_WRITECOMBINED_CACHE,
91 PTE_EXECUTE_READ | PTE_WRITECOMBINED_CACHE,
92 PTE_READWRITE | PTE_WRITECOMBINED_CACHE,
93 PTE_WRITECOPY | PTE_WRITECOMBINED_CACHE,
94 PTE_EXECUTE_READWRITE | PTE_WRITECOMBINED_CACHE,
95 PTE_EXECUTE_WRITECOPY | PTE_WRITECOMBINED_CACHE,
167 DPRINT1(
"Unknown main protection type.\n");
229 PointerPde = PdeBase + PdeOffset;
302 if(!MiSynchronizeSystemPde(PointerPde))
369 DPRINT(
"MmDeleteVirtualMapping(%p, %p, %p, %p)\n",
376 if (WasDirty !=
NULL)
420 if (WasDirty !=
NULL)
439 *SwapEntry =
Entry >> 1;
480 DPRINT1(
"Pte %x (want not 1 and 0x800)\n", Pte);
487 *SwapEntry = Pte >> 1;
498 if(!MiSynchronizeSystemPde(PointerPde))
522 DPRINT1(
"MmSetCleanPage is called for user space without a process.\n");
561 DPRINT1(
"MmSetDirtyPage is called for user space without a process.\n");
598 DPRINT1(
"MmClearPageAccessedBit is called for user space without a process.\n");
669 DPRINT1(
"Setting kernel address with process context\n");
673 if (SwapEntry & (1 << 31))
683 if (SwapEntry != MM_WAIT_ENTRY)
722 ULONG oldPdeOffset, PdeOffset;
727 DPRINT(
"MmCreateVirtualMappingUnsafe(%p, %p, %lu, %p (%x), %lu)\n",
736 DPRINT1(
"NULL process given for user-mode mapping at %p -- %lu pages starting at %Ix\n",
Address, PageCount, *Pages);
739 if (PageCount > 0x10000 ||
742 DPRINT1(
"Page count too large for kernel-mode mapping at %p -- %lu pages starting at %Ix\n",
Address, PageCount, *Pages);
750 DPRINT1(
"Process %p given for kernel-mode mapping at %p -- %lu pages starting at %Ix\n",
Process,
Address, PageCount, *Pages);
757 DPRINT1(
"Page count too large for process %p user-mode mapping at %p -- %lu pages starting at %Ix\n",
Process,
Address, PageCount, *Pages);
781 DPRINT1(
"Setting physical address but not allowing access at address " 782 "0x%p with attributes %x/%x.\n",
787 if (oldPdeOffset != PdeOffset)
800 oldPdeOffset = PdeOffset;
839 for (
i = 0;
i < PageCount;
i++)
905 DPRINT(
"MmSetPageProtect(Process %p Address %p flProtect %x)\n",
930 DPRINT1(
"Invalid Pte %lx\n", Pte);
#define PAGE_WRITETHROUGH
VOID NTAPI MmDeletePageFileMapping(PEPROCESS Process, PVOID Address, SWAPENTRY *SwapEntry)
BOOLEAN Mmi386MakeKernelPageTableGlobal(PVOID Address)
BOOLEAN NTAPI MmIsPagePresent(PEPROCESS Process, PVOID Address)
#define PAGE_IS_EXECUTABLE
#define MiAddressToPde(x)
BOOLEAN NTAPI KeAreAllApcsDisabled(VOID)
_In_ HANDLE _Outptr_result_bytebuffer_ ViewSize PVOID _In_ ULONG_PTR _In_ SIZE_T _Inout_opt_ PLARGE_INTEGER _Inout_ PSIZE_T _In_ SECTION_INHERIT _In_ ULONG _In_ ULONG Protect
BOOLEAN NTAPI MmIsDisabledPage(PEPROCESS Process, PVOID Address)
BOOLEAN NTAPI MmIsPageInUse(PFN_NUMBER Page)
#define BooleanFlagOn(F, SF)
static ULONG ProtectToPTE(ULONG flProtect)
_In_ CLIPOBJ _In_ BRUSHOBJ _In_ LONG x1
VOID NTAPI MmDeleteVirtualMapping(PEPROCESS Process, PVOID Address, BOOLEAN *WasDirty, PPFN_NUMBER Page)
#define InterlockedExchangePte(pte1, pte2)
VOID NTAPI MmSetDirtyPage(PEPROCESS Process, PVOID Address)
BOOLEAN NTAPI MmIsDirtyPage(PEPROCESS Process, PVOID Address)
VOID NTAPI MmInitGlobalKernelPageDirectory(VOID)
VOID NTAPI MmSetCleanPage(PEPROCESS Process, PVOID Address)
#define MiGetPdeOffset(x)
#define MiAddressToPte(x)
#define PAGE_EXECUTE_WRITECOPY
NTSTATUS(* NTAPI)(IN PFILE_FULL_EA_INFORMATION EaBuffer, IN ULONG EaLength, OUT PULONG ErrorOffset)
VOID NTAPI KeStackAttachProcess(IN PKPROCESS Process, OUT PRKAPC_STATE ApcState)
DECLSPEC_NORETURN VOID NTAPI KeBugCheck(ULONG BugCheckCode)
static PULONG MmGetPageTableForProcess(PEPROCESS Process, PVOID Address, BOOLEAN Create, PKIRQL OldIrql)
NTSTATUS NTAPI MmCreatePageFileMapping(PEPROCESS Process, PVOID Address, SWAPENTRY SwapEntry)
BOOLEAN NTAPI MmIsPageSwapEntry(PEPROCESS Process, PVOID Address)
#define PsGetCurrentProcess
PVOID NTAPI MiMapPageInHyperSpace(IN PEPROCESS Process, IN PFN_NUMBER Page, IN PKIRQL OldIrql)
ULONG NTAPI MmGetPageProtect(PEPROCESS Process, PVOID Address)
NTSTATUS NTAPI MmCreateVirtualMappingUnsafe(PEPROCESS Process, PVOID Address, ULONG PageProtection, PPFN_NUMBER Pages, ULONG PageCount)
PFN_NUMBER NTAPI MmGetPfnForProcess(PEPROCESS Process, PVOID Address)
#define InterlockedCompareExchangePte(PointerPte, Exchange, Comperand)
#define DBG_UNREFERENCED_LOCAL_VARIABLE(L)
FORCEINLINE VOID KeInvalidateTlbEntry(IN PVOID Address)
#define NT_SUCCESS(StatCode)
BOOLEAN NTAPI MmIsPageAccessed(PEPROCESS Process, PVOID Address)
const ULONG64 MmProtectToPteMask[32]
NTSTATUS NTAPI MiFillSystemPageDirectory(IN PVOID Base, IN SIZE_T NumberOfBytes)
VOID NTAPI MiUnmapPageInHyperSpace(IN PEPROCESS Process, IN PVOID Address, IN KIRQL OldIrql)
_Requires_lock_held_ Interrupt _Releases_lock_ Interrupt _In_ _IRQL_restores_ KIRQL OldIrql
VOID MiFlushTlb(PMMPTE Pte, PVOID Address, KIRQL OldIrql)
#define ADDR_TO_PDE_OFFSET
const ULONG MmProtectToValue[32]
VOID NTAPI MmSetPageProtect(PEPROCESS Process, PVOID Address, ULONG flProtect)
FORCEINLINE VOID MI_WRITE_INVALID_PTE(IN PMMPTE PointerPte, IN MMPTE InvalidPte)
#define PAGE_WRITECOMBINE
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
VOID NTAPI KeUnstackDetachProcess(IN PRKAPC_STATE ApcState)
_Out_ PKAPC_STATE ApcState
_Must_inspect_result_ typedef _In_ PHYSICAL_ADDRESS _Inout_ PLARGE_INTEGER NumberOfBytes
VOID NTAPI MmGetPageFileMapping(PEPROCESS Process, PVOID Address, SWAPENTRY *SwapEntry)
static BOOLEAN MmUnmapPageTable(PULONG Pt, KIRQL OldIrql)
VOID NTAPI MmClearPageAccessedBit(PEPROCESS Process, PVOID Address)
_Must_inspect_result_ _In_ PLARGE_INTEGER _In_ PLARGE_INTEGER _In_ ULONG _In_ PFILE_OBJECT _In_ PVOID Process
#define PAGE_EXECUTE_READ
#define MiAddressToPteOffset(x)
#define PAGE_EXECUTE_READWRITE
NTSTATUS NTAPI MiDispatchFault(IN ULONG FaultCode, IN PVOID Address, IN PMMPTE PointerPte, IN PMMPTE PointerProtoPte, IN BOOLEAN Recursive, IN PEPROCESS Process, IN PVOID TrapInformation, IN PVOID Vad)
#define MmSystemRangeStart
NTSTATUS NTAPI MmCreateVirtualMapping(PEPROCESS Process, PVOID Address, ULONG Protect, PPFN_NUMBER Pages, ULONG PageCount)
base of all file and directory entries
static ULONG MmGetPageEntryForProcess(PEPROCESS Process, PVOID Address)
VOID NTAPI KeBugCheckEx(_In_ ULONG BugCheckCode, _In_ ULONG_PTR BugCheckParameter1, _In_ ULONG_PTR BugCheckParameter2, _In_ ULONG_PTR BugCheckParameter3, _In_ ULONG_PTR BugCheckParameter4)
_Must_inspect_result_ _In_ WDFDMAENABLER _In_ _In_opt_ PWDF_OBJECT_ATTRIBUTES Attributes