MmMapLockedPagesWithReservedMapping
NTSTATUS __stdcall MmMapLockedPagesWithReservedMapping(
PVOID MappingAddress,
UINT64 PoolTag,
MDL *MemoryDescriptorList,
MEMORY_CACHING_TYPE CacheType){
ULONG_PTR v5;
unsigned __int64 v6;
KIRQL v8;
__int64 v9;
unsigned __int64 v10;
unsigned __int64 v11;
unsigned __int64 v12;
unsigned __int64 v13;
unsigned __int64 v14;
_MMPTE *v15;
ULONG_PTR v16;
ULONG_PTR BugCheckParameter4;
MDL *i;
_MDL *Next;
v5 = (unsigned int)PoolTag;
v6 = (((LODWORD(MemoryDescriptorList->StartVa) + MemoryDescriptorList->ByteOffset) & 0xFFF)
+ (unsigned __int64)MemoryDescriptorList->ByteCount
+ 4095) >> 12;
v8 = ExAcquireSpinLockShared(&dword_140C4E900);
v9 = qword_140C4E908;
v10 = (unsigned __int64)MappingAddress & 0xFFFFFFFFFFFFF000ui64;
v11 = v8;
while( 1 )
{
while( 1 )
{
if( !v9 )
KeBugCheckEx(0xDAu, 0x106ui64, (ULONG_PTR)MappingAddress, v5, 1ui64);
v12 = *(_QWORD *)(v9 + 24);
if( v10 >= v12 )
break;
v9 = *(_QWORD *)v9;
}
if( v10 < v12 + (*(_QWORD *)(v9 + 32) << 12) )
break;
v9 = *(_QWORD *)(v9 + 8);
}
ExReleaseSpinLockSharedFromDpcLevel(&dword_140C4E900);
__writecr8(v11);
if( *(_DWORD *)(v9 + 40) != (_DWORD)v5 )
KeBugCheckEx(0xDAu, 0x104ui64, (ULONG_PTR)MappingAddress, v5, *(unsigned int *)(v9 + 40));
if( (*(_DWORD *)(v9 + 44) & 1) != 0 )
{
if( ((unsigned __int16)MappingAddress & 0xFFF) != 0 )
return 0;
v14 = v6;
v13 = *(_QWORD *)(v9 + 32) - (((unsigned __int64)MappingAddress - *(_QWORD *)(v9 + 24)) >> 12);
}
else
{
v13 = *(_QWORD *)(v9 + 32);
MappingAddress = *(PVOID *)(v9 + 24);
v14 = v13;
}
if( v6 <= v13 )
{
v15 = (_MMPTE *)((char *)MmGetPteBase() + (((unsigned __int64)MappingAddress >> 9) & 0x7FFFFFFFF8i64));
v16 = (ULONG_PTR)v15;
BugCheckParameter4 = (ULONG_PTR)v15 + 8 * v14;
if( (unsigned __int64)v15 < BugCheckParameter4 )
{
do
{
if( MI_READ_PTE_LOCK_FREE(v16) )
KeBugCheckEx(0xDAu, 0x107ui64, (ULONG_PTR)MappingAddress, v16, BugCheckParameter4);
v16 += 8i64;
}
while( v16 < BugCheckParameter4 );
}
for( i = MemoryDescriptorList + 1; ; i = (MDL *)((char *)i + 8) )
{
Next = i->Next;
if( i->Next <= (_MDL *)0xFFFFFFFFFi64
&& (*((_QWORD *)MmGetPfnDb() + 6 * (_QWORD)Next + 5) & 0x4000000000000i64) != 0
&& (int)MiLegitimatePageForDriversToMap((INT64)MmGetPfnDb() + 48 * (_QWORD)Next) < 0 )
{
break;
}
if( !--v6 )
return MiMapMdlCommon(MemoryDescriptorList, v15, 0i64, MmNonCachedUnordered);
}
}
return 0;
}Referenced by:
EtwpSavePersistedLogger
HalpDmaAcquireBufferMappings
HalpDmaFlushBufferWithEmergencyResources
HalpDmaSyncMapBuffersWithEmergencyResources
PnprCopyReservedMapping
PnprMapPhysicalPages
PspIumFreePhysicalPages
SmFpAllocate
sub_1403E91C0