MiDecommitLargePoolVa

UINT64 __stdcall MiDecommitLargePoolVa(PVOID VAorProtoPte, MMPTE *PointerPxe, INT64 PageCount){
  unsigned int v3; 
  unsigned __int64 v6; 
  UINT64 ContainingPageTable; 
  __int64 v8; 
  __int64 v9; 
  __int64 v10; 
  __int64 *v11; 
  UINT64 result; 
  INT64 v13[2]; 
  INT64 v14[4]; 
  __int128 v15; 
  __int128 v16; 
  __int128 v17; 
  __int128 v18; 
  __int128 v19; 
  __int128 v20; 
  __int128 v21; 
  __int128 v22; 
  __int128 v23; 
  __int64 v24; 
  v14[0] = 0i64;
  v15 = 0i64;
  v3 = 0;
  v16 = 0i64;
  v17 = 0i64;
  v18 = 0i64;
  v19 = 0i64;
  v20 = 0i64;
  v24 = 0i64;
  v21 = 0i64;
  v22 = 0i64;
  v23 = 0i64;
  v14[1] = 20i64;
  v14[2] = 0i64;
  v14[3] = 0i64;
  v13[0] = MI_READ_PTE_LOCK_FREE((INT64)PointerPxe);
  v6 = ((unsigned __int64)MI_READ_PTE_LOCK_FREE((INT64)v13) >> 12) & 0xFFFFFFFFFi64;
  *((_QWORD *)MmGetPfnDb() + 6 * v6) = 0i64;
  ContainingPageTable = MiGetContainingPageTable((UINT64)PointerPxe);
  MiLockAndDecrementShareCount(v8 + 48 * ContainingPageTable, 0);
  *(_QWORD *)PointerPxe = ZeroPte;
  MiInsertLargeTbFlushEntry((INT64)v14, 1ui64, (INT64)PointerPxe);
  if( PointerPxe >= MmGetPml4eBase() && PointerPxe <= MmGetPml4eLimit() )
  {
    v9 = (_QWORD)MmGetPteBase() << 25;
    v10 = (((((((_QWORD)PointerPxe << 25) - v9) >> 16 << 25) - v9) >> 16 << 25) - v9) >> 16;
    MiReplicatePteChange((MMPTE *)v10, (MMPTE *)v10);
  }
  MiFlushTbList((__int64)v14);
  v11 = MiLargePageSizes;
  do
  {
    if( *v11 == PageCount )
      break;
    ++v3;
    ++v11;
  }
  while( v3 < 3 );
  result = MiFreeLargePageMemory(v6, v3, 4ui64);
  _InterlockedExchangeAdd64(&qword_140C4ECE0, -PageCount);
  return result;
}

Referenced by:

MiDeleteNonPagedPoolPte