MiDeleteSubsectionLargePages

NTSTATUS __stdcall MiDeleteSubsectionLargePages(INT64 a1, CHAR *a2, INT64 a3){
  __int64 v3; 
  NTSTATUS v4; 
  _MMPFN *v5; 
  INT64 v6; 
  __int64 v8; 
  unsigned __int64 LeafPfnBuddy; 
  int v10; 
  __int64 v11; 
  unsigned __int64 v12; 
  _MIPFNBLINK *p_u2; 
  unsigned __int64 v14; 
  bool v15; 
  INT64 v16; 
  UINT64 v17; 
  UINT64 v18; 
  NTSTATUS result; 
  int v20[8]; 
  UINT64 BitsMustBeChanged; 
  UINT64 v22; 
  UINT8 OldIrql; 

  v3 = 0i64;
  v4 = 0;
  v5 = (_MMPFN *)a2;
  v6 = a1;
  if( a2 )
  {
    do
    {
      v8 = v5 - MmGetPfnDb();
      LeafPfnBuddy = MiGetLeafPfnBuddy(v5);
      if( a3 )
      {
        v11 = ((unsigned __int64)v5->u4._bf_0 >> 39) & 0x3FF;
        LODWORD(BitsMustBeChanged) = 1;
        MiUpdateLargePageBitMap(*(_QWORD *)(*(&stru_140C4DB30 + 267) + 8 * v11), v8, 0x200ui64, 0i64, BitsMustBeChanged);
        v12 = (unsigned __int64)&v5[512];
        if( v5 < &v5[512] )
        {
          p_u2 = &v5->u2;
          v3 += 512i64;
          do
          {
            OldIrql = MiLockPageInline((_MMPFN *)&p_u2[-3]);
            v14 = p_u2->_bf_0 & 0xC000000000000000ui64;
            v15 = LOWORD(p_u2[1]._bf_0) == 2;
            LOWORD(p_u2[1]._bf_0) -= 2;
            p_u2->_bf_0 = v14;
            if( v15 )
            {
              _InterlockedOr(v20, 0);
              MiSetPfnTbFlushStamp((_MMPFN *)&p_u2[-3], (unsigned int)KiTbFlushTimeStamp, 1ui64);
              MiInsertPageInFreeOrZeroedList(v8, 2ui64, v16, v17, BitsMustBeChanged, v22);
            }
            else
            {
              if( (v14 & 0x4000000000000000i64) == 0 )
                p_u2->_bf_0 = v14 | 0x4000000000000000i64;
              BYTE2(p_u2[1]._bf_0) |= 7u;
            }
            MiUnlockPage((_MMPFN *)&p_u2[-3], OldIrql);
            p_u2 += 6;
            ++v8;
          }
          while( (unsigned __int64)&p_u2[-3] < v12 );
        }
      }
      else
      {
        MiConvertSmallPageRangeToLarge(v8, 1i64);
        MiFreeLargePages(v5);
        v4 += v10;
        v3 += 512i64;
      }
      v5 = (_MMPFN *)LeafPfnBuddy;
    }
    while( LeafPfnBuddy );
    v6 = a1;
  }
  v18 = 8i64 * *(unsigned int *)(v6 + 44);
  MmUnlockPreChargedPagedPool(*(_QWORD *)(v6 + 8));
  MmReturnChargesToLockPagedPool(*(VOID **)(v6 + 8), v18);
  result = v4;
  *(_QWORD *)(*(_QWORD *)v6 + 120i64) ^= (*(_QWORD *)(*(_QWORD *)v6 + 120i64) ^ (*(_QWORD *)(*(_QWORD *)v6 + 120i64) - v3)) & 0xFFFFFFFFFi64;
  return result;
}

Referenced by:

MiDeleteSubsectionPages