MiBitmapsCachedEntryLengthChanged
VOID __stdcall MiBitmapsCachedEntryLengthChanged(
_MMPAGING_FILE *PagingFile,
_MI_PAGEFILE_BITMAPS_CACHE_ENTRY *CacheEntry,
UINT64 KeyIncreased){
BOOL v3;
_MI_PAGEFILE_BITMAPS_CACHE_ENTRY *v4;
_MI_PAGEFILE_BITMAPS_CACHE_ENTRY *v6;
unsigned __int64 i;
_MI_PAGEFILE_BITMAPS_CACHE_ENTRY *v8;
unsigned int Length;
unsigned int v10;
_MI_PAGEFILE_BITMAPS_CACHE_ENTRY *v11;
unsigned __int64 j;
_RTL_RB_TREE *p_BitmapsCacheLengthTree;
UINT64 Root;
UINT64 v15;
v3 = 0;
v4 = CacheEntry;
if( (_DWORD)KeyIncreased )
{
v6 = (_MI_PAGEFILE_BITMAPS_CACHE_ENTRY *)CacheEntry->LengthTreeNode.Children[1];
if( v6 )
{
v8 = (_MI_PAGEFILE_BITMAPS_CACHE_ENTRY *)v6->LengthTreeNode.Children[0];
if( v6->LengthTreeNode.Children[0] )
{
do
{
v6 = v8;
v8 = (_MI_PAGEFILE_BITMAPS_CACHE_ENTRY *)v8->LengthTreeNode.Children[0];
}
while( v8 );
}
}
else
{
for( i = CacheEntry->LengthTreeNode.ParentValue; ; i = v6->LengthTreeNode.ParentValue )
{
v6 = (_MI_PAGEFILE_BITMAPS_CACHE_ENTRY *)(i & 0xFFFFFFFFFFFFFFFCui64);
if( !v6 || (_MI_PAGEFILE_BITMAPS_CACHE_ENTRY *)v6->LengthTreeNode.Children[0] == CacheEntry )
break;
CacheEntry = v6;
}
}
}
else
{
v6 = (_MI_PAGEFILE_BITMAPS_CACHE_ENTRY *)CacheEntry->LengthTreeNode.Children[0];
v11 = CacheEntry;
if( CacheEntry->LengthTreeNode.Children[0] )
{
for( ; v6->LengthTreeNode.Children[1]; v6 = (_MI_PAGEFILE_BITMAPS_CACHE_ENTRY *)v6->LengthTreeNode.Children[1] )
;
}
else
{
for( j = CacheEntry->LengthTreeNode.ParentValue; ; j = v6->LengthTreeNode.ParentValue )
{
v6 = (_MI_PAGEFILE_BITMAPS_CACHE_ENTRY *)(j & 0xFFFFFFFFFFFFFFFCui64);
if( !v6 || (_MI_PAGEFILE_BITMAPS_CACHE_ENTRY *)v6->LengthTreeNode.Children[1] == v11 )
break;
v11 = v6;
}
}
if( !v6 )
return;
}
Length = v6->Length;
v10 = v4->Length;
if( (_DWORD)KeyIncreased )
{
if( Length > v10 )
return;
}
else if( Length < v10 )
{
return;
}
p_BitmapsCacheLengthTree = &PagingFile->BitmapsCacheLengthTree;
RtlRbRemoveNode((UINT64 *)p_BitmapsCacheLengthTree, (UINT64)v4);
Root = (UINT64)p_BitmapsCacheLengthTree->Root;
if( (p_BitmapsCacheLengthTree->_bf_0 & 1) != 0 )
{
if( Root )
Root ^= (unsigned __int64)p_BitmapsCacheLengthTree;
else
Root = 0i64;
}
if( Root )
{
while( 1 )
{
if( *(_QWORD *)&v4->StartingIndex < *(_QWORD *)(Root + 48) )
{
v15 = *(_QWORD *)Root;
if( (p_BitmapsCacheLengthTree->_bf_0 & 1) != 0 )
{
if( !v15 )
break;
v15 ^= Root;
}
if( !v15 )
break;
}
else
{
v15 = *(_QWORD *)(Root + 8);
if( (p_BitmapsCacheLengthTree->_bf_0 & 1) != 0 )
{
if( !v15 )
goto LABEL_37;
v15 ^= Root;
}
if( !v15 )
{
LABEL_37:
v3 = 1;
break;
}
}
Root = v15;
}
}
RtlRbInsertNodeEx((UINT64 *)p_BitmapsCacheLengthTree, Root, v3, (UINT64)v4);
}Referenced by:
MiInvalidatePageFileBitmapsCache