MiDeleteSubsectionLargePages

INT64 __fastcall MiDeleteSubsectionLargePages(INT64 a1, CHAR *a2, INT64 a3){
  __int64 v3; 
  INT64 v4; 
  CHAR *v5; 
  INT64 v6; 
  __int64 v8; 
  UINT64 LeafPfnBuddy; 
  __int64 v10; 
  __int64 v11; 
  unsigned __int64 v12; 
  CHAR *v13; 
  unsigned __int64 v14; 
  bool v15; 
  UINT64 v16; 
  INT64 result; 
  int v18[8]; 
  UINT64 BitsMustBeChanged; 
  UINT8 OldIrql; 
  v3 = 0i64;
  v4 = 0i64;
  v5 = a2;
  v6 = a1;
  if( a2 )
  {
    do
    {
      v8 = (v5 - (CHAR *)MmGetPfnDb()) / 48;
      LeafPfnBuddy = MiGetLeafPfnBuddy(v5);
      if( a3 )
      {
        v11 = (*((_QWORD *)v5 + 5) >> 39) & 0x3FFi64;
        LODWORD(BitsMustBeChanged) = 1;
        MiUpdateLargePageBitMap(*(_QWORD *)(qword_140C4E388 + 8 * v11), v8, 0x200ui64, 0i64, BitsMustBeChanged);
        v12 = (unsigned __int64)(v5 + 24576);
        if( v5 < v5 + 24576 )
        {
          v13 = v5 + 24;
          v3 += 512i64;
          do
          {
            OldIrql = MiLockPageInline((INT64)(v13 - 24));
            v14 = *(_QWORD *)v13 & 0xC000000000000000ui64;
            v15 = *((_WORD *)v13 + 4) == 2;
            *((_WORD *)v13 + 4) -= 2;
            *(_QWORD *)v13 = v14;
            if( v15 )
            {
              _InterlockedOr(v18, 0);
              MiSetPfnTbFlushStamp((_MMPFN *)(v13 - 24), (unsigned int)KiTbFlushTimeStamp, 1ui64);
              MiInsertPageInFreeOrZeroedList(v8, 2ui64);
            }
            else
            {
              if( (v14 & 0x4000000000000000i64) == 0 )
                *(_QWORD *)v13 = v14 | 0x4000000000000000i64;
              v13[10] |= 7u;
            }
            MiUnlockPage((_MMPFN *)(v13 - 24), OldIrql);
            v13 += 48;
            ++v8;
          }
          while( (unsigned __int64)(v13 - 24) < v12 );
        }
      }
      else
      {
        MiConvertSmallPageRangeToLarge(v8, 1i64);
        MiFreeLargePages((_MMPFN *)v5);
        v4 += v10;
        v3 += 512i64;
      }
      v5 = (CHAR *)LeafPfnBuddy;
    }
    while( LeafPfnBuddy );
    v6 = a1;
  }
  v16 = 8i64 * *(unsigned int *)(v6 + 44);
  MmUnlockPreChargedPagedPool(*(PVOID *)(v6 + 8), v16);
  MmReturnChargesToLockPagedPool(*(PVOID *)(v6 + 8), v16);
  result = v4;
  *(_QWORD *)(*(_QWORD *)v6 + 120i64) ^= (*(_QWORD *)(*(_QWORD *)v6 + 120i64) ^ (*(_QWORD *)(*(_QWORD *)v6 + 120i64) - v3)) & 0xFFFFFFFFFi64;
  return result;
}

Referenced by:

MiDeleteSubsectionPages