MiUnmapMdlCommon

VOID __stdcall MiUnmapMdlCommon(UINT64 a1, INT64 a2, INT64 a3, INT64 a4, UINT64 a5){
  _MMPTE *PteBase; 
  unsigned __int64 v9; 
  unsigned __int64 v10; 
  INT64 *v11; 
  unsigned __int64 v12; 
  unsigned int v13; 
  _QWORD *v14; 
  _MMPFN *v15; 
  UINT64 v16; 
  char v17; 
  char v18; 
  _MMPTE *v19; 
  UINT64 v20; 
  UINT64 v21; 
  UINT64 v22; 
  UINT8 v23; 
  __int64 v24; 
  UINT64 v25; 
  unsigned __int64 Long; 
  int v27; 
  UINT64 v28; 
  UINT64 v29; 
  PVOID BugCheckParameter3; 
  _MMPFN *Pfn1; 
  _QWORD *v32; 
  unsigned __int64 v33; 
  PVOID BugCheckParameter4; 
  PVOID BugCheckParameter2; 
  _MI_TB_FLUSH_LIST TbFlushList[48]; 

  LODWORD(BugCheckParameter3) = a3;
  BugCheckParameter2 = (PVOID)a1;
  BugCheckParameter4 = (PVOID)a5;
  memset(TbFlushList, 0i64, 0xB8u);
  *(_QWORD *)&TbFlushList[6] = 0i64;
  v32 = (_QWORD *)(a4 + 48);
  TbFlushList[2] = 20;
  PteBase = MmGetPteBase();
  v9 = (unsigned __int64)PteBase + ((a1 >> 9) & 0x7FFFFFFFF8i64);
  v10 = v9 + 8 * a5;
  v33 = v10;
  v11 = (INT64 *)((char *)PteBase + ((v9 >> 9) & 0x7FFFFFFFF8i64));
  if( (MI_READ_PTE_LOCK_FREE((INT64)v11) & 0x80u) == 0 )
  {
    v15 = 0i64;
    Pfn1 = 0i64;
  }
  else
  {
    v12 = (unsigned __int8)ExAcquireSpinLockExclusive((INT64 *)&stru_140C4DB30 + 442);
    v13 = 0;
    Pfn1 = (_MMPFN *)*(&stru_140C4DB30 + 444);
    v14 = (_QWORD *)*(&stru_140C4DB30 + 444);
    if( a5 >> 9 != 1 )
    {
      do
      {
        v14 = (_QWORD *)*v14;
        ++v13;
      }
      while( v13 < (a5 >> 9) - 1 );
    }
    *(&stru_140C4DB30 + 444) = *v14;
    *v14 = 0i64;
    ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)&stru_140C4DB30 + 442);
    __writecr8(v12);
    v15 = Pfn1;
    v10 = v33;
  }
  v16 = 0i64;
  if( a2 )
  {
    MiLockWorkingSetShared();
    v18 = v17;
  }
  else
  {
    v18 = 17;
  }
  if( v9 < v10 )
  {
    while( 1 )
    {
      if( v18 != 17 )
      {
        if( !v16 )
          goto LABEL_14;
        if( (v9 & 0xFFF) == 0 )
          break;
      }
      v19 = MmGetPteBase();
LABEL_16:
      if( v15 )
      {
        LODWORD(v20) = MI_READ_PTE_LOCK_FREE((INT64)v11);
        v29 = v20;
        v21 = v20;
        if( (v20 & 0x80u) == 0i64 || (MiPteInShadowRange((UINT64)&v29), *v32 != ((v21 >> 12) & 0xFFFFFFFFFi64)) )
          KeBugCheckEx(
            0xDAu,
            (PVOID)0x10E,
            BugCheckParameter2,
            (PVOID)(unsigned int)BugCheckParameter3,
            BugCheckParameter4);
        Pfn1 = (_MMPFN *)Pfn1->u1.$976DF529DAC3D73085C9E386D94B91E6::$E228DCF3D8940E384DBC5EFCA756D8B6::_bf_0;
        MiInsertLargeTbFlushEntry(TbFlushList, 1ui64, (INT64)v11);
        LODWORD(v22) = MiMakeValidPte((_XSTATE_CONFIGURATION *)v9, v15 - MmGetPfnDb(), 2952790022i64);
        v29 = v22;
        v23 = MiLockPageInline(v15);
        v15->u1.$976DF529DAC3D73085C9E386D94B91E6::$E228DCF3D8940E384DBC5EFCA756D8B6::_bf_0 = 0i64;
        v15->PteLong = (unsigned __int64)v11;
        _InterlockedAnd64(&v15->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
        __writecr8(v23);
        MiWriteValidPteNewPage(v11++, v29, 0i64);
        v24 = 4096i64;
      }
      else
      {
        LODWORD(v25) = MI_READ_PTE_LOCK_FREE(v9);
        v29 = v25;
        if( (v25 & 1) == 0 )
          KeBugCheckEx(
            0xDAu,
            (PVOID)0x10B,
            BugCheckParameter2,
            (PVOID)(unsigned int)BugCheckParameter3,
            BugCheckParameter4);
        MiInsertTbFlushEntry(TbFlushList, (VOID *)((__int64)((v9 << 25) - ((_QWORD)v19 << 25)) >> 16), 1ui64, 0i64);
        Long = ZeroPte.u.Long;
        LOBYTE(v27) = MiPteInShadowRange(v9);
        if( v27 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (ZeroPte.u.Long & 1) != 0 )
          Long = ZeroPte.u.Long | 0x8000000000000000ui64;
        *(_QWORD *)v9 = Long;
        v24 = 8i64;
      }
      v32 = (_QWORD *)((char *)v32 + v24);
      v9 += v24;
      if( v9 >= v33 )
        goto LABEL_30;
      v15 = Pfn1;
    }
    MiUnlockPageTableInternal(a2, v16);
LABEL_14:
    v19 = MmGetPteBase();
    v16 = (UINT64)v19 + ((v9 >> 9) & 0x7FFFFFFFF8i64);
    MiLockPageTableInternal(a2, v16, 0i64);
    goto LABEL_16;
  }
LABEL_30:
  MiFlushTbList(TbFlushList);
  if( v18 != 17 )
  {
    if( v16 )
      MiUnlockPageTableInternal(a2, v16);
    LOBYTE(v28) = v18;
    MiUnlockWorkingSetShared((_MMSUPPORT_INSTANCE *)a2, v28);
  }
}

Referenced by:

MmUnmapLockedRestartPages
MmUnmapReservedMapping