MiReleaseLargePteMappings

INT64 __fastcall MiReleaseLargePteMappings(_MI_SYSTEM_PTE_TYPE *PteInfo, _MI_CACHED_PTE *CachedPte, UINT64 FlushTb){
  int v3; 
  __int64 PteIndex; 
  INT64 v7; 
  unsigned __int64 v8; 
  _MMPTE *PteBase; 
  __int64 v10; 
  __int64 v11; 
  INT64 AnyMultiplexedVm; 
  unsigned __int64 v13; 
  unsigned __int64 v14; 
  unsigned __int64 v15; 
  unsigned __int64 v16; 
  __int64 v17; 
  char *v18; 
  unsigned int v19; 
  INT64 v20; 
  unsigned int v21; 
  int v23[8]; 
  UINT8 v24; 
  INT64 v25; 
  INT64 v26; 
  __int64 v27; 
  __int64 v28; 
  _MI_CACHED_PTE *v29; 
  unsigned __int64 v30; 
  __int64 v31; 
  __int64 v32; 
  INT64 result; 
  int v34; 
  __int64 v35; 
  v3 = FlushTb;
  v29 = CachedPte;
  memset((INT64)&result, 0i64);
  PteIndex = CachedPte->PteIndex;
  v7 = 0i64;
  v8 = ((unsigned __int64)PteInfo->BasePte >> 9) & 0x7FFFFFFFF8i64;
  PteBase = MmGetPteBase();
  v35 = 0i64;
  v31 = (__int64)PteBase + v8;
  v34 = 20;
  v10 = (_QWORD)PteBase << 25;
  v32 = (_QWORD)PteBase << 25;
  AnyMultiplexedVm = (INT64)MiGetAnyMultiplexedVm(3i64);
  v25 = AnyMultiplexedVm;
  do
  {
    v13 = v11 + 8 * PteIndex;
    v14 = MI_READ_PTE_LOCK_FREE(v13);
    if( (v14 & 0xF000) == 4096 )
    {
      v15 = 1i64;
    }
    else
    {
      v16 = MI_READ_PTE_LOCK_FREE(v13 + 8);
      if( qword_140C4DC80 )
      {
        if( (v16 & 0x10) != 0 )
          v16 &= ~0x10ui64;
        else
          v16 &= ~qword_140C4DC80;
      }
      v15 = HIDWORD(v16);
    }
    if( qword_140C4DC80 )
    {
      if( (v14 & 0x10) != 0 )
        v14 &= ~0x10ui64;
      else
        v14 &= ~qword_140C4DC80;
    }
    PteIndex = HIDWORD(v14);
    v26 = v15 + v7;
    v30 = v15 << 21;
    v17 = (((__int64)((v13 << 25) - v10) >> 16 << 25) - v10) >> 16;
    v28 = v17;
    v27 = PteIndex;
    v18 = (char *)MmGetPteBase() + ((v13 >> 9) & 0x7FFFFFFFF8i64);
    v24 = MiLockWorkingSetShared(AnyMultiplexedVm);
    MiLockPageTableInternal(AnyMultiplexedVm, (UINT64)v18, 0i64);
    v19 = 0;
    if( v15 )
    {
      v20 = v25;
      do
      {
        *(_QWORD *)v13 = ZeroPte;
        if( v3 == 1 )
          MiInsertLargeTbFlushEntry((INT64)&result, 1ui64, v13);
        v13 += 8i64;
        if( (v13 & 0xFFF) == 0 && v19 + 1 < v15 )
        {
          MiUnlockPageTableInternal(v20, (UINT64)v18);
          v18 += 8;
          MiLockPageTableInternal(v20, (UINT64)v18, 0i64);
        }
        ++v19;
      }
      while( v19 < v15 );
      PteIndex = v27;
      v17 = v28;
      AnyMultiplexedVm = v25;
    }
    MiUnlockPageTableInternal(AnyMultiplexedVm, (UINT64)v18);
    MiUnlockWorkingSetShared(AnyMultiplexedVm, v24);
    if( v3 == 1 )
    {
      MiFlushTbList((__int64)&result);
      if( PteIndex )
      {
        _InterlockedOr(v23, 0);
        v21 = KiTbFlushTimeStamp - v29->GlobalTimeStamp;
        v3 = v21 <= 2 && ((v29->GlobalTimeStamp & 1) != 0 || v21 < 2);
      }
    }
    MiReturnSystemVa(v17, v17 + v30, 13i64);
    v11 = v31;
    v7 = v26;
    v10 = v32;
  }
  while( PteIndex );
  return v26;
}

Referenced by:

MiEmptyPteBins
MiInsertCachedPte