MiRescanPageFileBitmapPortion

VOID __stdcall MiRescanPageFileBitmapPortion(
        _MMPAGING_FILE *PagingFile,
        _RTL_BITMAP *BitmapToScan,
        UINT64 StartingIndex,
        UINT64 Length,
        _MI_PAGEFILE_BITMAPS_CACHE_ENTRY **MinLengthCacheEntryInOut){
  unsigned int v5; 
  _MI_PAGEFILE_BITMAPS_CACHE_ENTRY **v6; 
  int v7; 
  unsigned __int64 v9; 
  _MMPAGING_FILE *Flink; 
  NTSTATUS NextClearRunUlong; 
  unsigned int MaximumRunLengthInBitmaps; 
  unsigned int FreeReservationSpace_high; 
  unsigned int v14; 
  unsigned __int64 Size; 
  _MMPAGING_FILE **MaximumSize; 
  _RTL_RB_TREE *p_BitmapsCacheLengthTree; 
  UINT64 Root; 
  BOOL v19; 
  UINT64 v20; 
  _RTL_RB_TREE *p_BitmapsCacheLocationTree; 
  UINT64 v22; 
  BOOL v23; 
  UINT64 v24; 
  unsigned int v25; 
  _RTL_BALANCED_NODE *Min; 
  _RTL_BITMAP BitMapHeader; 
  UINT64 StartingRunIndex; 

  *(&BitMapHeader.SizeOfBitMap + 1) = 0;
  LODWORD(StartingRunIndex) = 0;
  v5 = StartingIndex & 0x1F;
  v6 = MinLengthCacheEntryInOut;
  v7 = StartingIndex - v5;
  v9 = (unsigned __int64)((unsigned int)StartingIndex - v5) >> 5;
  Flink = (_MMPAGING_FILE *)*MinLengthCacheEntryInOut;
  BitMapHeader.Buffer = &BitmapToScan->Buffer[v9];
  BitMapHeader.SizeOfBitMap = v5 + Length;
  while( 1 )
  {
    NextClearRunUlong = RtlFindNextClearRunUlong(&BitMapHeader, v5, v9, 0xFFFFFFFFui64, &StartingRunIndex);
    MaximumRunLengthInBitmaps = NextClearRunUlong;
    if( !NextClearRunUlong )
      break;
    v5 = StartingRunIndex + NextClearRunUlong;
    FreeReservationSpace_high = HIDWORD(Flink->FreeReservationSpace);
    v14 = v7 + StartingRunIndex;
    if( MaximumRunLengthInBitmaps <= FreeReservationSpace_high )
    {
      if( PagingFile->MaximumRunLengthInBitmaps > MaximumRunLengthInBitmaps )
        MaximumRunLengthInBitmaps = PagingFile->MaximumRunLengthInBitmaps;
      PagingFile->MaximumRunLengthInBitmaps = MaximumRunLengthInBitmaps;
    }
    else
    {
      if( FreeReservationSpace_high )
      {
        RtlRbRemoveNode((UINT64 *)&PagingFile->BitmapsCacheLengthTree, (UINT64)Flink);
        RtlRbRemoveNode((UINT64 *)&PagingFile->BitmapsCacheLocationTree, (UINT64)&Flink->FreeSpace);
        v25 = PagingFile->MaximumRunLengthInBitmaps;
        if( v25 <= HIDWORD(Flink->FreeReservationSpace) )
          v25 = HIDWORD(Flink->FreeReservationSpace);
        PagingFile->MaximumRunLengthInBitmaps = v25;
      }
      else
      {
        Size = Flink->Size;
        if( *(_MMPAGING_FILE **)(Flink->Size + 8) != Flink
          || (MaximumSize = (_MMPAGING_FILE **)Flink->MaximumSize, *MaximumSize != Flink) )
        {
          __fastfail(3u);
        }
        *MaximumSize = (_MMPAGING_FILE *)Size;
        *(_QWORD *)(Size + 8) = MaximumSize;
      }
      p_BitmapsCacheLengthTree = &PagingFile->BitmapsCacheLengthTree;
      HIDWORD(Flink->FreeReservationSpace) = MaximumRunLengthInBitmaps;
      LODWORD(Flink->FreeReservationSpace) = v14;
      Root = (UINT64)PagingFile->BitmapsCacheLengthTree.Root;
      if( (PagingFile->BitmapsCacheLengthTree._bf_0 & 1) != 0 && Root )
        Root ^= (unsigned __int64)p_BitmapsCacheLengthTree;
      v19 = 0;
      if( Root )
      {
        while( 1 )
        {
          if( __PAIR64__(MaximumRunLengthInBitmaps, v14) < *(_QWORD *)(Root + 48) )
          {
            v20 = *(_QWORD *)Root;
            if( (PagingFile->BitmapsCacheLengthTree._bf_0 & 1) != 0 )
            {
              if( !v20 )
                break;
              v20 ^= Root;
            }
            if( !v20 )
              break;
          }
          else
          {
            v20 = *(_QWORD *)(Root + 8);
            if( (PagingFile->BitmapsCacheLengthTree._bf_0 & 1) != 0 )
            {
              if( !v20 )
                goto LABEL_22;
              v20 ^= Root;
            }
            if( !v20 )
            {
LABEL_22:
              v19 = 1;
              break;
            }
          }
          Root = v20;
        }
      }
      RtlRbInsertNodeEx((UINT64 *)&PagingFile->BitmapsCacheLengthTree, Root, v19, (UINT64)Flink);
      p_BitmapsCacheLocationTree = &PagingFile->BitmapsCacheLocationTree;
      v22 = (UINT64)PagingFile->BitmapsCacheLocationTree.Root;
      if( (PagingFile->BitmapsCacheLocationTree._bf_0 & 1) != 0 && v22 )
        v22 ^= (unsigned __int64)p_BitmapsCacheLocationTree;
      v23 = 0;
      if( v22 )
      {
        while( 1 )
        {
          if( LODWORD(Flink->FreeReservationSpace) < *(_DWORD *)(v22 + 24) )
          {
            v24 = *(_QWORD *)v22;
            if( (PagingFile->BitmapsCacheLocationTree._bf_0 & 1) != 0 )
            {
              if( !v24 )
                goto LABEL_37;
              v24 ^= v22;
            }
            if( !v24 )
            {
LABEL_37:
              v23 = 0;
              break;
            }
          }
          else
          {
            v24 = *(_QWORD *)(v22 + 8);
            if( (PagingFile->BitmapsCacheLocationTree._bf_0 & 1) != 0 )
            {
              if( !v24 )
                goto LABEL_38;
              v24 ^= v22;
            }
            if( !v24 )
            {
LABEL_38:
              v23 = 1;
              break;
            }
          }
          v22 = v24;
        }
      }
      RtlRbInsertNodeEx((UINT64 *)p_BitmapsCacheLocationTree, v22, v23, (UINT64)&Flink->FreeSpace);
      ++PagingFile->RefreshAllocationCluster;
      Flink = (_MMPAGING_FILE *)PagingFile->BitmapsCacheFreeList.Flink;
      if( Flink == (_MMPAGING_FILE *)&PagingFile->BitmapsCacheFreeList )
      {
        Min = PagingFile->BitmapsCacheLengthTree.Min;
        if( ((unsigned __int8)Min & 1) != 0 )
        {
          if( Min == (_RTL_BALANCED_NODE *)1 )
            Flink = 0i64;
          else
            Flink = (_MMPAGING_FILE *)((unsigned __int64)Min ^ ((unsigned __int64)p_BitmapsCacheLengthTree | 1));
        }
        else
        {
          Flink = (_MMPAGING_FILE *)PagingFile->BitmapsCacheLengthTree.Min;
        }
      }
    }
  }
  *v6 = (_MI_PAGEFILE_BITMAPS_CACHE_ENTRY *)Flink;
}

Referenced by:

MiRescanPagefileBitmaps