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