MiReleaseLargePteMappings

NTSTATUS __stdcall 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; 
  _MMSUPPORT_INSTANCE *AnyMultiplexedVm; 
  UINT64 v13; 
  unsigned __int64 v14; 
  unsigned __int64 v15; 
  unsigned __int64 v16; 
  unsigned __int64 v17; 
  unsigned __int64 v18; 
  __int64 v19; 
  char *v20; 
  char v21; 
  unsigned int v22; 
  INT64 v23; 
  unsigned __int64 Long; 
  int v25; 
  UINT64 v26; 
  unsigned int v27; 
  int v29[8]; 
  UINT64 WsIrql; 
  INT64 v31; 
  unsigned __int64 v32; 
  __int64 v33; 
  __int64 v34; 
  _MI_CACHED_PTE *v35; 
  unsigned __int64 v36; 
  __int64 v37; 
  __int64 v38; 
  _MI_TB_FLUSH_LIST TbFlushList[48]; 

  v3 = FlushTb;
  v35 = CachedPte;
  memset(TbFlushList, 0i64, 0xB8u);
  PteIndex = CachedPte->PteIndex;
  v7 = 0i64;
  v8 = ((unsigned __int64)PteInfo->BasePte >> 9) & 0x7FFFFFFFF8i64;
  PteBase = MmGetPteBase();
  *(_QWORD *)&TbFlushList[6] = 0i64;
  v37 = (__int64)PteBase + v8;
  TbFlushList[2] = 20;
  v10 = (_QWORD)PteBase << 25;
  v38 = (_QWORD)PteBase << 25;
  AnyMultiplexedVm = MiGetAnyMultiplexedVm(MiWorkingSetTypeSystemPtes, (char *)PteBase + v8);
  v31 = (INT64)AnyMultiplexedVm;
  do
  {
    v13 = v11 + 8 * PteIndex;
    LODWORD(v14) = MI_READ_PTE_LOCK_FREE(v13);
    v15 = v14;
    if( (v14 & 0xF000) == 4096 )
    {
      v16 = 1i64;
    }
    else
    {
      LODWORD(v17) = MI_READ_PTE_LOCK_FREE(v13 + 8);
      v18 = v17;
      if( *(&stru_140C4DB30 + 42) )
      {
        if( (v17 & 0x10) != 0 )
          v18 = v17 & 0xFFFFFFFFFFFFFFEFui64;
        else
          v18 = ~*(&stru_140C4DB30 + 42) & v17;
      }
      v16 = HIDWORD(v18);
    }
    if( *(&stru_140C4DB30 + 42) )
    {
      if( (v15 & 0x10) != 0 )
        v15 &= ~0x10ui64;
      else
        v15 &= ~*(&stru_140C4DB30 + 42);
    }
    PteIndex = HIDWORD(v15);
    v32 = v16 + v7;
    v36 = v16 << 21;
    v19 = (((__int64)((v13 << 25) - v10) >> 16 << 25) - v10) >> 16;
    v34 = v19;
    v33 = PteIndex;
    v20 = (char *)MmGetPteBase() + ((v13 >> 9) & 0x7FFFFFFFF8i64);
    MiLockWorkingSetShared();
    LOBYTE(WsIrql) = v21;
    MiLockPageTableInternal((INT64)AnyMultiplexedVm, (UINT64)v20, 0i64);
    v22 = 0;
    if( v16 )
    {
      v23 = v31;
      do
      {
        Long = ZeroPte.u.Long;
        LOBYTE(v25) = MiPteInShadowRange(v13);
        if( v25 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (ZeroPte.u.Long & 1) != 0 )
          Long = ZeroPte.u.Long | 0x8000000000000000ui64;
        *(_QWORD *)v13 = Long;
        if( v3 == 1 )
          MiInsertLargeTbFlushEntry(TbFlushList, 1ui64, v13);
        v13 += 8i64;
        if( (v13 & 0xFFF) == 0 && v22 + 1 < v16 )
        {
          MiUnlockPageTableInternal(v23, (UINT64)v20);
          v20 += 8;
          MiLockPageTableInternal(v23, (UINT64)v20, 0i64);
        }
        ++v22;
      }
      while( v22 < v16 );
      PteIndex = v33;
      v19 = v34;
      AnyMultiplexedVm = (_MMSUPPORT_INSTANCE *)v31;
    }
    MiUnlockPageTableInternal((INT64)AnyMultiplexedVm, (UINT64)v20);
    LOBYTE(v26) = WsIrql;
    MiUnlockWorkingSetShared(AnyMultiplexedVm, v26);
    if( v3 == 1 )
    {
      MiFlushTbList(TbFlushList);
      if( PteIndex )
      {
        _InterlockedOr(v29, 0);
        v27 = KiTbFlushTimeStamp - v35->GlobalTimeStamp;
        v3 = v27 <= 2 && ((v35->GlobalTimeStamp & 1) != 0 || v27 < 2);
      }
    }
    MiReturnSystemVa((VOID *)v19, (VOID *)(v19 + v36), MiVaSystemPtesLarge, 0i64);
    v11 = v37;
    v7 = v32;
    v10 = v38;
  }
  while( PteIndex );
  return v32;
}

Referenced by:

MiEmptyPteBins
MiInsertCachedPte