15 #define MODULE_INVOLVED_IN_ARM3 59 DPRINT(
"MiMapLockedPagesInUserSpace(%p, %p, 0x%x, %p)\n",
74 DPRINT1(
"FIXME: Need to check for large pages\n");
97 AddressSpaceLocked =
TRUE;
114 EndingVa = StartingVa + NumberOfPages *
PAGE_SIZE - 1;
121 EndingVa = StartingVa + NumberOfPages *
PAGE_SIZE - 1;
125 EndingVa <= StartingVa ||
133 AddressSpaceLocked =
TRUE;
174 while (NumberOfPages != 0 &&
190 EffectiveCacheAttribute = CacheAttribute;
226 DPRINT1(
"FIXME: MiNotMapped is not supported\n");
233 switch (EffectiveCacheAttribute)
268 ASSERT(AddressSpaceLocked);
275 if (AddressSpaceLocked)
307 ASSERT(NumberOfPages != 0);
333 while (NumberOfPages != 0 &&
454 EndPage = MdlPages + PageCount;
614 Pfn1->
u3.
e1.StartOfAllocation = 0;
615 Pfn1->
u3.
e1.EndOfAllocation = 0;
623 if (Pfn1->
u3.
e2.ReferenceCount != 1)
638 }
while (--NumberOfPages != 0);
691 LastPage = MdlPages + PageCount;
721 if (!BugCheckOnFailure)
return NULL;
738 switch (CacheAttribute)
780 }
while (++MdlPages < LastPage);
887 ExtraPageCount = (
PFN_COUNT)*(MdlPages + PageCount);
892 PageCount += ExtraPageCount;
893 PointerPte -= ExtraPageCount;
933 ULONG LockPages, TotalPages;
937 PMMPTE PointerPte, LastPte;
939 #if (_MI_PAGING_LEVELS >= 3) 942 #if (_MI_PAGING_LEVELS == 4) 1007 TotalPages = LockPages;
1056 }
while (
Address < LastAddress);
1081 DPRINT1(
"MDL PROBE FAILED!\n");
1091 #if (_MI_PAGING_LEVELS >= 3) 1094 #if (_MI_PAGING_LEVELS == 4) 1225 DPRINT1(
"Access fault failed\n");
1294 DPRINT1(
"Access fault failed\n");
1325 goto CleanupWithLock;
1356 *MdlPages++ = PageFrameIndex;
1361 #if (_MI_PAGING_LEVELS >= 3) 1364 #if (_MI_PAGING_LEVELS == 4) 1368 }
while (PointerPte <= LastPte);
1492 LastPage = MdlPages + PageCount;
1505 }
while (++MdlPages < LastPage);
1549 LastPage = MdlPages + PageCount;
1572 LastPage = MdlPages;
1579 }
while (++MdlPages < LastPage);
1593 Pfn1 = (
PMMPFN)*MdlPages;
1595 }
while (++MdlPages < LastPage);
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 * u
#define KeGetCurrentIrql()
union _MMVAD_LONG::@2566 u
FORCEINLINE VOID MI_ERASE_PTE(IN PMMPTE PointerPte)
#define MM_HIGHEST_USER_ADDRESS
#define MDL_WRITE_OPERATION
#define MM_VIRTMEM_GRANULARITY
#define _MI_PAGING_LEVELS
static VOID NTAPI MiUnmapLockedPagesInUserSpace(_In_ PVOID BaseAddress, _In_ PMDL Mdl)
#define STATUS_INSUFFICIENT_RESOURCES
_In_ ULONG _In_ ULONG _In_ ULONG Length
FORCEINLINE VOID MiUnlockProcessWorkingSetUnsafe(IN PEPROCESS Process, IN PETHREAD Thread)
NTSTATUS NTAPI PsChargeProcessNonPagedPoolQuota(_In_ PEPROCESS Process, _In_ SIZE_T Amount)
Charges the non paged pool quota of a given process.
#define MI_PAGE_WRITE_COMBINED(x)
#define MmGetMdlPfnArray(_Mdl)
#define MiAddressToPde(x)
#define MmInitializeMdl(_MemoryDescriptorList, _BaseVa, _Length)
FORCEINLINE VOID MiDereferencePfnAndDropLockCount(IN PMMPFN Pfn1)
#define PsGetCurrentThread()
NTSTATUS NTAPI MmAccessFault(IN ULONG FaultCode, IN PVOID Address, IN KPROCESSOR_MODE Mode, IN PVOID TrapInformation)
#define MmGetMdlVirtualAddress(_Mdl)
PMMPTE MmSystemPtesEnd[MaximumPtePoolTypes]
PMMPTE NTAPI MiReserveSystemPtes(IN ULONG NumberOfPtes, IN MMSYSTEM_PTE_POOL_TYPE SystemPtePoolType)
SIZE_T MmSystemLockPagesCount
FORCEINLINE VOID MmUnlockAddressSpace(PMMSUPPORT AddressSpace)
VOID NTAPI MmBuildMdlForNonPagedPool(IN PMDL Mdl)
enum _TABLE_SEARCH_RESULT TABLE_SEARCH_RESULT
FORCEINLINE PMMPTE MiAddressToPpe(PVOID Address)
FORCEINLINE USHORT MiDecrementPageTableReferences(IN PVOID Address)
FORCEINLINE VOID MiLockProcessWorkingSet(IN PEPROCESS Process, IN PETHREAD Thread)
IN PVOID IN PVOID IN USHORT IN USHORT Size
VOID NTAPI MmUnlockPages(IN PMDL Mdl)
VOID NTAPI MmProbeAndLockSelectedPages(IN OUT PMDL MemoryDescriptorList, IN LARGE_INTEGER PageList[], IN KPROCESSOR_MODE AccessMode, IN LOCK_OPERATION Operation)
#define MI_IS_PAGE_COPY_ON_WRITE(x)
VOID NTAPI MmMapMemoryDumpMdl(IN PMDL Mdl)
ACPI_PHYSICAL_ADDRESS ACPI_SIZE BOOLEAN Warn BOOLEAN Physical UINT32 ACPI_TABLE_HEADER *OutTableHeader ACPI_TABLE_HEADER **OutTable ACPI_HANDLE UINT32 ACPI_WALK_CALLBACK ACPI_WALK_CALLBACK void void **ReturnValue UINT32 ACPI_BUFFER *RetPathPtr ACPI_OBJECT_HANDLER void *Data ACPI_OBJECT_HANDLER void **Data ACPI_STRING ACPI_OBJECT_LIST ACPI_BUFFER *ReturnObjectBuffer ACPI_DEVICE_INFO **ReturnBuffer ACPI_HANDLE Parent
FORCEINLINE PMMPDE MiPteToPde(PMMPTE PointerPte)
#define MDL_MAPPED_TO_SYSTEM_VA
PVOID NTAPI MmMapLockedPages(IN PMDL Mdl, IN KPROCESSOR_MODE AccessMode)
int WINAPI EndPage(_In_ HDC)
PMDL NTAPI MmAllocatePagesForMdlEx(IN PHYSICAL_ADDRESS LowAddress, IN PHYSICAL_ADDRESS HighAddress, IN PHYSICAL_ADDRESS SkipBytes, IN SIZE_T TotalBytes, IN MEMORY_CACHING_TYPE CacheType, IN ULONG Flags)
struct _MMPFN::@1751::@1757 e2
enum _MI_PFN_CACHE_ATTRIBUTE MI_PFN_CACHE_ATTRIBUTE
return STATUS_NOT_IMPLEMENTED
PVOID NTAPI MmMapLockedPagesSpecifyCache(IN PMDL Mdl, IN KPROCESSOR_MODE AccessMode, IN MEMORY_CACHING_TYPE CacheType, IN PVOID BaseAddress, IN ULONG BugCheckOnFailure, IN ULONG Priority)
#define MiAddressToPte(x)
NTSTATUS(* NTAPI)(IN PFILE_FULL_EA_INFORMATION EaBuffer, IN ULONG EaLength, OUT PULONG ErrorOffset)
FORCEINLINE VOID MI_WRITE_VALID_PTE(IN PMMPTE PointerPte, IN MMPTE TempPte)
_Inout_ PMDL MemoryDescriptorList
VOID NTAPI MmUnmapLockedPages(IN PVOID BaseAddress, IN PMDL Mdl)
MI_PFN_CACHE_ATTRIBUTE MiPlatformCacheAttributes[2][MmMaximumCacheType]
VOID NTAPI MmFreePagesFromMdl(IN PMDL Mdl)
_In_ PEPROCESS _In_ KPROCESSOR_MODE AccessMode
#define PsGetCurrentProcess
TABLE_SEARCH_RESULT NTAPI MiFindEmptyAddressRangeInTree(IN SIZE_T Length, IN ULONG_PTR Alignment, IN PMM_AVL_TABLE Table, OUT PMMADDRESS_NODE *PreviousVad, OUT PULONG_PTR Base)
#define MDL_MAPPING_CAN_FAIL
VOID NTAPI MiMakePdeExistAndMakeValid(IN PMMPDE PointerPde, IN PEPROCESS TargetProcess, IN KIRQL OldIrql)
_Must_inspect_result_ _In_ PHYSICAL_ADDRESS _In_ PHYSICAL_ADDRESS _In_opt_ PHYSICAL_ADDRESS _In_ MEMORY_CACHING_TYPE CacheType
PMMVAD NTAPI MiLocateAddress(IN PVOID VirtualAddress)
#define MDL_FREE_EXTRA_PTES
#define MDL_PARENT_MAPPED_SYSTEM_VA
_At_(*)(_In_ PWSK_CLIENT Client, _In_opt_ PUNICODE_STRING NodeName, _In_opt_ PUNICODE_STRING ServiceName, _In_opt_ ULONG NameSpace, _In_opt_ GUID *Provider, _In_opt_ PADDRINFOEXW Hints, _Outptr_ PADDRINFOEXW *Result, _In_opt_ PEPROCESS OwningProcess, _In_opt_ PETHREAD OwningThread, _Inout_ PIRP Irp Result)(Mem)) NTSTATUS(WSKAPI *PFN_WSK_GET_ADDRESS_INFO
#define MDL_SOURCE_IS_NONPAGED_POOL
VOID NTAPI MiDecrementShareCount(IN PMMPFN Pfn1, IN PFN_NUMBER PageFrameIndex)
VOID NTAPI MiReleaseSystemPtes(IN PMMPTE StartingPte, IN ULONG NumberOfPtes, IN MMSYSTEM_PTE_POOL_TYPE SystemPtePoolType)
TABLE_SEARCH_RESULT NTAPI MiCheckForConflictingNode(IN ULONG_PTR StartVpn, IN ULONG_PTR EndVpn, IN PMM_AVL_TABLE Table, OUT PMMADDRESS_NODE *NodeOrParent)
_Must_inspect_result_ _In_ PHYSICAL_ADDRESS _In_ PHYSICAL_ADDRESS SkipBytes
VOID NTAPI KeFlushEntireTb(IN BOOLEAN Invalid, IN BOOLEAN AllProcessors)
#define ADDRESS_AND_SIZE_TO_SPAN_PAGES(_Va, _Size)
PMMPTE MmSystemPtesStart[MaximumPtePoolTypes]
BOOLEAN NTAPI KeInvalidateAllCaches(VOID)
FORCEINLINE PMMPTE MiAddressToPxe(PVOID Address)
FORCEINLINE VOID MiLockProcessWorkingSetUnsafe(IN PEPROCESS Process, IN PETHREAD Thread)
_In_ HANDLE _Outptr_result_bytebuffer_ ViewSize PVOID * BaseAddress
_Must_inspect_result_ _In_ ULONG Flags
static PVOID NTAPI MiMapLockedPagesInUserSpace(_In_ PMDL Mdl, _In_ PVOID StartVa, _In_ MEMORY_CACHING_TYPE CacheType, _In_opt_ PVOID BaseAddress)
#define MDL_DESCRIBES_AWE
ULONG MiCacheOverride[MiNotMapped+1]
#define NT_SUCCESS(StatCode)
#define EXCEPTION_EXECUTE_HANDLER
#define MI_IS_PFN_DELETED(x)
#define STATUS_PROCESS_IS_TERMINATING
#define MM_USER_PROBE_ADDRESS
#define MiIsPteOnPpeBoundary(PointerPte)
_In_opt_ PFILE_OBJECT _In_opt_ PETHREAD Thread
HARDWARE_PTE_ARMV6 TempPte
#define MI_PAGE_WRITE_THROUGH(x)
_Must_inspect_result_ _In_opt_ PWDF_OBJECT_ATTRIBUTES _In_ _Strict_type_match_ POOL_TYPE _In_opt_ ULONG PoolTag
#define ExAllocatePoolWithTag(hernya, size, tag)
#define MM_ALLOCATE_FROM_LOCAL_NODE_ONLY
_In_ WDFINTERRUPT _In_ WDF_INTERRUPT_POLICY _In_ WDF_INTERRUPT_PRIORITY Priority
VOID NTAPI MiDecrementReferenceCount(IN PMMPFN Pfn1, IN PFN_NUMBER PageFrameIndex)
FORCEINLINE USHORT MiIncrementPageTableReferences(IN PVOID Address)
#define InterlockedExchangeAddSizeT(a, b)
FORCEINLINE PMMPFN MI_PFN_ELEMENT(IN PFN_NUMBER Pfn)
_Requires_lock_held_ Interrupt _Releases_lock_ Interrupt _In_ _IRQL_restores_ KIRQL OldIrql
#define MI_IS_PAGE_WRITEABLE(x)
SIZE_T NTAPI MmSizeOfMdl(IN PVOID Base, IN SIZE_T Length)
FORCEINLINE VOID MiDeletePde(_In_ PMMPDE PointerPde, _In_ PEPROCESS CurrentProcess)
static const WCHAR Cleanup[]
LIST_HEAD(acpi_bus_event_list)
FORCEINLINE PMMPFN MiGetPfnEntry(IN PFN_NUMBER Pfn)
VOID NTAPI MiRemoveNode(IN PMMADDRESS_NODE Node, IN PMM_AVL_TABLE Table)
#define InterlockedDecrement16
#define MDL_PARTIAL_HAS_BEEN_MAPPED
FORCEINLINE VOID MI_MAKE_HARDWARE_PTE_USER(IN PMMPTE NewPte, IN PMMPTE MappingPte, IN ULONG_PTR ProtectionMask, IN PFN_NUMBER PageFrameNumber)
NTSTATUS NTAPI MmProtectMdlSystemAddress(IN PMDL MemoryDescriptorList, IN ULONG NewProtect)
#define MiIsPteOnPdeBoundary(PointerPte)
VOID NTAPI MmProbeAndLockPages(IN PMDL Mdl, IN KPROCESSOR_MODE AccessMode, IN LOCK_OPERATION Operation)
enum _LOCK_OPERATION LOCK_OPERATION
_Must_inspect_result_ _In_ PHYSICAL_ADDRESS HighAddress
#define STATUS_ACCESS_VIOLATION
#define STATUS_INVALID_ADDRESS
PMDL NTAPI MmCreateMdl(IN PMDL Mdl, IN PVOID Base, IN SIZE_T Length)
PVOID NTAPI MmMapLockedPagesWithReservedMapping(IN PVOID MappingAddress, IN ULONG PoolTag, IN PMDL MemoryDescriptorList, IN MEMORY_CACHING_TYPE CacheType)
_Must_inspect_result_ _In_ ULONG NewProtect
#define MmGetMdlByteCount(_Mdl)
NTSTATUS NTAPI MmAdvanceMdl(IN PMDL Mdl, IN ULONG NumberOfBytes)
_Must_inspect_result_ typedef _In_ PHYSICAL_ADDRESS _Inout_ PLARGE_INTEGER NumberOfBytes
#define MI_PAGE_DISABLE_CACHE(x)
_In_ WDFDEVICE _In_ PVOID _In_opt_ PMDL Mdl
#define MM_DONT_ZERO_ALLOCATION
#define MM_HIGHEST_VAD_ADDRESS
FORCEINLINE VOID KeFlushProcessTb(VOID)
_Must_inspect_result_ _In_ PLARGE_INTEGER _In_ PLARGE_INTEGER _In_ ULONG _In_ PFILE_OBJECT _In_ PVOID Process
void * _ReturnAddress(void)
BOOLEAN MmTrackLockedPages
#define RtlZeroMemory(Destination, Length)
_In_ FLT_SET_CONTEXT_OPERATION Operation
#define MmGetMdlByteOffset(_Mdl)
#define _SEH2_EXCEPT(...)
VOID NTAPI MiInsertVad(_Inout_ PMMVAD Vad, _Inout_ PMM_AVL_TABLE VadRoot)
FORCEINLINE VOID MiReferenceProbedPageAndBumpLockCount(IN PMMPFN Pfn1)
#define _SEH2_GetExceptionCode()
VOID NTAPI MmUnmapReservedMapping(IN PVOID BaseAddress, IN ULONG PoolTag, IN PMDL MemoryDescriptorList)
FORCEINLINE PVOID MiPteToAddress(PMMPTE PointerPte)
enum _MEMORY_CACHING_TYPE MEMORY_CACHING_TYPE
#define STATUS_CONFLICTING_ADDRESSES
VOID NTAPI PsReturnProcessNonPagedPoolQuota(_In_ PEPROCESS Process, _In_ SIZE_T Amount)
Returns the non paged quota pool that the process was taking up.
FORCEINLINE BOOLEAN MI_IS_PHYSICAL_ADDRESS(IN PVOID Address)
#define ExFreePoolWithTag(_P, _T)
#define ProbeForWriteChar(Ptr)
PMDL NTAPI MmAllocatePagesForMdl(IN PHYSICAL_ADDRESS LowAddress, IN PHYSICAL_ADDRESS HighAddress, IN PHYSICAL_ADDRESS SkipBytes, IN SIZE_T TotalBytes)
FORCEINLINE VOID MmLockAddressSpace(PMMSUPPORT AddressSpace)
PMDL NTAPI MiAllocatePagesForMdl(IN PHYSICAL_ADDRESS LowAddress, IN PHYSICAL_ADDRESS HighAddress, IN PHYSICAL_ADDRESS SkipBytes, IN SIZE_T TotalBytes, IN MI_PFN_CACHE_ATTRIBUTE CacheAttribute, IN ULONG Flags)
VOID NTAPI KeBugCheckEx(_In_ ULONG BugCheckCode, _In_ ULONG_PTR BugCheckParameter1, _In_ ULONG_PTR BugCheckParameter2, _In_ ULONG_PTR BugCheckParameter3, _In_ ULONG_PTR BugCheckParameter4)
NTSTATUS NTAPI MmPrefetchPages(IN ULONG NumberOfLists, IN PREAD_LIST *ReadLists)
VOID NTAPI MmProbeAndLockProcessPages(IN OUT PMDL MemoryDescriptorList, IN PEPROCESS Process, IN KPROCESSOR_MODE AccessMode, IN LOCK_OPERATION Operation)
#define MiIsPteOnPxeBoundary(PointerPte)
_Must_inspect_result_ _In_ PHYSICAL_ADDRESS _In_ PHYSICAL_ADDRESS _In_ SIZE_T TotalBytes
FORCEINLINE VOID MiUnlockProcessWorkingSet(IN PEPROCESS Process, IN PETHREAD Thread)
union _MMVAD_LONG::@2567 u2