MiAttemptPageFileReductionApc
VOID __stdcall MiAttemptPageFileReductionApc(VOID *NormalContext, VOID *SystemArgument1, VOID *SystemArgument2){
unsigned int v3;
_MI_PARTITION *v4;
unsigned int NumberOfPagingFiles;
unsigned __int64 v6;
int v7;
unsigned __int64 v8;
__int64 v9;
unsigned __int64 v10;
__int64 v11;
char *v12;
__int64 v13;
int *v14;
__int16 v15;
unsigned __int8 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;
unsigned int LastBackwardRunClear;
unsigned int v28;
int v29;
unsigned __int64 v30;
UINT64 v31;
INT64 *v32;
__int64 v33;
__int64 v34;
unsigned __int64 v35;
__int64 v36;
unsigned __int64 v37;
UINT64 v38;
unsigned __int8 v39;
__int64 v40;
unsigned __int64 v41;
_RTL_BITMAP *v42;
unsigned __int64 v43;
unsigned int v44;
char *v45;
UINT64 StartingRunIndex;
_MI_PARTITION *Partition;
_RTL_BITMAP *v48;
__int64 v49;
__int64 v50;
INT64 *v51;
_RTL_BITMAP *v52;
_RTL_BITMAP BitMapHeader;
_RTL_BITMAP v54;
_KEVENT *Event;
int v56;
Event = (_KEVENT *)NormalContext;
StartingRunIndex = 0i64;
v3 = *((_DWORD *)NormalContext + 8);
v4 = (_MI_PARTITION *)*((_QWORD *)NormalContext + 3);
BitMapHeader = 0i64;
v54 = 0i64;
if( v3 >= 0x10 )
{
if( !MiOkToShrinkPageFiles(v4->Vp.TotalCommittedPages, v4->Vp.TotalCommitLimit) )
goto LABEL_46;
NumberOfPagingFiles = v4->Vp.NumberOfPagingFiles;
v7 = 1;
v49 = 0x8000i64;
v6 = 0x4000i64;
v11 = (((v10 * (unsigned __int128)0xCCCCCCCCCCCCCCCDui64) >> 64) & 0xFFFFFFFFFFFFFFF8ui64) - v9;
NormalContext = Event;
v8 = v11 - 0x8000;
v3 = 0;
}
else
{
v49 = 0i64;
NumberOfPagingFiles = v3 + 1;
v6 = *((unsigned int *)NormalContext + 9);
v7 = 0;
v8 = 0x7FFFFFFFFFFFFFFFi64;
}
v44 = NumberOfPagingFiles;
v56 = v7;
v43 = v6;
if( v3 < NumberOfPagingFiles )
{
v12 = (char *)NormalContext + 4 * v3 + 40;
v13 = 8i64 * v3 + 6944;
v45 = v12;
v50 = v13;
while( 1 )
{
if( v6 > v8 )
goto LABEL_46;
v14 = *(int **)((char *)&v4->Core.PartitionId + v13);
v15 = *((_WORD *)v14 + 102);
if( ((v15 & 0x10) == 0 || !v7)
&& (v15 & 0x40) == 0
&& *(_QWORD *)v14 != *((_QWORD *)v14 + 2)
&& *((_QWORD *)v14 + 3) >= v6 )
{
break;
}
LABEL_41:
v12 += 4;
v13 = v50 + 8;
v45 = v12;
++v3;
v50 += 8i64;
if( v3 >= v44 )
goto LABEL_46;
v7 = v56;
}
v4 = (_MI_PARTITION *)*((_QWORD *)v14 + 31);
Partition = v4;
v51 = (INT64 *)(v14 + 58);
v16 = ExAcquireSpinLockExclusive((INT64 *)v14 + 29);
v17 = *((_QWORD *)v14 + 14);
v18 = *v14;
v19 = v16;
v20 = (_RTL_BITMAP *)(v17 + 8);
v21 = *(const signed __int32 **)(v17 + 16);
v22 = *v14 - 1;
v48 = (_RTL_BITMAP *)(v17 + 8);
v52 = (_RTL_BITMAP *)(v17 + 24);
if( _bittest(v21, v22) == 1 || (v23 = *(const signed __int32 **)(v17 + 32), _bittest(v23, v22) == 1) )
{
v30 = v43;
v31 = 0i64;
v29 = v56;
}
else
{
v24 = *(_QWORD *)v14 - *((_QWORD *)v14 + 2);
if( v8 <= v24 )
v24 = v8;
v25 = (*(_QWORD *)v14 - v24) & 0xFFFFFFFFFFFFFFE0ui64;
v26 = v18 - v25;
v25 >>= 5;
BitMapHeader.SizeOfBitMap = v26;
v54.SizeOfBitMap = v26;
BitMapHeader.Buffer = (unsigned int *)&v21[v25];
v54.Buffer = (unsigned int *)&v23[v25];
LastBackwardRunClear = RtlFindLastBackwardRunClear(&BitMapHeader, v26 - 1, &StartingRunIndex);
if( LastBackwardRunClear <= v24 )
v24 = LastBackwardRunClear;
v28 = RtlFindLastBackwardRunClear(&v54, v26 - 1, (UINT64 *)((char *)&StartingRunIndex + 4));
v29 = v56;
v30 = v43;
v20 = v48;
v31 = v28;
if( v24 <= v28 )
v31 = v24;
v4 = Partition;
if( !v56 )
v31 &= ~(v43 - 1);
}
if( v31 )
{
v33 = *(_QWORD *)v14;
v34 = *((_QWORD *)v14 + 30);
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 + 3) -= v31;
*((_QWORD *)v14 + 6) -= v31;
*(_QWORD *)v14 = v35;
RtlSetBits(v20, (unsigned int)v35, (unsigned int)v31);
RtlSetBits(v52, (unsigned int)v35, (unsigned int)v31);
MiInvalidatePageFileBitmapsCache((_MMPAGING_FILE *)v14, (unsigned int)v35, (unsigned int)v31, 0i64);
ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)v14 + 29);
__writecr8(v19);
v8 -= v31;
if( (v14[51] & 0x10) == 0 )
{
v38 = v31 + v49;
if( !MiChargeCommit(v4, v31 + v49, 2ui64) )
{
v39 = ExAcquireSpinLockExclusive((INT64 *)v14 + 29);
v40 = *((_QWORD *)v14 + 14);
*((_QWORD *)v14 + 3) += v31;
*((_QWORD *)v14 + 6) += v31;
*(_QWORD *)v14 = v31 + v35;
v41 = v39;
v42 = (_RTL_BITMAP *)(v40 + 24);
RtlClearBits((PRTL_BITMAP)(v40 + 8), v35, v31);
RtlClearBits(v42, v35, v31);
if( v35 < (unsigned int)v14[30] )
v14[30] = v35;
MiCoalescePageFileBitmapsCache((_MMPAGING_FILE *)v14, 0i64, (unsigned int)v35);
ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)v14 + 29);
__writecr8(v41);
goto LABEL_46;
}
MiReduceCommitLimits(v4, v31, 0i64);
MiReturnCommit(v4, v38);
}
v12 = v45;
*(_DWORD *)v45 = v35;
goto LABEL_40;
}
}
v32 = v51;
}
else
{
v32 = (INT64 *)(v14 + 58);
}
ExReleaseSpinLockExclusiveFromDpcLevel(v32);
__writecr8(v19);
v12 = v45;
LABEL_40:
v6 = v43;
goto LABEL_41;
}
LABEL_46:
KeSetEvent(Event, 0, 0);
}Referenced by:
No references.