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