MmUnmapReservedMapping

NTSTATUS __fastcall MmUnmapReservedMapping(UINT64 a1, UINT64 a2, INT64 a3){
  unsigned __int64 v4; 
  unsigned int v6; 
  unsigned __int64 BugCheckParameter4; 
  unsigned __int8 v8; 
  __int64 *v9; 
  UINT64 v10; 
  unsigned __int64 v11; 
  UINT64 v12; 
  unsigned __int64 v13; 
  char *v14; 
  char *v15; 
  unsigned __int64 i; 
  __int64 v17; 
  __int64 v18; 

  v4 = (unsigned int)a2;
  if( (*(_WORD *)(a3 + 10) & 0x200) != 0 )
  {
    MiRetardMdl((_MDL *)a3);
    a1 -= v6;
  }
  BugCheckParameter4 = (((*(_DWORD *)(a3 + 32) + *(_DWORD *)(a3 + 44)) & 0xFFF)
                      + (unsigned __int64)*(unsigned int *)(a3 + 40)
                      + 4095) >> 12;
  v8 = ExAcquireSpinLockShared((INT64 *)&stru_140C4DB30 + 442);
  v9 = (__int64 *)*(&stru_140C4DB30 + 443);
  v10 = a1 & 0xFFFFFFFFFFFFF000ui64;
  v11 = v8;
  while( 1 )
  {
    while( 1 )
    {
      if( !v9 )
        KeBugCheckEx(0xDAu, (PVOID)0x106, (PVOID)a1, (PVOID)v4, (PVOID)2);
      v12 = v9[3];
      if( v10 >= v12 )
        break;
      v9 = (__int64 *)*v9;
    }
    if( v10 < v12 + (v9[4] << 12) )
      break;
    v9 = (__int64 *)v9[1];
  }
  ExReleaseSpinLockSharedFromDpcLevel((PEX_SPIN_LOCK)&stru_140C4DB30 + 884);
  __writecr8(v11);
  if( *((_DWORD *)v9 + 10) != (_DWORD)v4 )
    KeBugCheckEx(0xDAu, (PVOID)0x102, (PVOID)a1, (PVOID)v4, (PVOID)BugCheckParameter4);
  v13 = v9[4];
  if( (*((_DWORD *)v9 + 11) & 1) != 0 )
    v13 -= (a1 - v9[3]) >> 12;
  else
    a1 = v9[3];
  if( BugCheckParameter4 > v13 )
    KeBugCheckEx(0xDAu, (PVOID)0x10A, (PVOID)a1, (PVOID)v9[4], (PVOID)BugCheckParameter4);
  MiUnmapMdlCommon(a1, 0i64, (unsigned int)v4, a3, BugCheckParameter4);
  if( (*((_DWORD *)v9 + 11) & 1) == 0 )
  {
    v14 = (char *)MmGetPteBase() + ((a1 >> 9) & 0x7FFFFFFFF8i64);
    v15 = &v14[8 * v9[4]];
    for( i = (unsigned __int64)&v14[8 * BugCheckParameter4]; i < (unsigned __int64)v15; i += 8i64 )
    {
      LODWORD(v17) = MI_READ_PTE_LOCK_FREE(i);
      if( v17 )
        KeBugCheckEx(0xDAu, (PVOID)0x10C, (PVOID)a1, (PVOID)v4, (PVOID)BugCheckParameter4);
    }
  }
  *(_WORD *)(a3 + 10) &= 0xFFDEu;
  LODWORD(v18) = *(unsigned __int16 *)(a3 + 10);
  if( (v18 & 4) != 0 )
  {
    v18 = *(_QWORD *)(a3 + 32) + *(unsigned int *)(a3 + 44);
    *(_QWORD *)(a3 + 24) = v18;
  }
  return v18;
}

Referenced by:

EtwpSavePersistedLogger
HalpDmaFlushBufferWithEmergencyResources
HalpDmaReleaseBufferMappings
HalpDmaSyncMapBuffersWithEmergencyResources
PnprCopyReservedMapping
PnprMapPhysicalPages
PnprSwap
PspIumFreePhysicalPages
SmFpFree
sub_1403E9150