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