MiPfnRangeIsZero

VOID __stdcall MiPfnRangeIsZero(PVOID DeleteVa, PVOID DeleteEndVa){
  unsigned __int64 v2; 
  UINT64 LeafVa; 
  UINT64 v4; 
  UINT64 v5; 
  UINT64 v6; 
  int v7; 
  int v8; 
  _MMPTE *PteBase; 
  __int64 v10; 
  signed __int64 v11; 
  __int64 v12; 
  INT64 v13; 
  unsigned __int64 v14; 
  __int64 v15; 
  _MMPFN *PfnDb; 
  _QWORD *v17; 
  UINT64 v18; 
  struct _KPRCB *CurrentPrcb; 
  __int64 v20; 
  bool v21; 
  signed __int32 v22; 
  __int64 v23; 
  unsigned __int64 v24; 
  __int64 v25; 
  __int64 v26; 
  volatile INT64 *v27; 
  CHAR a2[16]; 
  __int128 v29; 
  int v30; 
  UINT64 v31; 
  __int64 v32; 
  v2 = (unsigned __int64)DeleteEndVa;
  LeafVa = (UINT64)DeleteVa;
  *(_OWORD *)a2 = 0i64;
  if( (unsigned __int64)DeleteEndVa > MmPfnDatabase + (MxPfnAllocation << 12) )
    v2 = MmPfnDatabase + (MxPfnAllocation << 12);
  v29 = 0i64;
  if( (unsigned __int64)DeleteVa >= v2 )
    return;
  v4 = 0i64;
  v5 = 0i64;
  v6 = 0i64;
  v27 = 0i64;
  do
  {
    v7 = MI_IS_PHYSICAL_ADDRESS((PVOID)LeafVa);
    v8 = v7;
    PteBase = MmGetPteBase();
    v10 = 1i64;
    v11 = (signed __int64)PteBase + ((LeafVa >> 9) & 0x7FFFFFFFF8i64);
    v32 = 1i64;
    LODWORD(v12) = 3;
    if( v7 > 0 )
    {
      v25 = (unsigned int)v7;
      do
      {
        LODWORD(v12) = v12 - 1;
        v11 = (signed __int64)PteBase + (((unsigned __int64)v11 >> 9) & 0x7FFFFFFFF8i64);
        --v25;
      }
      while( v25 );
      if( (_DWORD)v12 != 3 )
      {
        v12 = (unsigned int)(v12 - 1);
        v10 = MiLargePageSizes[v12];
        v32 = v10;
      }
    }
    if( (((v10 << 12) - 1) & LeafVa) == 0 && v2 - LeafVa >= v10 << 12 )
    {
      if( (*(_BYTE *)v11 & 0x20) != 0 )
      {
        v23 = 512 - (((unsigned __int64)v11 >> 3) & 0x1FF);
        v24 = (unsigned __int64)PteBase + ((v2 >> 9) & 0x7FFFFFFFF8i64);
        if( v7 > 0 )
        {
          v26 = (unsigned int)v7;
          do
          {
            v24 = (unsigned __int64)PteBase + ((v24 >> 9) & 0x7FFFFFFFF8i64);
            --v26;
          }
          while( v26 );
        }
        if( ((v24 ^ v11) & 0xFFFFFFFFF000i64) == 0 )
          v23 = (__int64)(v24 - v11) >> 3;
        MiClearSystemAccessBits(v11, v23, (unsigned int)v7);
      }
      v30 = v8;
      if( v8 < 4 )
      {
        MiPteInShadowRange((UINT64)&v31);
        while( 1 )
        {
          v13 = MI_READ_PTE_LOCK_FREE(v11);
          v31 = v13;
          v14 = v13;
          if( v8 != v30 && (v13 & 0x20) != 0 )
            MiClearSystemAccessBits(v11, 1i64, 0i64);
          MiPreparePfnDatabasePageForFree(v11, (unsigned int)v8, (unsigned int)v12);
          v4 += v32;
          v15 = 3 * ((v14 >> 12) & 0xFFFFFFFFFi64);
          PfnDb = MmGetPfnDb();
          v17 = (_QWORD *)((char *)PfnDb + 16 * v15);
          *v17 = *(_QWORD *)&a2[8 * (unsigned int)v12];
          *(_QWORD *)&a2[8 * (unsigned int)v12] = v17;
          if( v8 == 3 )
          {
            v27 = (volatile INT64 *)v11;
            v6 = v11;
            if( !v5 )
              v5 = v11;
          }
          else
          {
            v6 = (UINT64)v27;
          }
          MiReplacePfnWithGapMapping((volatile INT64 *)v11, (unsigned int)v8);
          if( (*((_QWORD *)PfnDb + 6 * MiGetContainingPageTable(v11 & 0xFFFFFFFFFFFFF000ui64) + 3) & 0x3FFFFFFFFFFFFFFFi64) != 1 )
            break;
          v32 = 1i64;
          LODWORD(v12) = 3;
          v11 = (signed __int64)MmGetPteBase() + (((unsigned __int64)v11 >> 9) & 0x7FFFFFFFF8i64);
          if( ++v8 >= 4 )
            goto LABEL_16;
        }
        v11 += 8i64;
      }
LABEL_16:
      v18 = v11;
      goto LABEL_17;
    }
    if( !(unsigned int)MiDemoteValidLargePageOneLevel(LeafVa) )
    {
      v18 = v11 + 8;
LABEL_17:
      LeafVa = MiGetLeafVa(v18);
    }
  }
  while( LeafVa < v2 );
  if( v5 )
    MiReplicatePfnDatabaseMappings(v5, v6);
  _InterlockedExchangeAdd64(&qword_140C4ED18, -(__int64)v4);
  MiFreeLargeZeroPages((UINT64)&MiSystemPartition, a2, 0i64);
  MiReturnCommit((_MI_PARTITION *)&MiSystemPartition, v4);
  CurrentPrcb = KeGetCurrentPrcb();
  v20 = *((int *)CurrentPrcb + 8391);
  if( (_DWORD)v20 != -1 )
  {
    if( v4 + v20 <= 0x100 )
    {
      do
      {
        if( v4 >= 0x80000 )
          break;
        v22 = _InterlockedCompareExchange((volatile signed __int32 *)CurrentPrcb + 8391, v20 + v4, v20);
        v21 = (_DWORD)v20 == v22;
        LODWORD(v20) = v22;
        if( v21 )
          return;
      }
      while( v22 != -1 && v4 + v22 <= 0x100 );
    }
    if( (int)v20 > 192
      && (_DWORD)v20 != -1
      && (_DWORD)v20 == _InterlockedCompareExchange((volatile signed __int32 *)CurrentPrcb + 8391, 192, v20) )
    {
      v4 += (int)v20 - 192;
    }
  }
  if( v4 )
    _InterlockedExchangeAdd64(&qword_140C526C0, v4);
}

Referenced by:

MiFreedUnusedPfnPagesWorker