MmUnmapReservedMapping
VOID __stdcall MmUnmapReservedMapping(PVOID BaseAddress, ULONG PoolTag, PMDL MemoryDescriptorList){
ULONG_PTR v3;
ULONG_PTR v4;
unsigned __int64 BugCheckParameter4;
KIRQL v7;
__int64 v8;
unsigned __int64 v9;
unsigned __int64 v10;
unsigned __int64 v11;
unsigned __int64 v12;
char *v13;
char *v14;
unsigned __int64 i;
v3 = (ULONG_PTR)BaseAddress;
v4 = PoolTag;
if( (MemoryDescriptorList->MdlFlags & 0x200) != 0 )
v3 = (ULONG_PTR)BaseAddress - (unsigned int)MiRetardMdl(MemoryDescriptorList);
BugCheckParameter4 = (((LODWORD(MemoryDescriptorList->StartVa) + MemoryDescriptorList->ByteOffset) & 0xFFF)
+ (unsigned __int64)MemoryDescriptorList->ByteCount
+ 4095) >> 12;
v7 = ExAcquireSpinLockShared(&dword_140C4E900);
v8 = qword_140C4E908;
v9 = v3 & 0xFFFFFFFFFFFFF000ui64;
v10 = v7;
while( 1 )
{
while( 1 )
{
if( !v8 )
KeBugCheckEx(0xDAu, 0x106ui64, v3, v4, 2ui64);
v11 = *(_QWORD *)(v8 + 24);
if( v9 >= v11 )
break;
v8 = *(_QWORD *)v8;
}
if( v9 < v11 + (*(_QWORD *)(v8 + 32) << 12) )
break;
v8 = *(_QWORD *)(v8 + 8);
}
ExReleaseSpinLockSharedFromDpcLevel(&dword_140C4E900);
__writecr8(v10);
if( *(_DWORD *)(v8 + 40) != (_DWORD)v4 )
KeBugCheckEx(0xDAu, 0x102ui64, v3, v4, BugCheckParameter4);
v12 = *(_QWORD *)(v8 + 32);
if( (*(_DWORD *)(v8 + 44) & 1) != 0 )
v12 -= (v3 - *(_QWORD *)(v8 + 24)) >> 12;
else
v3 = *(_QWORD *)(v8 + 24);
if( BugCheckParameter4 > v12 )
KeBugCheckEx(0xDAu, 0x10Aui64, v3, *(_QWORD *)(v8 + 32), BugCheckParameter4);
MiUnmapMdlCommon(v3, 0i64, (unsigned int)v4, (INT64)MemoryDescriptorList, BugCheckParameter4);
if( (*(_DWORD *)(v8 + 44) & 1) == 0 )
{
v13 = (char *)MmGetPteBase() + ((v3 >> 9) & 0x7FFFFFFFF8i64);
v14 = &v13[8 * *(_QWORD *)(v8 + 32)];
for( i = (unsigned __int64)&v13[8 * BugCheckParameter4]; i < (unsigned __int64)v14; i += 8i64 )
{
if( MI_READ_PTE_LOCK_FREE(i) )
KeBugCheckEx(0xDAu, 0x10Cui64, v3, v4, BugCheckParameter4);
}
}
MemoryDescriptorList->MdlFlags &= 0xFFDEu;
if( (MemoryDescriptorList->MdlFlags & 4) != 0 )
MemoryDescriptorList->MappedSystemVa = (char *)MemoryDescriptorList->StartVa + MemoryDescriptorList->ByteOffset;
}Referenced by:
EtwpSavePersistedLogger
HalpDmaFlushBufferWithEmergencyResources
HalpDmaReleaseBufferMappings
HalpDmaSyncMapBuffersWithEmergencyResources
PnprCopyReservedMapping
PnprMapPhysicalPages
PnprSwap
PspIumFreePhysicalPages
SmFpFree
sub_1403E9150