MiInvalidatePageFileBitmapsCache

VOID __fastcall MiInvalidatePageFileBitmapsCache(INT64 a1, UINT64 a2, INT64 a3, UINT64 a4){
  bool v5; 
  int v6; 
  int v8; 
  int v9; 
  unsigned __int64 *v10; 
  INT64 v11; 
  UINT64 *v12; 
  INT64 v13; 
  __int64 v14; 
  int v15; 
  unsigned int v16; 
  __int64 v17; 
  int v18; 
  int v19; 
  int v20; 
  unsigned int v21; 
  unsigned int v22; 
  _QWORD *v23; 
  unsigned __int64 v24; 
  __int64 v25; 
  INT64 v26; 
  unsigned __int64 v27; 
  bool v28; 
  unsigned __int64 v29; 
  INT64 v30; 
  unsigned __int64 v31; 
  unsigned __int64 v32; 
  unsigned int v33; 
  v5 = 0;
  v6 = a3;
  if( a4 )
  {
LABEL_2:
    v8 = *(_DWORD *)(a4 + 48);
    if( v8 == (_DWORD)a2 || (v18 = a2 + v6, v19 = v8 + *(_DWORD *)(a4 + 52), (_DWORD)a2 + v6 == v19) )
    {
      v9 = *(_DWORD *)(a4 + 52) - v6;
      *(_DWORD *)(a4 + 52) = v9;
      if( v8 == (_DWORD)a2 )
        *(_DWORD *)(a4 + 48) = v8 + v6;
      v10 = (unsigned __int64 *)a4;
      if( !v9 )
      {
        RtlRbRemoveNode((unsigned __int64 *)(a1 + 144), a4);
        RtlRbRemoveNode((unsigned __int64 *)(a1 + 160), a4 + 24);
        v11 = a1 + 176;
        v12 = *(UINT64 **)(v11 + 8);
        if( *v12 == v11 )
        {
          *(_QWORD *)a4 = v11;
          *(_QWORD *)(a4 + 8) = v12;
          *v12 = a4;
          *(_QWORD *)(v11 + 8) = a4;
          return;
        }
        goto LABEL_72;
      }
    }
    else
    {
      v20 = v19 - a2;
      v21 = a2 - v8;
      v22 = v20 - v6;
      v23 = (_QWORD *)(a1 + 176);
      v24 = *(_QWORD *)(a1 + 176);
      if( v24 != a1 + 176 )
      {
        if( *(_QWORD **)(v24 + 8) == v23 )
        {
          v25 = *(_QWORD *)v24;
          if( *(_QWORD *)(*(_QWORD *)v24 + 8i64) == v24 )
          {
            *v23 = v25;
            *(_QWORD *)(v25 + 8) = v23;
            *(_DWORD *)(v24 + 52) = v22;
            *(_DWORD *)(v24 + 48) = v18;
            *(_DWORD *)(a4 + 52) = v21;
            MiBitmapsCachedEntryLengthChanged(a1, (unsigned __int64 *)a4, 0);
            v26 = a1 + 144;
            v27 = *(_QWORD *)(a1 + 144);
            if( (*(_BYTE *)(a1 + 152) & 1) != 0 )
            {
              if( v27 )
                v27 ^= v26;
              else
                v27 = 0i64;
            }
            v28 = 0;
            if( v27 )
            {
              while( 1 )
              {
                if( *(_QWORD *)(v24 + 48) < *(_QWORD *)(v27 + 48) )
                {
                  v29 = *(_QWORD *)v27;
                  if( (*(_BYTE *)(a1 + 152) & 1) != 0 )
                  {
                    if( !v29 )
                      goto LABEL_61;
                    v29 ^= v27;
                  }
                  if( !v29 )
                  {
LABEL_61:
                    v28 = 0;
                    break;
                  }
                }
                else
                {
                  v29 = *(_QWORD *)(v27 + 8);
                  if( (*(_BYTE *)(a1 + 152) & 1) != 0 )
                  {
                    if( !v29 )
                      goto LABEL_60;
                    v29 ^= v27;
                  }
                  if( !v29 )
                  {
LABEL_60:
                    v28 = 1;
                    break;
                  }
                }
                v27 = v29;
              }
            }
            RtlRbInsertNodeEx((unsigned __int64 *)v26, v27, v28, v24);
            v30 = a1 + 160;
            v31 = *(_QWORD *)(a1 + 160);
            if( (*(_BYTE *)(a1 + 168) & 1) != 0 )
            {
              if( v31 )
                v31 ^= v30;
              else
                v31 = 0i64;
            }
            if( v31 )
            {
              while( 1 )
              {
                if( *(_DWORD *)(v24 + 48) < *(_DWORD *)(v31 + 24) )
                {
                  v32 = *(_QWORD *)v31;
                  if( (*(_BYTE *)(a1 + 168) & 1) != 0 )
                  {
                    if( !v32 )
                      break;
                    v32 ^= v31;
                  }
                  if( !v32 )
                    break;
                }
                else
                {
                  v32 = *(_QWORD *)(v31 + 8);
                  if( (*(_BYTE *)(a1 + 168) & 1) != 0 )
                  {
                    if( !v32 )
                      goto LABEL_56;
                    v32 ^= v31;
                  }
                  if( !v32 )
                  {
LABEL_56:
                    v5 = 1;
                    break;
                  }
                }
                v31 = v32;
              }
            }
            RtlRbInsertNodeEx((unsigned __int64 *)v30, v31, v5, v24 + 24);
            return;
          }
        }
LABEL_72:
        __fastfail(3u);
      }
      if( v21 <= v22 )
      {
        *(_DWORD *)(a4 + 48) = v18;
        *(_DWORD *)(a4 + 52) = v22;
        v33 = *(_DWORD *)(a1 + 140);
        if( v33 <= v21 )
          v33 = v21;
      }
      else
      {
        *(_DWORD *)(a4 + 52) = v21;
        v33 = *(_DWORD *)(a1 + 140);
        if( v33 <= v22 )
          v33 = v22;
      }
      *(_DWORD *)(a1 + 140) = v33;
      v10 = (unsigned __int64 *)a4;
    }
    MiBitmapsCachedEntryLengthChanged(a1, v10, 0);
    return;
  }
  v13 = a1 + 160;
  v14 = *(_QWORD *)v13;
  if( (*(_BYTE *)(v13 + 8) & 1) != 0 )
  {
    if( v14 )
      v14 ^= v13;
    else
      v14 = 0i64;
  }
  v15 = *(_BYTE *)(v13 + 8) & 1;
  while( v14 )
  {
    v16 = *(_DWORD *)(v14 + 24);
    if( (int)a2 + v6 > v16 )
    {
      if( (unsigned int)a2 < *(_DWORD *)(v14 + 28) + v16 )
      {
        a4 = v14 - 24;
        goto LABEL_2;
      }
      v17 = *(_QWORD *)(v14 + 8);
    }
    else
    {
      v17 = *(_QWORD *)v14;
    }
    if( v15 && v17 )
      v14 ^= v17;
    else
      v14 = v17;
  }
}

Referenced by:

MiAttemptPageFileReductionApc
MiFindFreePageFileSpace
MiGatherPagefilePages