MiDeleteSystemPagableVm

INT64 __fastcall MiDeleteSystemPagableVm(__int64 a1, __int64 a2, unsigned __int64 a3, __int64 a4, char a5, _QWORD *a6){
  __int64 v6; 
  int v7; 
  int v10; 
  int v11; 
  _MMPTE *v12; 
  char v13; 
  int v14; 
  _MI_PARTITION *v15; 
  UINT8 v16; 
  INT64 v17; 
  __int64 v18; 
  unsigned __int64 v19; 
  char *v20; 
  _QWORD *v21; 
  char v22; 
  INT64 v23; 
  UNICODE_STRING *v24; 
  UINT8 v25; 
  WCHAR *v26; 
  int v27; 
  __int64 v28; 
  _MI_PARTITION *v29; 
  _MMPFN *v30; 
  UINT8 *v31; 
  BOOL IsContended; 
  INT64 v33; 
  INT64 v34; 
  int v35; 
  INT64 Flag; 
  INT64 v38; 
  CHAR a7; 
  INT64 v40; 
  UINT64 a2a; 
  int v42; 
  int v43; 
  int v44; 
  int v45; 
  INT64 v46; 
  UINT64 SpinCount; 
  INT64 v48; 
  unsigned __int64 v49; 
  INT64 v50[2]; 
  __int128 v51; 
  INT64 *v52; 
  __int64 v53; 
  __int64 v54; 
  int v55; 
  __int16 v56; 
  __int16 v57; 
  __int64 v58; 
  __int64 v59; 
  __int64 v60; 
  __int128 v61; 
  __int128 v62; 
  __int128 v63; 
  __int128 v64; 
  __int128 v65; 
  __int128 v66; 
  __int128 v67; 
  __int128 v68; 
  __int128 v69; 
  __int64 v70; 
  v48 = a1;
  v6 = a1;
  v54 = a2;
  v7 = 0;
  v52 = 0i64;
  v57 = 0;
  v70 = 0i64;
  v44 = 0;
  *(_OWORD *)v50 = 0i64;
  v51 = 0i64;
  v61 = 0i64;
  v62 = 0i64;
  v63 = 0i64;
  v64 = 0i64;
  v65 = 0i64;
  v66 = 0i64;
  v67 = 0i64;
  v68 = 0i64;
  v69 = 0i64;
  if( a2 )
  {
    if( (*(_DWORD *)(a2 + 56) & 0x800) != 0 )
      v7 = 1;
    v44 = v7;
  }
  v10 = 10;
  a2a = 0i64;
  v11 = 0;
  HIDWORD(SpinCount) = a5 & 1;
  v12 = 0i64;
  v42 = 0;
  if( (a5 & 1) == 0 )
    v10 = 14;
  DWORD2(v51) = v10;
  v45 = a5 & 4;
  if( (a5 & 4) != 0 )
    DWORD2(v51) = v10 | 0x10;
  v13 = *(_BYTE *)(v6 + 184) & 7;
  v14 = 0;
  v53 = (_QWORD)MmGetPteBase() << 25;
  v43 = 0;
  if( (unsigned __int8)(v13 - 3) > 1u )
  {
    if( (a5 & 2) != 0 )
    {
      if( (_DWORD)dword_140C4E568 )
        v11 = 1;
      v42 = v11;
    }
    v14 = 2;
    v43 = 2;
  }
  v15 = *(_MI_PARTITION **)(qword_140C4E388 + 8i64 * *(unsigned __int16 *)(v6 + 174));
  v46 = (INT64)v15;
  v58 = 20i64;
  v55 = v14;
  v56 = 0;
  v59 = 0i64;
  v60 = 0i64;
  v49 = a3 + 8 * a4;
  v16 = MiLockWorkingSetShared(v6);
  a7 = v16;
  while( a3 < v49 )
  {
    if( v12 )
    {
      if( (a3 & 0xFFF) != 0 )
        goto LABEL_21;
      MiFlushTbList((__int64)&v55);
      a6[1] += MiTerminateWsleCluster((INT64)v50);
      MiUnlockPageTableInternal(v6, (UINT64)v12);
    }
    v12 = MiLockLowestValidPageTable(v6, (INT64 *)a3, &v52);
    a2a = (UINT64)v12;
    if( v12 != (_MMPTE *)((char *)MmGetPteBase() + ((a3 >> 9) & 0x7FFFFFFFF8i64)) )
    {
      MiUnlockPageTableInternal(v6, (UINT64)v12);
      v12 = 0i64;
      a2a = 0i64;
      a3 = (a3 & 0xFFFFFFFFFFFFF000ui64) + 4096;
      continue;
    }
LABEL_21:
    v17 = MI_READ_PTE_LOCK_FREE(a3);
    v40 = v17;
    v18 = v17;
    if( !v17 )
      goto LABEL_74;
    if( (v17 & 1) == 0 )
    {
      if( (v17 & 0x400) == 0 )
      {
        if( (v17 & 0x800) != 0 )
        {
          v30 = MiLockTransitionLeafPage((_MMPTE *)a3, 0i64);
          if( !v30 )
            goto LABEL_81;
          if( v45 && (unsigned int)MiIsPfnSystemCharged((INT64)v30) )
          {
            MiDriverPageIsDangling((INT64)v30);
            *((_BYTE *)v30 + 35) &= ~0x20u;
          }
          LOBYTE(v31) = 17;
          if( (unsigned int)MiDeleteTransitionPte((_MMPTE *)a3, v30, v31, 1ui64) == 3 )
            ++a6[1];
          ++a6[3];
        }
        else if( (v17 & 0x3E0) != 0 )
        {
          MiReleasePageFileSpace(v15, v17, 1i64);
          *(_QWORD *)a3 = ZeroPte;
          ++a6[3];
        }
        goto LABEL_74;
      }
      if( (v17 & 2) == 0 )
      {
        if( MI_PROTO_FORMAT_COMBINED(v17) )
        {
          ++a6[3];
          if( qword_140C4DC80 )
          {
            if( (v18 & 0x10) != 0 )
              v18 &= ~0x10ui64;
            else
              v18 &= ~qword_140C4DC80;
          }
          v29 = **(_MI_PARTITION ***)((((v18 >> 16) - 48) & 0xFFFFFFFFFFFFF000ui64) + 0x10);
          if( (unsigned int)MiDecrementCombinedPte(v6, (_MMPTE *)(v18 >> 16)) == 3 && v29 == v15 )
            ++a6[1];
          goto LABEL_62;
        }
        if( v44 != 1 )
        {
          if( qword_140C4DC80 )
          {
            if( (v18 & 0x10) != 0 )
              v18 &= ~0x10ui64;
            else
              v18 &= ~qword_140C4DC80;
          }
          if( !MiImageProtoChargedCommit(v54, v18 >> 16) )
            goto LABEL_62;
        }
      }
      ++a6[3];
LABEL_62:
      *(_QWORD *)a3 = ZeroPte;
      goto LABEL_74;
    }
    v19 = (__int64)((a3 << 25) - v53) >> 16;
    v20 = (char *)MmGetPfnDb() + 48 * (((unsigned __int64)MI_READ_PTE_LOCK_FREE((INT64)&v40) >> 12) & 0xFFFFFFFFFi64);
    v21 = (_QWORD *)((char *)MmGetPteBase() + ((v19 >> 9) & 0x7FFFFFFFF8i64));
    v22 = HIBYTE(*v21) & 0xF;
    if( v22 == 9 )
    {
      MiWriteWsle((INT64)v21, v19, (16 * ((*v21 >> 60) & 7)) | 0xA);
      v6 = v48;
      MiDeleteValidSystemPage(v48, (MMPTE *)a3, v45 | 0x10u, (INT64)a6);
      if( HIDWORD(SpinCount) )
        goto LABEL_29;
      v40 = 0i64;
      MiInitializeTbFlushStamps((UINT64 *)&v40);
      *(_QWORD *)a3 = v40;
      v23 = v40;
      if( qword_140C4DC80 && (v40 & 0x10) == 0 )
        v23 = v40 & ~qword_140C4DC80;
      if( (v23 & 0xFFFFFFFF00000000ui64) == 0 )
LABEL_29:
        MiInsertTbFlushEntry((INT64)&v55, v19, 1i64, 0i64);
LABEL_43:
      ++*a6;
      v15 = (_MI_PARTITION *)v46;
      if( v43 == 2 )
        MiReturnSystemCharges(v46, 1ui64, 1i64);
      goto LABEL_74;
    }
    v6 = v48;
    if( v42 )
      MI_WSLE_LOG_ACCESS(v48, a3);
    if( !(unsigned int)MiAppendWsleCluster((INT64)v50, v6, (UINT64 *)a3) )
    {
      a6[1] += MiTerminateWsleCluster((INT64)v50);
      MiAppendWsleCluster((INT64)v50, v6, (UINT64 *)a3);
    }
    LOBYTE(v27) = MI_PFN_IS_PROTO((UNICODE_STRING *)v20, v24, v25, v26);
    if( !v27 )
      goto LABEL_41;
    v28 = *((_QWORD *)v20 + 2);
    if( (v28 & 0x400) == 0 || (v18 & 0x200) != 0 )
      goto LABEL_41;
    if( qword_140C4DC80 && (v28 & 0x10) == 0 )
      v28 &= ~qword_140C4DC80;
    if( (*(_DWORD *)(*(_QWORD *)(v28 >> 16) + 56i64) & 0x820) == 2080 )
LABEL_41:
      ++a6[3];
    if( v22 == 8 )
      goto LABEL_43;
    v15 = (_MI_PARTITION *)v46;
LABEL_74:
    a3 += 8i64;
    if( a3 == v49 || (a3 & 0x78) != 0 )
    {
      v12 = (_MMPTE *)a2a;
LABEL_81:
      v16 = a7;
      continue;
    }
    IsContended = MiWorkingSetIsContended(v6);
    v12 = (_MMPTE *)a2a;
    if( !IsContended )
    {
      MiPageTableLockIsContended(v6, a2a, v33, v34, Flag, v38, a7);
      if( !v35 && !KeShouldYieldProcessor() )
        goto LABEL_81;
    }
    MiFlushTbList((__int64)&v55);
    a6[1] += MiTerminateWsleCluster((INT64)v50);
    MiUnlockPageTableInternal(v6, (UINT64)v12);
    v16 = a7;
    MiUnlockWorkingSetShared(v6, a7);
    v12 = 0i64;
    a2a = 0i64;
    MiLockWorkingSetShared(v6);
  }
  MiFlushTbList((__int64)&v55);
  if( v12 )
  {
    a6[1] += MiTerminateWsleCluster((INT64)v50);
    MiUnlockPageTableInternal(v6, (UINT64)v12);
  }
  return MiUnlockWorkingSetShared(v6, v16);
}

Referenced by:

MiDeleteBootRange
MiFreeInitializationCode
MiMapSystemImageWithLargePage
MiUnloadSystemImage
MmFreePoolMemory
MmReturnChargesToLockPagedPool