MiReturnPageTablePageCommitment

VOID __stdcall MiReturnPageTablePageCommitment(
        VOID *StartingAddress,
        VOID *EndingAddress,
        ULONG_PTR CurrentProcess,
        _MMVAD *PreviousVad,
        _MMVAD *NextVad,
        _MMVAD *Vad,
        _MI_DELETED_PAGE_TABLE_LEVEL_BITS *DeletedHierarchyBits){
  _MMVAD *v7; 
  __int64 v10; 
  __int64 LongFlags1; 
  unsigned __int64 v13; 
  __int64 v14; 
  unsigned __int64 v15; 
  unsigned __int64 v16; 
  NTSTATUS v17; 
  __int64 v18; 
  __int64 v19; 
  unsigned __int64 v20; 
  _MMVAD_SHORT *p_Core; 
  unsigned __int64 v22; 
  __int64 v23; 
  __int64 v24; 
  __int64 v25; 
  __int64 v26; 
  _MMVAD_SHORT *v27; 
  unsigned __int8 v28; 
  __int64 v29; 
  char v30; 
  __int64 v31; 
  unsigned __int64 v32; 
  _MMVAD_SHORT *v33; 
  _MMVAD *v34; 
  _MMVAD_SHORT *i; 
  _MMVAD_SHORT *v36; 
  _MMVAD_SHORT *v37; 
  _MMVAD_SHORT *ExtraCreateInfo; 
  _MI_DELETED_PAGE_TABLE_LEVEL_BITS *v39; 
  char v40; 
  __int64 v41; 
  unsigned __int64 v42; 
  _MMVAD_SHORT *v43; 
  _MMVAD *v44; 
  _MMVAD_SHORT *k; 
  _MMVAD_SHORT **v46; 
  _MMVAD_SHORT *v47; 
  _MMVAD_SHORT *m; 
  __int64 v49; 
  NTSTATUS v50; 
  __int64 v51; 
  signed __int64 v52; 
  __int64 v53; 
  __int64 v54; 
  int v55; 
  int v56; 
  unsigned __int64 v57; 
  int v58; 
  char v59; 
  __int64 v60; 
  __int64 v61; 
  __int64 v62; 
  __int64 v63; 
  int v64; 
  NTSTATUS v65; 
  _MMVAD_SHORT *j; 
  _MMVAD_SHORT *v67; 
  __int64 v68; 
  __int64 v69; 
  __int64 v70; 
  __int64 v71; 
  __int64 v72; 
  __int64 v73; 
  __int64 v74; 
  _MMVAD_SHORT *v75; 
  _MMVAD_SHORT *v76; 
  __int64 v77; 
  __int64 v78; 
  _EPROCESS *TargetProcess; 

  TargetProcess = *(_EPROCESS **)&CurrentProcess;
  v7 = Vad;
  v10 = *(_QWORD *)&CurrentProcess;
  LongFlags1 = Vad->Core.u1.LongFlags1;
  LODWORD(LongFlags1) = LongFlags1 & 0x7FFFFFFF;
  v13 = LongFlags1 | ((unsigned __int64)Vad->Core.CommitChargeHigh << 31);
  if( v13 >= 0x7FFFFFFFDi64 && v13 != 0x7FFFFFFFEi64 )
    return;
  v14 = 0i64;
  v15 = (unsigned __int64)PreviousVad & 0xFFFFFFFFFFFFFFFEui64;
  if( ((unsigned __int8)PreviousVad & 1) == 0 )
    v15 = 0i64;
  v75 = (_MMVAD_SHORT *)v15;
  v16 = (unsigned __int64)NextVad & 0xFFFFFFFFFFFFFFFEui64;
  if( ((unsigned __int8)NextVad & 1) == 0 )
    v16 = 0i64;
  v76 = (_MMVAD_SHORT *)v16;
  MiVadPageTableChargeLevel((INT64)Vad);
  v17 = MiVadPureReserve(&Vad->Core);
  v20 = -1i64;
  v23 = (unsigned int)((unsigned __int64)EndingAddress >> 21);
  v65 = v17;
  p_Core = (_MMVAD_SHORT *)((unsigned __int64)PreviousVad & 0xFFFFFFFFFFFFFFFEui64);
  v22 = (unsigned __int64)StartingAddress >> 21;
  v63 = v23;
  LOBYTE(v23) = 0;
  v74 = *(_QWORD *)(v10 + 1680) + 48i64;
  if( !v24 )
    p_Core = &PreviousVad->Core;
  v25 = (unsigned int)v22;
  v72 = v18;
  v26 = v63;
  v27 = (_MMVAD_SHORT *)((unsigned __int64)NextVad & 0xFFFFFFFFFFFFFFFEui64);
  v28 = DeletedHierarchyBits->AddressLevels[0];
  v70 = 0i64;
  if( !v19 )
    v27 = &NextVad->Core;
  v69 = 0i64;
  v29 = 0i64;
  v73 = 1023i64;
  v68 = 0i64;
  v64 = 0;
  j = p_Core;
  v67 = v27;
  do
  {
    v77 = v25;
    v78 = v26;
    if( !v28 )
    {
      ++v25;
LABEL_40:
      v39 = DeletedHierarchyBits;
      goto LABEL_41;
    }
    if( !p_Core )
      goto LABEL_40;
    v30 = 9 * v23;
    while( 1 )
    {
      if( (__int64)(((unsigned __int64)p_Core->EndingVpn >> 9) | ((unsigned __int64)p_Core->EndingVpnHigh << 23)) >> v30 != v25 )
      {
LABEL_39:
        LOBYTE(v23) = v64;
        goto LABEL_40;
      }
      v31 = p_Core->u1.LongFlags1;
      LODWORD(v31) = v31 & 0x7FFFFFFF;
      v32 = v31 | ((unsigned __int64)p_Core->CommitChargeHigh << 31);
      if( (v32 < 0x7FFFFFFFDi64 || v32 == 0x7FFFFFFFEi64) && (MiVadDeleted(p_Core) == 1 || !MiVadPureReserve(v33)) )
        break;
      if( p_Core == v75 )
      {
        p_Core = v7->Core.NextVad;
        v34 = v7;
        j = v7->Core.NextVad;
        if( v7->Core.NextVad )
        {
          for( i = (_MMVAD_SHORT *)p_Core->ExtraCreateInfo; i; i = (_MMVAD_SHORT *)i->ExtraCreateInfo )
          {
            p_Core = i;
            j = i;
          }
          goto LABEL_38;
        }
        p_Core = (_MMVAD_SHORT *)(v7->Core.VadNode.ParentValue & 0xFFFFFFFFFFFFFFFCui64);
        j = p_Core;
        if( p_Core )
        {
          do
          {
            if( p_Core->ExtraCreateInfo == v34 )
              break;
            v34 = (_MMVAD *)p_Core;
            p_Core = (_MMVAD_SHORT *)(p_Core->VadNode.ParentValue & 0xFFFFFFFFFFFFFFFCui64);
          }
          while( p_Core );
LABEL_37:
          j = p_Core;
        }
      }
      else
      {
        v36 = p_Core->NextVad;
        v37 = p_Core;
        if( p_Core->NextVad )
        {
          ExtraCreateInfo = (_MMVAD_SHORT *)v36->ExtraCreateInfo;
          p_Core = p_Core->NextVad;
          for( j = v36; ExtraCreateInfo; ExtraCreateInfo = (_MMVAD_SHORT *)ExtraCreateInfo->ExtraCreateInfo )
          {
            p_Core = ExtraCreateInfo;
            j = ExtraCreateInfo;
          }
          goto LABEL_38;
        }
        p_Core = (_MMVAD_SHORT *)(p_Core->VadNode.ParentValue & 0xFFFFFFFFFFFFFFFCui64);
        j = p_Core;
        if( p_Core )
        {
          do
          {
            if( p_Core->ExtraCreateInfo == v37 )
              break;
            v37 = p_Core;
            p_Core = (_MMVAD_SHORT *)(p_Core->VadNode.ParentValue & 0xFFFFFFFFFFFFFFFCui64);
          }
          while( p_Core );
          goto LABEL_37;
        }
      }
LABEL_38:
      if( !p_Core )
        goto LABEL_39;
    }
    v39 = DeletedHierarchyBits;
    ++v25;
    LOBYTE(v23) = v64;
    DeletedHierarchyBits->AddressLevels[0] = 0;
LABEL_41:
    if( v39->AddressLevels[1] )
    {
      if( v27 )
      {
        v40 = 9 * v23;
        do
        {
          if( (__int64)(((unsigned __int64)v27->StartingVpn >> 9) | ((unsigned __int64)v27->StartingVpnHigh << 23)) >> v40 != v26 )
            break;
          v41 = v27->u1.LongFlags1;
          LODWORD(v41) = v41 & 0x7FFFFFFF;
          v42 = v41 | ((unsigned __int64)v27->CommitChargeHigh << 31);
          if( (v42 < 0x7FFFFFFFDi64 || v42 == 0x7FFFFFFFEi64) && (MiVadDeleted(v27) == 1 || !MiVadPureReserve(v43)) )
          {
            DeletedHierarchyBits->AddressLevels[1] = 0;
            goto LABEL_70;
          }
          if( v27 == v76 )
          {
            v27 = (_MMVAD_SHORT *)v7->Core.ExtraCreateInfo;
            v44 = v7;
            v67 = v27;
            if( v27 )
            {
              for( k = v27->NextVad; k; k = k->NextVad )
              {
                v27 = k;
                v67 = k;
              }
              continue;
            }
            v27 = (_MMVAD_SHORT *)(v7->Core.VadNode.ParentValue & 0xFFFFFFFFFFFFFFFCui64);
            v67 = v27;
            if( v27 )
            {
              do
              {
                if( (_MMVAD *)v27->NextVad == v44 )
                  break;
                v44 = (_MMVAD *)v27;
                v27 = (_MMVAD_SHORT *)(v27->VadNode.ParentValue & 0xFFFFFFFFFFFFFFFCui64);
              }
              while( v27 );
LABEL_66:
              v67 = v27;
            }
          }
          else
          {
            v46 = (_MMVAD_SHORT **)v27->ExtraCreateInfo;
            v47 = v27;
            if( v46 )
            {
              v27 = (_MMVAD_SHORT *)v27->ExtraCreateInfo;
              v67 = (_MMVAD_SHORT *)v46;
              for( m = *v46; m; m = m->NextVad )
              {
                v27 = m;
                v67 = m;
              }
              continue;
            }
            v27 = (_MMVAD_SHORT *)(v27->VadNode.ParentValue & 0xFFFFFFFFFFFFFFFCui64);
            v67 = v27;
            if( v27 )
            {
              do
              {
                if( v27->NextVad == v47 )
                  break;
                v47 = v27;
                v27 = (_MMVAD_SHORT *)(v27->VadNode.ParentValue & 0xFFFFFFFFFFFFFFFCui64);
              }
              while( v27 );
              goto LABEL_66;
            }
          }
        }
        while( v27 );
      }
    }
    else
    {
LABEL_70:
      v63 = --v26;
    }
    if( v25 > v26 )
      break;
    v49 = v72;
    v50 = v65;
    if( v29 >= v72 && !v65 )
      v70 += v26 - v25 + 1;
    v51 = v69;
    v52 = v25;
    v53 = v70;
    v54 = v74 - 16 * v29;
    v71 = v25;
    do
    {
      if( v50 )
      {
        if( v52 == v25 )
        {
          v55 = MiBitmapRangeZeroEx(v54 + 520, v52, &v71);
          v25 = v71;
          v26 = v63;
          if( v55 == 1 )
          {
            v52 = v71 - 1;
            goto LABEL_99;
          }
          v49 = v72;
        }
        if( !_bittest64(*(const signed __int64 **)(v54 + 528), v52) )
          goto LABEL_99;
        if( v29 >= v49 )
          ++v53;
      }
      _bittestandreset64(*(signed __int64 **)(v54 + 528), v52);
      if( !MiCreateSystemWsles() && (v52 == v26 || (v52 & 7) == 7 || v56) )
      {
        v57 = v52 & 0xFFFFFFFFFFFFFFF8ui64;
        RtlAreBitsClearEx((_RTL_BITMAP_EX *)(v54 + 520), v52 & 0xFFFFFFFFFFFFFFF8ui64, 8ui64);
        v58 = (int)TargetProcess;
        if( v59 != 1 || (TargetProcess->Flags3 & 1) == 0 && v57 == (v73 & 0xFFFFFFFFFFFFFFF8ui64) )
          goto LABEL_93;
        if( v68 )
        {
          ++v51;
LABEL_93:
          v26 = v63;
          v29 = v68;
          goto LABEL_100;
        }
        if( v20 == -1i64 )
        {
          v26 = v63;
          v20 = v52 & 0xFFFFFFFFFFFFFFF8ui64;
          v29 = 0i64;
          v14 = 1i64;
          goto LABEL_100;
        }
        if( v20 + 8 * v14 == v57 )
        {
          v26 = v63;
          ++v14;
          v29 = 0i64;
          goto LABEL_100;
        }
        HalSystemVectorDispatchEntry(
          (_DWORD)TargetProcess + 1664,
          (PKINTERRUPT_ROUTINE **)(v20 << 21),
          (PKINTERRUPT_ROUTINE *)v14);
        v26 = v63;
        v51 += v14;
        v20 = v52 & 0xFFFFFFFFFFFFFFF8ui64;
        v14 = 1i64;
        v29 = 0i64;
      }
LABEL_99:
      v58 = (int)TargetProcess;
LABEL_100:
      v50 = v65;
      ++v52;
      v49 = v72;
    }
    while( v52 <= v26 );
    v70 = v53;
    v27 = v67;
    v69 = v51;
    p_Core = j;
    if( v14 )
    {
      HalSystemVectorDispatchEntry(v58 + 1664, (PKINTERRUPT_ROUTINE **)(v20 << 21), (PKINTERRUPT_ROUTINE *)v14);
      v69 += v14;
      v20 = -1i64;
      v14 = 0i64;
    }
    ++v29;
    v60 = v77;
    LODWORD(v23) = v64 + 1;
    v61 = v78;
    DeletedHierarchyBits->AddressLevels[0] >>= 1;
    DeletedHierarchyBits->AddressLevels[1] >>= 1;
    v73 >>= 9;
    v28 = DeletedHierarchyBits->AddressLevels[0];
    v7 = Vad;
    v26 = v61 >> 9;
    v25 = v60 >> 9;
    v63 = v26;
    v64 = v23;
    v68 = v29;
  }
  while( (int)v23 < 3 );
  v62 = v69;
  if( v69 )
    MiUpdateChargedWsles((INT64)&TargetProcess->Vm);
  if( v70 )
    *(_QWORD *)(v74 + 240) -= v70;
  if( v62 + v70 )
    MiReturnFullProcessCommitment(TargetProcess, v62 + v70);
}

Referenced by:

MiDeleteEmptyPageTableCommit
MiDeletePartialVad
MiDeleteVad