mirror of
https://github.com/reactos/reactos.git
synced 2024-12-31 19:42:51 +00:00
83d74e7433
Implement MmAllocateMappingAddress and MmFreeMappingAddress routines. Based on mm-implement-mappingaddress.patch by Thomas Faber with some changes from me. Required by Microsoft NTFS driver (from Windows Server 2003 SP2 only, the one from Windows XP SP3 does not need them) and by NDIS & TDI drivers (both from Windows XP SP3 and Windows Server 2003 SP2). Also they are called when using Dr. Web Security Space 8 filter drivers together with MS FltMgr & TDI. Fortunately, this part (these two routines) are enough to get the drivers working in both cases, and others (partially incomplete) routines are not badly required, so they can be finished and committed later. CORE-10147, CORE-14635, CORE-17409, CORE-19318
814 lines
18 KiB
C
814 lines
18 KiB
C
/******************************************************************************
|
|
* Memory manager Functions *
|
|
******************************************************************************/
|
|
$if (_WDMDDK_)
|
|
/* Alignment Macros */
|
|
#define ALIGN_DOWN_BY(size, align) \
|
|
((ULONG_PTR)(size) & ~((ULONG_PTR)(align) - 1))
|
|
|
|
#define ALIGN_UP_BY(size, align) \
|
|
(ALIGN_DOWN_BY(((ULONG_PTR)(size) + align - 1), align))
|
|
|
|
#define ALIGN_DOWN_POINTER_BY(ptr, align) \
|
|
((PVOID)ALIGN_DOWN_BY(ptr, align))
|
|
|
|
#define ALIGN_UP_POINTER_BY(ptr, align) \
|
|
((PVOID)ALIGN_UP_BY(ptr, align))
|
|
|
|
#define ALIGN_DOWN(size, type) \
|
|
ALIGN_DOWN_BY(size, sizeof(type))
|
|
|
|
#define ALIGN_UP(size, type) \
|
|
ALIGN_UP_BY(size, sizeof(type))
|
|
|
|
#define ALIGN_DOWN_POINTER(ptr, type) \
|
|
ALIGN_DOWN_POINTER_BY(ptr, sizeof(type))
|
|
|
|
#define ALIGN_UP_POINTER(ptr, type) \
|
|
ALIGN_UP_POINTER_BY(ptr, sizeof(type))
|
|
|
|
#ifndef FIELD_OFFSET
|
|
#define FIELD_OFFSET(type, field) ((ULONG)&(((type *)0)->field))
|
|
#endif
|
|
|
|
#ifndef FIELD_SIZE
|
|
#define FIELD_SIZE(type, field) (sizeof(((type *)0)->field))
|
|
#endif
|
|
|
|
#define POOL_TAGGING 1
|
|
|
|
#if DBG
|
|
#define IF_DEBUG if (TRUE)
|
|
#else
|
|
#define IF_DEBUG if (FALSE)
|
|
#endif /* DBG */
|
|
|
|
/* ULONG
|
|
* BYTE_OFFSET(
|
|
* _In_ PVOID Va)
|
|
*/
|
|
#define BYTE_OFFSET(Va) \
|
|
((ULONG) ((ULONG_PTR) (Va) & (PAGE_SIZE - 1)))
|
|
|
|
/* ULONG
|
|
* BYTES_TO_PAGES(
|
|
* _In_ ULONG Size)
|
|
*
|
|
* Note: This needs to be like this to avoid overflows!
|
|
*/
|
|
#define BYTES_TO_PAGES(Size) \
|
|
(((Size) >> PAGE_SHIFT) + (((Size) & (PAGE_SIZE - 1)) != 0))
|
|
|
|
/* PVOID
|
|
* PAGE_ALIGN(
|
|
* _In_ PVOID Va)
|
|
*/
|
|
#define PAGE_ALIGN(Va) \
|
|
((PVOID) ((ULONG_PTR)(Va) & ~(PAGE_SIZE - 1)))
|
|
|
|
/* ULONG_PTR
|
|
* ROUND_TO_PAGES(
|
|
* _In_ ULONG_PTR Size)
|
|
*/
|
|
#define ROUND_TO_PAGES(Size) \
|
|
(((ULONG_PTR) (Size) + PAGE_SIZE - 1) & ~(PAGE_SIZE - 1))
|
|
|
|
/* ULONG
|
|
* ADDRESS_AND_SIZE_TO_SPAN_PAGES(
|
|
* _In_ PVOID Va,
|
|
* _In_ ULONG Size)
|
|
*/
|
|
#define ADDRESS_AND_SIZE_TO_SPAN_PAGES(_Va, _Size) \
|
|
((ULONG) ((((ULONG_PTR) (_Va) & (PAGE_SIZE - 1)) \
|
|
+ (_Size) + (PAGE_SIZE - 1)) >> PAGE_SHIFT))
|
|
|
|
#define COMPUTE_PAGES_SPANNED(Va, Size) \
|
|
ADDRESS_AND_SIZE_TO_SPAN_PAGES(Va,Size)
|
|
|
|
/*
|
|
* ULONG
|
|
* MmGetMdlByteCount(
|
|
* _In_ PMDL Mdl)
|
|
*/
|
|
#define MmGetMdlByteCount(_Mdl) \
|
|
((_Mdl)->ByteCount)
|
|
|
|
/*
|
|
* ULONG
|
|
* MmGetMdlByteOffset(
|
|
* IN PMDL Mdl)
|
|
*/
|
|
#define MmGetMdlByteOffset(_Mdl) \
|
|
((_Mdl)->ByteOffset)
|
|
|
|
#define MmGetMdlBaseVa(Mdl) ((Mdl)->StartVa)
|
|
|
|
/*
|
|
* PPFN_NUMBER
|
|
* MmGetMdlPfnArray(
|
|
* _In_ PMDL Mdl)
|
|
*/
|
|
#define MmGetMdlPfnArray(_Mdl) \
|
|
((PPFN_NUMBER) ((_Mdl) + 1))
|
|
|
|
/*
|
|
* PVOID
|
|
* MmGetMdlVirtualAddress(
|
|
* _In_ PMDL Mdl)
|
|
*/
|
|
#define MmGetMdlVirtualAddress(_Mdl) \
|
|
((PVOID) ((PCHAR) ((_Mdl)->StartVa) + (_Mdl)->ByteOffset))
|
|
|
|
#define MmGetProcedureAddress(Address) (Address)
|
|
#define MmLockPagableCodeSection(Address) MmLockPagableDataSection(Address)
|
|
|
|
/* PVOID MmGetSystemAddressForMdl(
|
|
* _In_ PMDL Mdl);
|
|
*/
|
|
#define MmGetSystemAddressForMdl(Mdl) \
|
|
(((Mdl)->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA | \
|
|
MDL_SOURCE_IS_NONPAGED_POOL)) ? \
|
|
((Mdl)->MappedSystemVa) : \
|
|
(MmMapLockedPages((Mdl), KernelMode)))
|
|
|
|
/* PVOID
|
|
* MmGetSystemAddressForMdlSafe(
|
|
* _In_ PMDL Mdl,
|
|
* _In_ MM_PAGE_PRIORITY Priority)
|
|
*/
|
|
#define MmGetSystemAddressForMdlSafe(_Mdl, _Priority) \
|
|
(((_Mdl)->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA \
|
|
| MDL_SOURCE_IS_NONPAGED_POOL)) ? \
|
|
(_Mdl)->MappedSystemVa : \
|
|
(PVOID) MmMapLockedPagesSpecifyCache((_Mdl), \
|
|
KernelMode, MmCached, NULL, FALSE, (_Priority)))
|
|
|
|
/*
|
|
* VOID
|
|
* MmInitializeMdl(
|
|
* _In_ PMDL MemoryDescriptorList,
|
|
* _In_ PVOID BaseVa,
|
|
* _In_ SIZE_T Length)
|
|
*/
|
|
#define MmInitializeMdl(_MemoryDescriptorList, \
|
|
_BaseVa, \
|
|
_Length) \
|
|
{ \
|
|
(_MemoryDescriptorList)->Next = (PMDL) NULL; \
|
|
(_MemoryDescriptorList)->Size = (CSHORT) (sizeof(MDL) + \
|
|
(sizeof(PFN_NUMBER) * ADDRESS_AND_SIZE_TO_SPAN_PAGES(_BaseVa, _Length))); \
|
|
(_MemoryDescriptorList)->MdlFlags = 0; \
|
|
(_MemoryDescriptorList)->StartVa = (PVOID) PAGE_ALIGN(_BaseVa); \
|
|
(_MemoryDescriptorList)->ByteOffset = BYTE_OFFSET(_BaseVa); \
|
|
(_MemoryDescriptorList)->ByteCount = (ULONG) _Length; \
|
|
}
|
|
|
|
/*
|
|
* VOID
|
|
* MmPrepareMdlForReuse(
|
|
* _In_ PMDL Mdl)
|
|
*/
|
|
#define MmPrepareMdlForReuse(_Mdl) \
|
|
{ \
|
|
if (((_Mdl)->MdlFlags & MDL_PARTIAL_HAS_BEEN_MAPPED) != 0) { \
|
|
ASSERT(((_Mdl)->MdlFlags & MDL_PARTIAL) != 0); \
|
|
MmUnmapLockedPages((_Mdl)->MappedSystemVa, (_Mdl)); \
|
|
} else if (((_Mdl)->MdlFlags & MDL_PARTIAL) == 0) { \
|
|
ASSERT(((_Mdl)->MdlFlags & MDL_MAPPED_TO_SYSTEM_VA) == 0); \
|
|
} \
|
|
}
|
|
$endif (_WDMDDK_)
|
|
$if (_NTIFS_)
|
|
|
|
FORCEINLINE
|
|
ULONG
|
|
HEAP_MAKE_TAG_FLAGS(
|
|
_In_ ULONG TagBase,
|
|
_In_ ULONG Tag)
|
|
{
|
|
//__assume_bound(TagBase); // FIXME
|
|
return ((ULONG)((TagBase) + ((Tag) << HEAP_TAG_SHIFT)));
|
|
}
|
|
$endif (_NTIFS_)
|
|
|
|
#if (NTDDI_VERSION >= NTDDI_WIN2K)
|
|
$if (_WDMDDK_)
|
|
_Must_inspect_result_
|
|
_IRQL_requires_max_(DISPATCH_LEVEL)
|
|
_When_ (return != NULL, _Post_writable_byte_size_ (NumberOfBytes))
|
|
NTKERNELAPI
|
|
PVOID
|
|
NTAPI
|
|
MmAllocateContiguousMemory(
|
|
_In_ SIZE_T NumberOfBytes,
|
|
_In_ PHYSICAL_ADDRESS HighestAcceptableAddress);
|
|
|
|
_Must_inspect_result_
|
|
_IRQL_requires_max_(DISPATCH_LEVEL)
|
|
_When_ (return != NULL, _Post_writable_byte_size_ (NumberOfBytes))
|
|
NTKERNELAPI
|
|
PVOID
|
|
NTAPI
|
|
MmAllocateContiguousMemorySpecifyCache(
|
|
_In_ SIZE_T NumberOfBytes,
|
|
_In_ PHYSICAL_ADDRESS LowestAcceptableAddress,
|
|
_In_ PHYSICAL_ADDRESS HighestAcceptableAddress,
|
|
_In_opt_ PHYSICAL_ADDRESS BoundaryAddressMultiple,
|
|
_In_ MEMORY_CACHING_TYPE CacheType);
|
|
|
|
_Must_inspect_result_
|
|
_IRQL_requires_max_(DISPATCH_LEVEL)
|
|
NTKERNELAPI
|
|
PMDL
|
|
NTAPI
|
|
MmAllocatePagesForMdl(
|
|
_In_ PHYSICAL_ADDRESS LowAddress,
|
|
_In_ PHYSICAL_ADDRESS HighAddress,
|
|
_In_ PHYSICAL_ADDRESS SkipBytes,
|
|
_In_ SIZE_T TotalBytes);
|
|
|
|
_IRQL_requires_max_(DISPATCH_LEVEL)
|
|
NTKERNELAPI
|
|
VOID
|
|
NTAPI
|
|
MmBuildMdlForNonPagedPool(
|
|
_Inout_ PMDL MemoryDescriptorList);
|
|
|
|
//DECLSPEC_DEPRECATED_DDK
|
|
NTKERNELAPI
|
|
PMDL
|
|
NTAPI
|
|
MmCreateMdl(
|
|
_Out_writes_bytes_opt_ (sizeof (MDL) + (sizeof (PFN_NUMBER) * ADDRESS_AND_SIZE_TO_SPAN_PAGES (Base, Length)))
|
|
PMDL MemoryDescriptorList,
|
|
_In_reads_bytes_opt_ (Length) PVOID Base,
|
|
_In_ SIZE_T Length);
|
|
|
|
_IRQL_requires_max_(DISPATCH_LEVEL)
|
|
NTKERNELAPI
|
|
VOID
|
|
NTAPI
|
|
MmFreeContiguousMemory(
|
|
_In_ PVOID BaseAddress);
|
|
|
|
_IRQL_requires_max_ (DISPATCH_LEVEL)
|
|
NTKERNELAPI
|
|
VOID
|
|
NTAPI
|
|
MmFreeContiguousMemorySpecifyCache(
|
|
_In_reads_bytes_ (NumberOfBytes) PVOID BaseAddress,
|
|
_In_ SIZE_T NumberOfBytes,
|
|
_In_ MEMORY_CACHING_TYPE CacheType);
|
|
|
|
_IRQL_requires_max_(DISPATCH_LEVEL)
|
|
NTKERNELAPI
|
|
VOID
|
|
NTAPI
|
|
MmFreePagesFromMdl(
|
|
_Inout_ PMDL MemoryDescriptorList);
|
|
|
|
_IRQL_requires_max_(PASSIVE_LEVEL)
|
|
NTKERNELAPI
|
|
PVOID
|
|
NTAPI
|
|
MmGetSystemRoutineAddress(
|
|
_In_ PUNICODE_STRING SystemRoutineName);
|
|
|
|
NTKERNELAPI
|
|
LOGICAL
|
|
NTAPI
|
|
MmIsDriverVerifying(
|
|
_In_ struct _DRIVER_OBJECT *DriverObject);
|
|
|
|
_Must_inspect_result_
|
|
_IRQL_requires_max_(APC_LEVEL)
|
|
NTKERNELAPI
|
|
PVOID
|
|
NTAPI
|
|
MmLockPagableDataSection(
|
|
_In_ PVOID AddressWithinSection);
|
|
|
|
_Must_inspect_result_
|
|
_IRQL_requires_max_(DISPATCH_LEVEL)
|
|
_Out_writes_bytes_opt_ (NumberOfBytes)
|
|
NTKERNELAPI
|
|
PVOID
|
|
NTAPI
|
|
MmMapIoSpace(
|
|
_In_ PHYSICAL_ADDRESS PhysicalAddress,
|
|
_In_ SIZE_T NumberOfBytes,
|
|
_In_ MEMORY_CACHING_TYPE CacheType);
|
|
|
|
_Must_inspect_result_
|
|
_When_(AccessMode==KernelMode, _IRQL_requires_max_(DISPATCH_LEVEL))
|
|
_When_(AccessMode==UserMode, _Maybe_raises_SEH_exception_ _IRQL_requires_max_(APC_LEVEL))
|
|
NTKERNELAPI
|
|
PVOID
|
|
NTAPI
|
|
MmMapLockedPages(
|
|
_Inout_ PMDL MemoryDescriptorList,
|
|
_In_ __drv_strictType(KPROCESSOR_MODE/enum _MODE,__drv_typeConst)
|
|
KPROCESSOR_MODE AccessMode);
|
|
|
|
_Post_writable_byte_size_(MemoryDescriptorList->ByteCount)
|
|
_When_(AccessMode==KernelMode, _IRQL_requires_max_(DISPATCH_LEVEL))
|
|
_When_(AccessMode==UserMode, _Maybe_raises_SEH_exception_ _IRQL_requires_max_(APC_LEVEL) _Post_notnull_)
|
|
_At_(MemoryDescriptorList->MappedSystemVa, _Post_writable_byte_size_(MemoryDescriptorList->ByteCount))
|
|
_Must_inspect_result_
|
|
_Success_(return != NULL)
|
|
NTKERNELAPI
|
|
PVOID
|
|
NTAPI
|
|
MmMapLockedPagesSpecifyCache(
|
|
_Inout_ PMDL MemoryDescriptorList,
|
|
_In_ __drv_strictType(KPROCESSOR_MODE/enum _MODE,__drv_typeConst) KPROCESSOR_MODE AccessMode,
|
|
_In_ __drv_strictTypeMatch(__drv_typeCond) MEMORY_CACHING_TYPE CacheType,
|
|
_In_opt_ PVOID RequestedAddress,
|
|
_In_ ULONG BugCheckOnFailure,
|
|
_In_ ULONG Priority);
|
|
|
|
_IRQL_requires_max_(APC_LEVEL)
|
|
NTKERNELAPI
|
|
PVOID
|
|
NTAPI
|
|
MmPageEntireDriver(
|
|
_In_ PVOID AddressWithinSection);
|
|
|
|
_IRQL_requires_max_(DISPATCH_LEVEL)
|
|
_At_(MemoryDescriptorList->StartVa + MemoryDescriptorList->ByteOffset,
|
|
_Field_size_bytes_opt_(MemoryDescriptorList->ByteCount))
|
|
NTKERNELAPI
|
|
VOID
|
|
NTAPI
|
|
MmProbeAndLockPages(
|
|
_Inout_ PMDL MemoryDescriptorList,
|
|
_In_ KPROCESSOR_MODE AccessMode,
|
|
_In_ LOCK_OPERATION Operation);
|
|
|
|
NTKERNELAPI
|
|
MM_SYSTEMSIZE
|
|
NTAPI
|
|
MmQuerySystemSize(VOID);
|
|
|
|
_IRQL_requires_max_(APC_LEVEL)
|
|
NTKERNELAPI
|
|
VOID
|
|
NTAPI
|
|
MmResetDriverPaging(
|
|
_In_ PVOID AddressWithinSection);
|
|
|
|
NTKERNELAPI
|
|
SIZE_T
|
|
NTAPI
|
|
MmSizeOfMdl(
|
|
_In_reads_bytes_opt_ (Length) PVOID Base,
|
|
_In_ SIZE_T Length);
|
|
|
|
_IRQL_requires_max_(DISPATCH_LEVEL)
|
|
NTKERNELAPI
|
|
VOID
|
|
NTAPI
|
|
MmUnlockPagableImageSection(
|
|
_In_ PVOID ImageSectionHandle);
|
|
|
|
_IRQL_requires_max_(DISPATCH_LEVEL)
|
|
NTKERNELAPI
|
|
VOID
|
|
NTAPI
|
|
MmUnlockPages(
|
|
_Inout_ PMDL MemoryDescriptorList);
|
|
|
|
_IRQL_requires_max_(DISPATCH_LEVEL)
|
|
NTKERNELAPI
|
|
VOID
|
|
NTAPI
|
|
MmUnmapIoSpace(
|
|
_In_reads_bytes_ (NumberOfBytes) PVOID BaseAddress,
|
|
_In_ SIZE_T NumberOfBytes);
|
|
|
|
_IRQL_requires_max_ (APC_LEVEL)
|
|
NTKERNELAPI
|
|
VOID
|
|
NTAPI
|
|
MmProbeAndLockProcessPages(
|
|
_Inout_ PMDL MemoryDescriptorList,
|
|
_In_ PEPROCESS Process,
|
|
_In_ KPROCESSOR_MODE AccessMode,
|
|
_In_ LOCK_OPERATION Operation);
|
|
|
|
_IRQL_requires_max_(DISPATCH_LEVEL)
|
|
NTKERNELAPI
|
|
VOID
|
|
NTAPI
|
|
MmUnmapLockedPages(
|
|
_In_ PVOID BaseAddress,
|
|
_Inout_ PMDL MemoryDescriptorList);
|
|
|
|
_Must_inspect_result_
|
|
_IRQL_requires_max_(DISPATCH_LEVEL)
|
|
_When_ (return != NULL, _Post_writable_byte_size_ (NumberOfBytes))
|
|
NTKERNELAPI
|
|
PVOID
|
|
NTAPI
|
|
MmAllocateContiguousMemorySpecifyCacheNode(
|
|
_In_ SIZE_T NumberOfBytes,
|
|
_In_ PHYSICAL_ADDRESS LowestAcceptableAddress,
|
|
_In_ PHYSICAL_ADDRESS HighestAcceptableAddress,
|
|
_In_opt_ PHYSICAL_ADDRESS BoundaryAddressMultiple,
|
|
_In_ MEMORY_CACHING_TYPE CacheType,
|
|
_In_ NODE_REQUIREMENT PreferredNode);
|
|
$endif (_WDMDDK_)
|
|
$if (_NTDDK_)
|
|
|
|
_IRQL_requires_max_ (PASSIVE_LEVEL)
|
|
NTKERNELAPI
|
|
PPHYSICAL_MEMORY_RANGE
|
|
NTAPI
|
|
MmGetPhysicalMemoryRanges(VOID);
|
|
|
|
NTKERNELAPI
|
|
PHYSICAL_ADDRESS
|
|
NTAPI
|
|
MmGetPhysicalAddress(
|
|
_In_ PVOID BaseAddress);
|
|
|
|
NTKERNELAPI
|
|
BOOLEAN
|
|
NTAPI
|
|
MmIsNonPagedSystemAddressValid(
|
|
_In_ PVOID VirtualAddress);
|
|
|
|
_Must_inspect_result_
|
|
_IRQL_requires_max_(APC_LEVEL)
|
|
_Out_writes_bytes_opt_(NumberOfBytes)
|
|
NTKERNELAPI
|
|
PVOID
|
|
NTAPI
|
|
MmAllocateNonCachedMemory(
|
|
_In_ SIZE_T NumberOfBytes);
|
|
|
|
_IRQL_requires_max_(APC_LEVEL)
|
|
NTKERNELAPI
|
|
VOID
|
|
NTAPI
|
|
MmFreeNonCachedMemory(
|
|
_In_reads_bytes_(NumberOfBytes) PVOID BaseAddress,
|
|
_In_ SIZE_T NumberOfBytes);
|
|
|
|
NTKERNELAPI
|
|
PVOID
|
|
NTAPI
|
|
MmGetVirtualForPhysical(
|
|
_In_ PHYSICAL_ADDRESS PhysicalAddress);
|
|
|
|
_Must_inspect_result_
|
|
_IRQL_requires_max_(APC_LEVEL)
|
|
NTKERNELAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
MmMapUserAddressesToPage(
|
|
_In_reads_bytes_(NumberOfBytes) PVOID BaseAddress,
|
|
_In_ SIZE_T NumberOfBytes,
|
|
_In_ PVOID PageAddress);
|
|
|
|
_Must_inspect_result_
|
|
_IRQL_requires_max_(APC_LEVEL)
|
|
_Out_writes_bytes_opt_(NumberOfBytes)
|
|
NTKERNELAPI
|
|
PVOID
|
|
NTAPI
|
|
MmMapVideoDisplay(
|
|
_In_ PHYSICAL_ADDRESS PhysicalAddress,
|
|
_In_ SIZE_T NumberOfBytes,
|
|
_In_ MEMORY_CACHING_TYPE CacheType);
|
|
|
|
_Must_inspect_result_
|
|
_IRQL_requires_max_(APC_LEVEL)
|
|
NTKERNELAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
MmMapViewInSessionSpace(
|
|
_In_ PVOID Section,
|
|
_Outptr_result_bytebuffer_(*ViewSize) PVOID *MappedBase,
|
|
_Inout_ PSIZE_T ViewSize);
|
|
|
|
_Must_inspect_result_
|
|
_IRQL_requires_max_(APC_LEVEL)
|
|
NTKERNELAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
MmMapViewInSystemSpace(
|
|
_In_ PVOID Section,
|
|
_Outptr_result_bytebuffer_(*ViewSize) PVOID *MappedBase,
|
|
_Inout_ PSIZE_T ViewSize);
|
|
|
|
_IRQL_requires_max_(DISPATCH_LEVEL)
|
|
NTKERNELAPI
|
|
BOOLEAN
|
|
NTAPI
|
|
MmIsAddressValid(
|
|
_In_ PVOID VirtualAddress);
|
|
|
|
NTKERNELAPI
|
|
BOOLEAN
|
|
NTAPI
|
|
MmIsThisAnNtAsSystem(VOID);
|
|
|
|
_IRQL_requires_max_(APC_LEVEL)
|
|
NTKERNELAPI
|
|
VOID
|
|
NTAPI
|
|
MmLockPagableSectionByHandle(
|
|
_In_ PVOID ImageSectionHandle);
|
|
|
|
_IRQL_requires_max_(APC_LEVEL)
|
|
NTKERNELAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
MmUnmapViewInSessionSpace(
|
|
_In_ PVOID MappedBase);
|
|
|
|
_IRQL_requires_max_(APC_LEVEL)
|
|
NTKERNELAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
MmUnmapViewInSystemSpace(
|
|
_In_ PVOID MappedBase);
|
|
|
|
_IRQL_requires_max_(APC_LEVEL)
|
|
NTKERNELAPI
|
|
VOID
|
|
NTAPI
|
|
MmUnsecureVirtualMemory(
|
|
_In_ HANDLE SecureHandle);
|
|
|
|
_IRQL_requires_max_ (PASSIVE_LEVEL)
|
|
NTKERNELAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
MmRemovePhysicalMemory(
|
|
_In_ PPHYSICAL_ADDRESS StartAddress,
|
|
_Inout_ PLARGE_INTEGER NumberOfBytes);
|
|
|
|
_Must_inspect_result_
|
|
_IRQL_requires_max_(APC_LEVEL)
|
|
NTKERNELAPI
|
|
HANDLE
|
|
NTAPI
|
|
MmSecureVirtualMemory(
|
|
__in_data_source(USER_MODE) _In_reads_bytes_ (Size) PVOID Address,
|
|
_In_ __in_data_source(USER_MODE) SIZE_T Size,
|
|
_In_ ULONG ProbeMode);
|
|
|
|
_IRQL_requires_max_(APC_LEVEL)
|
|
NTKERNELAPI
|
|
VOID
|
|
NTAPI
|
|
MmUnmapVideoDisplay(
|
|
_In_reads_bytes_(NumberOfBytes) PVOID BaseAddress,
|
|
_In_ SIZE_T NumberOfBytes);
|
|
|
|
_IRQL_requires_max_ (PASSIVE_LEVEL)
|
|
NTKERNELAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
MmAddPhysicalMemory(
|
|
_In_ PPHYSICAL_ADDRESS StartAddress,
|
|
_Inout_ PLARGE_INTEGER NumberOfBytes);
|
|
$endif (_NTDDK_)
|
|
$if (_NTIFS_)
|
|
|
|
NTKERNELAPI
|
|
BOOLEAN
|
|
NTAPI
|
|
MmIsRecursiveIoFault(VOID);
|
|
|
|
_IRQL_requires_max_ (APC_LEVEL)
|
|
NTKERNELAPI
|
|
BOOLEAN
|
|
NTAPI
|
|
MmForceSectionClosed(
|
|
_In_ PSECTION_OBJECT_POINTERS SectionObjectPointer,
|
|
_In_ BOOLEAN DelayClose);
|
|
|
|
_IRQL_requires_max_ (APC_LEVEL)
|
|
NTKERNELAPI
|
|
BOOLEAN
|
|
NTAPI
|
|
MmFlushImageSection(
|
|
_In_ PSECTION_OBJECT_POINTERS SectionObjectPointer,
|
|
_In_ MMFLUSH_TYPE FlushType);
|
|
|
|
_IRQL_requires_max_ (APC_LEVEL)
|
|
NTKERNELAPI
|
|
BOOLEAN
|
|
NTAPI
|
|
MmCanFileBeTruncated(
|
|
_In_ PSECTION_OBJECT_POINTERS SectionObjectPointer,
|
|
_In_opt_ PLARGE_INTEGER NewFileSize);
|
|
|
|
_IRQL_requires_max_ (APC_LEVEL)
|
|
NTKERNELAPI
|
|
BOOLEAN
|
|
NTAPI
|
|
MmSetAddressRangeModified(
|
|
_In_reads_bytes_ (Length) PVOID Address,
|
|
_In_ SIZE_T Length);
|
|
$endif (_NTIFS_)
|
|
|
|
#endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
|
|
|
|
$if (_WDMDDK_ || _NTIFS_)
|
|
#if (NTDDI_VERSION >= NTDDI_WINXP)
|
|
$endif (_WDMDDK_ || _NTIFS_)
|
|
|
|
$if (_WDMDDK_)
|
|
_IRQL_requires_max_(DISPATCH_LEVEL)
|
|
NTKERNELAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
MmAdvanceMdl(
|
|
_Inout_ PMDL Mdl,
|
|
_In_ ULONG NumberOfBytes);
|
|
|
|
_Must_inspect_result_
|
|
_IRQL_requires_max_(APC_LEVEL)
|
|
_Ret_maybenull_
|
|
NTKERNELAPI
|
|
PVOID
|
|
NTAPI
|
|
MmAllocateMappingAddress(
|
|
_In_ SIZE_T NumberOfBytes,
|
|
_In_ ULONG PoolTag);
|
|
|
|
_IRQL_requires_max_(APC_LEVEL)
|
|
NTKERNELAPI
|
|
VOID
|
|
NTAPI
|
|
MmFreeMappingAddress(
|
|
_In_ __drv_freesMem(Mem) _Post_invalid_ PVOID BaseAddress,
|
|
_In_ ULONG PoolTag);
|
|
|
|
_IRQL_requires_max_ (APC_LEVEL)
|
|
NTKERNELAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
MmIsVerifierEnabled(
|
|
_Out_ PULONG VerifierFlags);
|
|
|
|
_Post_writable_byte_size_(MemoryDescriptorList->ByteCount)
|
|
_IRQL_requires_max_(DISPATCH_LEVEL)
|
|
_At_(MemoryDescriptorList->MappedSystemVa + MemoryDescriptorList->ByteOffset,
|
|
_Post_writable_byte_size_(MemoryDescriptorList->ByteCount))
|
|
_Must_inspect_result_
|
|
_Success_(return != NULL)
|
|
NTKERNELAPI
|
|
PVOID
|
|
NTAPI
|
|
MmMapLockedPagesWithReservedMapping(
|
|
_In_ PVOID MappingAddress,
|
|
_In_ ULONG PoolTag,
|
|
_Inout_ PMDL MemoryDescriptorList,
|
|
_In_ __drv_strictTypeMatch(__drv_typeCond)
|
|
MEMORY_CACHING_TYPE CacheType);
|
|
|
|
_Must_inspect_result_
|
|
_IRQL_requires_max_(DISPATCH_LEVEL)
|
|
NTKERNELAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
MmProtectMdlSystemAddress(
|
|
_In_ PMDL MemoryDescriptorList,
|
|
_In_ ULONG NewProtect);
|
|
|
|
_IRQL_requires_max_(DISPATCH_LEVEL)
|
|
NTKERNELAPI
|
|
VOID
|
|
NTAPI
|
|
MmUnmapReservedMapping(
|
|
_In_ PVOID BaseAddress,
|
|
_In_ ULONG PoolTag,
|
|
_Inout_ PMDL MemoryDescriptorList);
|
|
|
|
_IRQL_requires_max_ (APC_LEVEL)
|
|
NTKERNELAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
MmAddVerifierThunks(
|
|
_In_reads_bytes_ (ThunkBufferSize) PVOID ThunkBuffer,
|
|
_In_ ULONG ThunkBufferSize);
|
|
$endif (_WDMDDK_)
|
|
$if (_NTIFS_)
|
|
|
|
_IRQL_requires_max_ (PASSIVE_LEVEL)
|
|
NTKERNELAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
MmPrefetchPages(
|
|
_In_ ULONG NumberOfLists,
|
|
_In_reads_ (NumberOfLists) PREAD_LIST *ReadLists);
|
|
$endif (_NTIFS_)
|
|
|
|
$if (_WDMDDK_ || _NTIFS_)
|
|
#endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
|
|
$endif (_WDMDDK_ || _NTIFS_)
|
|
$if (_WDMDDK_ || _NTDDK_)
|
|
#if (NTDDI_VERSION >= NTDDI_WS03)
|
|
$endif (_WDMDDK_ || _NTDDK_)
|
|
$if (_WDMDDK_)
|
|
_IRQL_requires_max_ (DISPATCH_LEVEL)
|
|
NTKERNELAPI
|
|
LOGICAL
|
|
NTAPI
|
|
MmIsIoSpaceActive(
|
|
_In_ PHYSICAL_ADDRESS StartAddress,
|
|
_In_ SIZE_T NumberOfBytes);
|
|
$endif (_WDMDDK_)
|
|
|
|
$if (_NTDDK_)
|
|
_Must_inspect_result_
|
|
_IRQL_requires_max_(PASSIVE_LEVEL)
|
|
NTKERNELAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
MmCreateMirror(VOID);
|
|
$endif (_NTDDK_)
|
|
$if (_WDMDDK_ || _NTDDK_)
|
|
#endif /* (NTDDI_VERSION >= NTDDI_WS03) */
|
|
$endif (_WDMDDK_ || _NTDDK_)
|
|
$if (_WDMDDK_)
|
|
#if (NTDDI_VERSION >= NTDDI_WS03SP1)
|
|
_Must_inspect_result_
|
|
_IRQL_requires_max_ (DISPATCH_LEVEL)
|
|
NTKERNELAPI
|
|
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);
|
|
#endif
|
|
$endif (_WDMDDK_)
|
|
|
|
#if (NTDDI_VERSION >= NTDDI_VISTA)
|
|
$if (_WDMDDK_)
|
|
_IRQL_requires_max_ (APC_LEVEL)
|
|
NTKERNELAPI
|
|
LOGICAL
|
|
NTAPI
|
|
MmIsDriverVerifyingByAddress(
|
|
_In_ PVOID AddressWithinSection);
|
|
$endif (_WDMDDK_)
|
|
$if (_NTDDK_)
|
|
_Must_inspect_result_
|
|
_IRQL_requires_max_(APC_LEVEL)
|
|
NTSTATUS
|
|
NTAPI
|
|
MmRotatePhysicalView(
|
|
_In_ PVOID VirtualAddress,
|
|
_Inout_ PSIZE_T NumberOfBytes,
|
|
_In_opt_ PMDLX NewMdl,
|
|
_In_ MM_ROTATE_DIRECTION Direction,
|
|
_In_ PMM_ROTATE_COPY_CALLBACK_FUNCTION CopyFunction,
|
|
_In_opt_ PVOID Context);
|
|
$endif (_NTDDK_)
|
|
$if (_NTIFS_)
|
|
|
|
_IRQL_requires_max_ (APC_LEVEL)
|
|
NTKERNELAPI
|
|
ULONG
|
|
NTAPI
|
|
MmDoesFileHaveUserWritableReferences(
|
|
_In_ PSECTION_OBJECT_POINTERS SectionPointer);
|
|
|
|
_Must_inspect_result_
|
|
_At_(*BaseAddress, __drv_allocatesMem(Mem))
|
|
__kernel_entry
|
|
NTSYSCALLAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
NtAllocateVirtualMemory(
|
|
_In_ HANDLE ProcessHandle,
|
|
_Inout_ _Outptr_result_buffer_(*RegionSize) PVOID *BaseAddress,
|
|
_In_ ULONG_PTR ZeroBits,
|
|
_Inout_ PSIZE_T RegionSize,
|
|
_In_ ULONG AllocationType,
|
|
_In_ ULONG Protect);
|
|
|
|
__kernel_entry
|
|
_IRQL_requires_max_(PASSIVE_LEVEL)
|
|
NTSYSCALLAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
NtFreeVirtualMemory(
|
|
_In_ HANDLE ProcessHandle,
|
|
_Inout_ __drv_freesMem(Mem) PVOID *BaseAddress,
|
|
_Inout_ PSIZE_T RegionSize,
|
|
_In_ ULONG FreeType);
|
|
|
|
$endif (_NTIFS_)
|
|
#endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
|
|
|