MiRescanPagefileBitmaps

VOID __stdcall MiRescanPagefileBitmaps(_MMPAGING_FILE *PagingFile){
  unsigned int Length; 
  UINT64 v3; 
  _MI_PAGEFILE_BITMAPS_CACHE_ENTRY *Flink; 
  unsigned int v5; 
  _MI_PAGING_FILE_SPACE_BITMAPS *Bitmaps; 
  unsigned int NextClearRunUlong; 
  _RTL_BITMAP BitMapHeader; 
  UINT64 StartingIndex; 
  _MI_PAGEFILE_BITMAPS_CACHE_ENTRY *MinLengthCacheEntryInOut; 

  Length = 0;
  LODWORD(StartingIndex) = 0;
  *(&BitMapHeader.SizeOfBitMap + 1) = 0;
  MiInitializePagefileBitmapsCache(PagingFile);
  Flink = (_MI_PAGEFILE_BITMAPS_CACHE_ENTRY *)PagingFile->BitmapsCacheFreeList.Flink;
  v5 = 0;
  BitMapHeader.SizeOfBitMap = PagingFile->Size;
  Bitmaps = PagingFile->Bitmaps;
  MinLengthCacheEntryInOut = Flink;
  BitMapHeader.Buffer = Bitmaps->ReservationBitmap.Buffer;
  while( 1 )
  {
    NextClearRunUlong = RtlFindNextClearRunUlong(&BitMapHeader, v5, v3, 0xFFFFFFFFui64, &StartingIndex);
    if( !NextClearRunUlong )
      break;
    v3 = (unsigned int)StartingIndex;
    v5 = StartingIndex + NextClearRunUlong;
    if( NextClearRunUlong > Flink->Length )
    {
      MiRescanPageFileBitmapPortion(
        PagingFile,
        &PagingFile->Bitmaps->AllocationBitmap,
        (unsigned int)StartingIndex,
        NextClearRunUlong,
        &MinLengthCacheEntryInOut);
      Flink = MinLengthCacheEntryInOut;
    }
  }
  if( PagingFile->BitmapsCacheFreeList.Flink == &PagingFile->BitmapsCacheFreeList )
    Length = Flink->Length;
  PagingFile->MaximumRunLengthInBitmaps = Length;
}

Referenced by:

MiFindFreePageFileSpace