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