26 IN void* StartAddress,
27 IN size_t NumberOfBytes
51 if (!NumberOfBytes || !StartAddress)
return false;
54 uintptr_t CurrentAddress = (uintptr_t)StartAddress;
60 if (!CurrentPte || !CurrentPte->
Hard.
Present)
return false;
66 for (
size_t i = 1; i < AmtPages; i++) {
73 if (!CurrentPte || !CurrentPte->
Hard.
Present)
return false;
78 if (CurrentPfn != (StartPfn + i)) {
88 IN size_t NumberOfBytes,
89 IN uint64_t HighestAcceptableAddress
120 size_t ConsecutiveFound = 0;
123 void* BaseAddress = NULL;
149 if (i >= MaxPfn)
break;
157 if (ConsecutiveFound == 0) {
163 ConsecutiveFound = 0;
167 if (ConsecutiveFound == pageCount) {
195 BaseAddress = (
void*)virt;
214 IN void* BaseAddress,
215 IN size_t NumberOfBytes
239 uintptr_t CurrentAddress = (uintptr_t)BaseAddress;
250 for (
size_t i = 0; i < pageCount; i++) {
270 IN uintptr_t PhysicalAddress,
271 IN size_t NumberOfBytes,
295 void* BaseAddress = NULL;
300 assert(NumberOfBytes > 0);
305 if (!VA)
return NULL;
308 uintptr_t CurrentVA = VA;
309 uintptr_t CurrentPhys = PhysicalAddress;
310 for (
size_t i = 0; i < NumberOfPages; i++) {
313 if (!pte)
goto failure;
323 BaseAddress = (
void*)VA;
FORCEINLINE uint64_t InterlockedAddU64(volatile uint64_t *target, uint64_t value)
PAGE_INDEX MiTranslatePteToPfn(IN PMMPTE pte)
PMMPTE MiGetPtePointer(IN uintptr_t va)
void MiUnmapPte(IN PMMPTE pte)
FORCEINLINE IRQL MeGetCurrentIrql(void)
#define PhysicalFrameSize
#define PHYSICAL_TO_PPFN(PHYS)
enum _MEMORY_CACHING_TYPE MEMORY_CACHING_TYPE
#define PPFN_TO_INDEX(PPFN)
FORCEINLINE uint64_t MiCacheToFlags(MEMORY_CACHING_TYPE type)
#define PPFN_TO_PHYSICAL_ADDRESS(PPFN)
#define PhysicalMemoryOffset
#define MI_NONPAGED_POOL_BASE
#define BYTES_TO_PAGES(Bytes)
#define MI_NONPAGED_POOL_END
#define MI_WRITE_PTE(_PtePointer, _Va, _Pa, _Flags)
struct _PFN_ENTRY * PPFN_ENTRY
void MmFreeContigiousMemory(IN void *BaseAddress, IN size_t NumberOfBytes)
bool MiCheckForContigiousMemory(IN void *StartAddress, IN size_t NumberOfBytes)
void * MmMapIoSpace(IN uintptr_t PhysicalAddress, IN size_t NumberOfBytes, IN MEMORY_CACHING_TYPE CacheType)
void * MmAllocateContigiousMemory(IN size_t NumberOfBytes, IN uint64_t HighestAcceptableAddress)
void MiUnlinkPageFromList(PPFN_ENTRY pfn)
void MiReleasePhysicalPage(IN PAGE_INDEX PfnIndex)
MM_PFN_DATABASE PfnDatabase
void MmFreePool(IN void *buf)
void MsAcquireSpinlock(IN PSPINLOCK lock, IN PIRQL OldIrql)
void MsReleaseSpinlock(IN PSPINLOCK lock, IN IRQL OldIrql)
struct _MMPTE::@172372265215056352375070220246156106027174106113::@200357034104227323320222006243127050212100105247 Hard
union _PFN_ENTRY::@217024126340164016372152071216274230164113211246 Descriptor
volatile uint32_t RefCount
struct _PFN_ENTRY::@217024126340164016372152071216274230164113211246::@301110335271023021153236134322146064331241142124 Mapping
uintptr_t MiAllocatePoolVa(IN POOL_TYPE PoolType, IN size_t NumberOfBytes)
void MiFreePoolVaContiguous(IN uintptr_t va, IN size_t NumberOfBytes, IN POOL_TYPE PoolType)