18 #undef InterlockedExchangePte 19 #define InterlockedExchangePte(pte1, pte2) \ 20 InterlockedExchange64((LONG64*)&pte1->u.Long, pte2.u.Long) 22 #define PAGE_EXECUTE_ANY (PAGE_EXECUTE|PAGE_EXECUTE_READ|PAGE_EXECUTE_READWRITE|PAGE_EXECUTE_WRITECOPY) 23 #define PAGE_WRITE_ANY (PAGE_EXECUTE_READWRITE|PAGE_READWRITE|PAGE_EXECUTE_WRITECOPY|PAGE_WRITECOPY) 24 #define PAGE_WRITECOPY_ANY (PAGE_EXECUTE_WRITECOPY|PAGE_WRITECOPY) 38 PTE_READONLY | PTE_ENABLE_CACHE,
39 PTE_EXECUTE | PTE_ENABLE_CACHE,
40 PTE_EXECUTE_READ | PTE_ENABLE_CACHE,
41 PTE_READWRITE | PTE_ENABLE_CACHE,
42 PTE_WRITECOPY | PTE_ENABLE_CACHE,
43 PTE_EXECUTE_READWRITE | PTE_ENABLE_CACHE,
44 PTE_EXECUTE_WRITECOPY | PTE_ENABLE_CACHE,
49 PTE_READONLY | PTE_DISABLE_CACHE,
50 PTE_EXECUTE | PTE_DISABLE_CACHE,
51 PTE_EXECUTE_READ | PTE_DISABLE_CACHE,
52 PTE_READWRITE | PTE_DISABLE_CACHE,
53 PTE_WRITECOPY | PTE_DISABLE_CACHE,
54 PTE_EXECUTE_READWRITE | PTE_DISABLE_CACHE,
55 PTE_EXECUTE_WRITECOPY | PTE_DISABLE_CACHE,
60 PTE_READONLY | PTE_ENABLE_CACHE,
61 PTE_EXECUTE | PTE_ENABLE_CACHE,
62 PTE_EXECUTE_READ | PTE_ENABLE_CACHE,
63 PTE_READWRITE | PTE_ENABLE_CACHE,
64 PTE_WRITECOPY | PTE_ENABLE_CACHE,
65 PTE_EXECUTE_READWRITE | PTE_ENABLE_CACHE,
66 PTE_EXECUTE_WRITECOPY | PTE_ENABLE_CACHE,
71 PTE_READONLY | PTE_WRITECOMBINED_CACHE,
72 PTE_EXECUTE | PTE_WRITECOMBINED_CACHE,
73 PTE_EXECUTE_READ | PTE_WRITECOMBINED_CACHE,
74 PTE_READWRITE | PTE_WRITECOMBINED_CACHE,
75 PTE_WRITECOPY | PTE_WRITECOMBINED_CACHE,
76 PTE_EXECUTE_READWRITE | PTE_WRITECOMBINED_CACHE,
77 PTE_EXECUTE_WRITECOPY | PTE_WRITECOMBINED_CACHE,
170 if (Pxe->
u.
Long == 0)
177 if (Ppe->
u.
Long == 0)
184 if (Pde->
u.
Long == 0)
218 PteValue = Pte ? Pte->
u.
Long : 0;
332 *SwapEntry = PointerPte->
u.
Long >> 1;
387 if (InterlockedBitTestAndReset64((
PVOID)Pte, 6))
409 if (InterlockedBitTestAndSet64((
PVOID)Pte, 6))
476 DPRINT1(
"Pte %x (want not 1 and 0x800)\n", Pte);
480 *SwapEntry = Pte->
u.
Long >> 1;
500 DPRINT1(
"Setting kernel address with process context\n");
504 if (SwapEntry & (1ull << 63))
517 PteValue.
u.
Long = SwapEntry << 1;
529 ULONG PageProtection,
554 for (
i = 0;
i < PageCount;
i++)
560 DPRINT(
"MmCreateVirtualMappingUnsafe, Address=%p, TmplPte=%p, Pte=%p\n",
590 for (
i = 0;
i < PageCount;
i++)
594 DPRINT1(
"Page %x not in use\n", Pages[
i]);
609 PFN_NUMBER TableBasePfn, HyperPfn, HyperPdPfn, HyperPtPfn, WorkingSetPfn;
649 Process->WorkingSetPage = WorkingSetPfn;
650 DirectoryTableBase[0] = TableBasePfn <<
PAGE_SHIFT;
651 DirectoryTableBase[1] = HyperPfn <<
PAGE_SHIFT;
684 PageTablePointer[TableIndex] =
TempPte;
689 PageTablePointer[TableIndex] =
TempPte;
717 PageTablePointer[TableIndex] =
TempPte;
726 Process->AddressSpaceInitialized = 1;
#define PAGE_WRITETHROUGH
VOID NTAPI MmDeletePageFileMapping(PEPROCESS Process, PVOID Address, SWAPENTRY *SwapEntry)
NTSYSAPI ULONG NTAPI RtlRandom(_Inout_ PULONG Seed)
FORCEINLINE VOID MI_ERASE_PTE(IN PMMPTE PointerPte)
#define InterlockedExchange64
#define PAGE_WRITECOPY_ANY
BOOLEAN NTAPI MmIsPagePresent(PEPROCESS Process, PVOID Address)
#define MiAddressToPde(x)
_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)
PMMPTE NTAPI MiReserveSystemPtes(IN ULONG NumberOfPtes, IN MMSYSTEM_PTE_POOL_TYPE SystemPtePoolType)
static VOID MiSetPteProtection(PMMPTE Pte, ULONG Protection)
VOID NTAPI MmDeleteVirtualMapping(PEPROCESS Process, PVOID Address, BOOLEAN *WasDirty, PPFN_NUMBER Page)
FORCEINLINE PMMPTE MiAddressToPpe(PVOID Address)
#define PAGE_ROUND_DOWN(x)
#define InterlockedExchangePte(pte1, pte2)
FORCEINLINE KIRQL MiAcquirePfnLock(VOID)
VOID NTAPI MmSetDirtyPage(PEPROCESS Process, PVOID Address)
BOOLEAN NTAPI MmIsDirtyPage(PEPROCESS Process, PVOID Address)
VOID NTAPI MiZeroPhysicalPage(IN PFN_NUMBER PageFrameIndex)
VOID NTAPI MmSetCleanPage(PEPROCESS Process, PVOID Address)
FORCEINLINE VOID MiReleasePfnLock(_In_ KIRQL OldIrql)
#define MiAddressToPte(x)
#define PAGE_EXECUTE_WRITECOPY
NTSTATUS(* NTAPI)(IN PFILE_FULL_EA_INFORMATION EaBuffer, IN ULONG EaLength, OUT PULONG ErrorOffset)
FORCEINLINE VOID MI_WRITE_INVALID_PDE(IN PMMPDE PointerPde, IN MMPDE InvalidPde)
DECLSPEC_NORETURN VOID NTAPI KeBugCheck(ULONG BugCheckCode)
NTSTATUS NTAPI MmCreatePageFileMapping(PEPROCESS Process, PVOID Address, SWAPENTRY SwapEntry)
BOOLEAN NTAPI MmIsPageSwapEntry(PEPROCESS Process, PVOID Address)
#define PsGetCurrentProcess
FORCEINLINE VOID KeInitializeSpinLock(_Out_ PKSPIN_LOCK SpinLock)
ULONG NTAPI MmGetPageProtect(PEPROCESS Process, PVOID Address)
NTSTATUS NTAPI MmCreateVirtualMappingUnsafe(PEPROCESS Process, PVOID Address, ULONG PageProtection, PPFN_NUMBER Pages, ULONG PageCount)
VOID NTAPI MiReleaseSystemPtes(IN PMMPTE StartingPte, IN ULONG NumberOfPtes, IN MMSYSTEM_PTE_POOL_TYPE SystemPtePoolType)
PFN_NUMBER NTAPI MmGetPfnForProcess(PEPROCESS Process, PVOID Address)
FORCEINLINE PMMPTE MiAddressToPxe(PVOID Address)
FORCEINLINE VOID KeInvalidateTlbEntry(IN PVOID Address)
const ULONG64 MmProtectToPteMask[32]
#define MI_GET_NEXT_PROCESS_COLOR(x)
VOID MiFlushTlb(PMMPTE Pte, PVOID Address)
HARDWARE_PTE_ARMV6 TempPte
ULONG NTAPI MiGetPteProtection(MMPTE Pte)
#define MmDeleteHyperspaceMapping(x)
#define STATUS_UNSUCCESSFUL
_Requires_lock_held_ Interrupt _Releases_lock_ Interrupt _In_ _IRQL_restores_ KIRQL OldIrql
FORCEINLINE ULONG MiAddressToPxi(PVOID Address)
const ULONG MmProtectToValue[32]
VOID NTAPI MmSetPageProtect(PEPROCESS Process, PVOID Address, ULONG flProtect)
BOOLEAN FORCEINLINE MiIsHyperspaceAddress(PVOID Address)
PFN_NUMBER NTAPI MiRemoveAnyPage(IN ULONG Color)
FORCEINLINE VOID MI_WRITE_INVALID_PTE(IN PMMPTE PointerPte, IN MMPTE InvalidPte)
#define PAGE_WRITECOMBINE
static PMMPTE MiGetPteForProcess(PEPROCESS Process, PVOID Address, BOOLEAN Create)
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
BOOLEAN NTAPI MmCreateProcessAddressSpace(IN ULONG MinWs, IN PEPROCESS Process, OUT PULONG_PTR DirectoryTableBase)
VOID NTAPI MmGetPageFileMapping(PEPROCESS Process, PVOID Address, SWAPENTRY *SwapEntry)
PVOID MmHighestUserAddress
_Must_inspect_result_ _In_ PLARGE_INTEGER _In_ PLARGE_INTEGER _In_ ULONG _In_ PFILE_OBJECT _In_ PVOID Process
__INTRIN_INLINE void __invlpg(void *Address)
VOID NTAPI MiSessionAddProcess(IN PEPROCESS NewProcess)
#define RtlZeroMemory(Destination, Length)
#define RtlCopyMemory(Destination, Source, Length)
#define PAGE_EXECUTE_READ
#define PAGE_EXECUTE_READWRITE
static ULONG64 MiGetPteValueForProcess(PEPROCESS Process, PVOID Address)
FORCEINLINE PVOID MiPteToAddress(PMMPTE PointerPte)
FORCEINLINE ULONG MiAddressToPti(PVOID Address)
#define MmSystemRangeStart
NTSTATUS NTAPI MmCreateVirtualMapping(PEPROCESS Process, PVOID Address, ULONG Protect, PPFN_NUMBER Pages, ULONG PageCount)
VOID NTAPI KeBugCheckEx(_In_ ULONG BugCheckCode, _In_ ULONG_PTR BugCheckParameter1, _In_ ULONG_PTR BugCheckParameter2, _In_ ULONG_PTR BugCheckParameter3, _In_ ULONG_PTR BugCheckParameter4)