MiAttemptPageFileReductionApc
VOID __stdcall MiAttemptPageFileReductionApc(PVOID NormalContext, PVOID SystemArgument1, PVOID SystemArgument2){
unsigned int v3;
_MI_PARTITION *v4;
unsigned int v5;
unsigned __int64 v6;
int v7;
unsigned __int64 v8;
__int64 v9;
unsigned __int64 v10;
__int64 v11;
char *v12;
__int64 v13;
INT64 v14;
__int16 v15;
KIRQL v16;
__int64 v17;
int v18;
unsigned __int64 v19;
RTL_BITMAP *v20;
const signed __int32 *v21;
unsigned int v22;
const signed __int32 *v23;
unsigned __int64 v24;
unsigned __int64 v25;
unsigned int v26;
ULONG LastBackwardRunClear;
ULONG v28;
int v29;
unsigned __int64 v30;
UINT64 v31;
INT64 *v32;
__int64 v33;
__int64 v34;
unsigned __int64 v35;
__int64 v36;
unsigned __int64 v37;
UINT64 v38;
KIRQL v39;
__int64 v40;
unsigned __int64 v41;
RTL_BITMAP *v42;
unsigned __int64 v43;
unsigned int v44;
char *v45;
ULONG StartingRunIndex;
ULONG v47;
_MI_PARTITION *Partition;
PRTL_BITMAP v49;
__int64 v50;
__int64 v51;
INT64 *v52;
PRTL_BITMAP v53;
struct _RTL_BITMAP BitMapHeader;
struct _RTL_BITMAP v55;
PRKEVENT Event;
int v57;
Event = (PRKEVENT)NormalContext;
StartingRunIndex = 0;
v47 = 0;
v3 = *((_DWORD *)NormalContext + 8);
v4 = (_MI_PARTITION *)*((_QWORD *)NormalContext + 3);
BitMapHeader = 0i64;
v55 = 0i64;
if( v3 >= 0x10 )
{
if( !(unsigned int)MiOkToShrinkPageFiles(*((_QWORD *)v4 + 933), *((_QWORD *)v4 + 949)) )
goto LABEL_46;
v5 = *((_DWORD *)v4 + 1734);
v7 = 1;
v50 = 0x8000i64;
v6 = 0x4000i64;
v11 = (((v10 * (unsigned __int128)0xCCCCCCCCCCCCCCCDui64) >> 64) & 0xFFFFFFFFFFFFFFF8ui64) - v9;
NormalContext = Event;
v8 = v11 - 0x8000;
v3 = 0;
}
else
{
v50 = 0i64;
v5 = v3 + 1;
v6 = *((unsigned int *)NormalContext + 9);
v7 = 0;
v8 = 0x7FFFFFFFFFFFFFFFi64;
}
v44 = v5;
v57 = v7;
v43 = v6;
if( v3 < v5 )
{
v12 = (char *)NormalContext + 4 * v3 + 40;
v13 = 8i64 * v3 + 6944;
v45 = v12;
v51 = v13;
while( 1 )
{
if( v6 > v8 )
goto LABEL_46;
v14 = *(_QWORD *)((char *)v4 + v13);
v15 = *(_WORD *)(v14 + 204);
if( ((v15 & 0x10) == 0 || !v7)
&& (v15 & 0x40) == 0
&& *(_QWORD *)v14 != *(_QWORD *)(v14 + 16)
&& *(_QWORD *)(v14 + 24) >= v6 )
{
break;
}
LABEL_41:
v12 += 4;
v13 = v51 + 8;
v45 = v12;
++v3;
v51 += 8i64;
if( v3 >= v44 )
goto LABEL_46;
v7 = v57;
}
v4 = *(_MI_PARTITION **)(v14 + 248);
Partition = v4;
v52 = (INT64 *)(v14 + 232);
v16 = ExAcquireSpinLockExclusive((PEX_SPIN_LOCK)(v14 + 232));
v17 = *(_QWORD *)(v14 + 112);
v18 = *(_DWORD *)v14;
v19 = v16;
v20 = (RTL_BITMAP *)(v17 + 8);
v21 = *(const signed __int32 **)(v17 + 16);
v22 = *(_DWORD *)v14 - 1;
v49 = (PRTL_BITMAP)(v17 + 8);
v53 = (PRTL_BITMAP)(v17 + 24);
if( _bittest(v21, v22) == 1 || (v23 = *(const signed __int32 **)(v17 + 32), _bittest(v23, v22) == 1) )
{
v30 = v43;
v31 = 0i64;
v29 = v57;
}
else
{
v24 = *(_QWORD *)v14 - *(_QWORD *)(v14 + 16);
if( v8 <= v24 )
v24 = v8;
v25 = (*(_QWORD *)v14 - v24) & 0xFFFFFFFFFFFFFFE0ui64;
v26 = v18 - v25;
v25 >>= 5;
BitMapHeader.SizeOfBitMap = v26;
v55.SizeOfBitMap = v26;
BitMapHeader.Buffer = (unsigned int *)&v21[v25];
v55.Buffer = (unsigned int *)&v23[v25];
LastBackwardRunClear = RtlFindLastBackwardRunClear(&BitMapHeader, v26 - 1, &StartingRunIndex);
if( LastBackwardRunClear <= v24 )
v24 = LastBackwardRunClear;
v28 = RtlFindLastBackwardRunClear(&v55, v26 - 1, &v47);
v29 = v57;
v30 = v43;
v20 = v49;
v31 = v28;
if( v24 <= v28 )
v31 = v24;
v4 = Partition;
if( !v57 )
v31 &= ~(v43 - 1);
}
if( v31 )
{
v33 = *(_QWORD *)v14;
v34 = *(_QWORD *)(v14 + 240);
v35 = *(_QWORD *)v14 - v31;
if( !v34 )
goto LABEL_36;
do
{
v36 = v34;
v34 = *(_QWORD *)(v34 + 8);
}
while( v34 );
v37 = *(_QWORD *)(v36 - 8);
if( !v37 || v35 > v37 )
goto LABEL_36;
v35 = v37 + 1;
if( v37 + 1 >= v37 )
{
v31 = v33 - v35;
if( !v29 )
{
v31 &= ~(v30 - 1);
v35 = v33 - v31;
}
if( v31 )
{
LABEL_36:
*(_QWORD *)(v14 + 24) -= v31;
*(_QWORD *)(v14 + 48) -= v31;
*(_QWORD *)v14 = v35;
RtlSetBits(v20, (unsigned int)v35, (unsigned int)v31);
RtlSetBits(v53, (unsigned int)v35, (unsigned int)v31);
MiInvalidatePageFileBitmapsCache(v14, (unsigned int)v35, (unsigned int)v31, 0i64);
ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)(v14 + 232));
__writecr8(v19);
v8 -= v31;
if( (*(_BYTE *)(v14 + 204) & 0x10) == 0 )
{
v38 = v31 + v50;
if( !(unsigned int)MiChargeCommit(v4, v31 + v50, 2ui64) )
{
v39 = ExAcquireSpinLockExclusive((PEX_SPIN_LOCK)(v14 + 232));
v40 = *(_QWORD *)(v14 + 112);
*(_QWORD *)(v14 + 24) += v31;
*(_QWORD *)(v14 + 48) += v31;
*(_QWORD *)v14 = v31 + v35;
v41 = v39;
v42 = (RTL_BITMAP *)(v40 + 24);
RtlClearBits((RTL_BITMAP *)(v40 + 8), (unsigned int)v35, (unsigned int)v31);
RtlClearBits(v42, (unsigned int)v35, (unsigned int)v31);
if( v35 < *(unsigned int *)(v14 + 120) )
*(_DWORD *)(v14 + 120) = v35;
MiCoalescePageFileBitmapsCache(v14, 0i64, (unsigned int)v35);
ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)(v14 + 232));
__writecr8(v41);
goto LABEL_46;
}
MiReduceCommitLimits(v4, v31, 0i64);
MiReturnCommit(v4, v38);
}
v12 = v45;
*(_DWORD *)v45 = v35;
goto LABEL_40;
}
}
v32 = v52;
}
else
{
v32 = (INT64 *)(v14 + 232);
}
ExReleaseSpinLockExclusiveFromDpcLevel(v32);
__writecr8(v19);
v12 = v45;
LABEL_40:
v6 = v43;
goto LABEL_41;
}
LABEL_46:
KeSetEvent(Event, 0);
}Referenced by:
No references.