MiModifiedPageWriter
VOID __stdcall MiModifiedPageWriter(VOID *StartContext){
_ETHREAD *CurrentThread;
char *v3;
_KEVENT *v4;
_KEVENT *v5;
_KEVENT *v6;
NTSTATUS v7;
_MMMOD_WRITER_MDL_ENTRY **v8;
unsigned __int64 v9;
unsigned __int64 v10;
unsigned __int64 v11;
int v12;
unsigned int v13;
int v14;
_MMMOD_WRITER_MDL_ENTRY *v15;
_MMMOD_WRITER_MDL_ENTRY *Flink;
unsigned int v17;
int v18;
unsigned int v19;
char *v20;
__int64 v21;
char v22;
unsigned int v23;
__int64 i;
_QWORD *v25;
unsigned int v26;
unsigned int v27;
unsigned __int64 v28;
char *v29;
__int64 v30;
__int64 v31;
unsigned __int8 v32;
char v33;
unsigned __int64 v34;
unsigned int v35;
char *v36;
__int64 v37;
__int64 v38;
unsigned int j;
_QWORD *v40;
signed __int32 v41[8];
INT64 NewBase;
unsigned __int64 v43;
_ETHREAD *v44;
VOID *Object[3];
_KWAIT_BLOCK WaitBlockArray;
VOID *v47[6];
_KWAIT_BLOCK v48;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
*((_QWORD *)StartContext + 118) = CurrentThread;
v44 = CurrentThread;
CurrentThread->SameThreadPassiveFlags |= 2u;
LODWORD(NewBase) = KeSetActualBasePriorityThread(&CurrentThread->Tcb, 18i64);
v3 = (char *)StartContext + 104;
v47[2] = (char *)StartContext + 920;
Object[0] = (char *)StartContext + 104;
v47[0] = (char *)StartContext + 104;
v4 = (_KEVENT *)((char *)StartContext + 880);
Object[1] = (char *)StartContext + 736;
v5 = (_KEVENT *)((char *)StartContext + 696);
v47[1] = (char *)StartContext + 880;
v6 = (_KEVENT *)((char *)StartContext + 1008);
v47[3] = (char *)StartContext + 696;
v47[4] = (char *)StartContext + 1008;
LABEL_2:
*((_QWORD *)StartContext + 105) = 0i64;
*((_DWORD *)StartContext + 212) = 0;
*((_BYTE *)StartContext + 674) = 0;
MiStoreCheckCompleteWriteBatch((INT64)StartContext);
v7 = KeWaitForMultipleObjects(2ui64, Object, WaitAny, WrPageOut, 0, 0, 0i64, &WaitBlockArray);
*((_BYTE *)StartContext + 674) = 1;
if( v7 )
{
while( 1 )
{
if( *((_DWORD *)v3 + 1) )
goto LABEL_68;
if( !*((_QWORD *)StartContext + 950) )
goto LABEL_2;
--CurrentThread->Tcb.SpecialApcDisable;
MiStoreCheckCompleteWriteBatch((INT64)StartContext);
v8 = (_MMMOD_WRITER_MDL_ENTRY **)((char *)StartContext + 904);
if( *v8 == (_MMMOD_WRITER_MDL_ENTRY *)v8 )
{
*((_BYTE *)StartContext + 673) = 1;
KiLeaveGuardedRegionUnsafe((__int64)CurrentThread);
if( !KeWaitForMultipleObjects(5ui64, v47, WaitAny, WrPageOut, 0, 0, 0i64, &v48) )
goto LABEL_68;
--CurrentThread->Tcb.SpecialApcDisable;
*((_BYTE *)StartContext + 673) = 0;
}
if( *((_DWORD *)v5 + 1) )
{
KeResetEvent(v5);
if( *((_DWORD *)StartContext + 173) )
IoBoostThreadIoPriority(CurrentThread, IoPriorityNormal, 0i64);
}
if( *((_DWORD *)v4 + 1) )
{
KeResetEvent(v4);
_InterlockedOr(v41, 0);
v19 = *((_DWORD *)StartContext + 1734);
if( v19 )
{
v20 = (char *)StartContext + 6944;
v21 = v19;
do
{
v22 = *(_BYTE *)(*(_QWORD *)v20 + 206i64);
if( (v22 & 1) != 0 )
{
v23 = 0;
*(_BYTE *)(*(_QWORD *)v20 + 206i64) = v22 & 0xFE;
for( i = *(_QWORD *)v20; v23 < *(_DWORD *)(*(_QWORD *)v20 + 72i64); ++v23 )
{
v25 = *(_QWORD **)(*(_QWORD *)(i + 64) + 8i64 * v23);
if( v25 && *v25 == 2575857425i64 )
MiMakePagefileWriterEntryAvailable(v25);
i = *(_QWORD *)v20;
}
}
v20 += 8;
--v21;
}
while( v21 );
}
}
if( *((_DWORD *)v6 + 1) )
{
KeResetEvent(v6);
MiStoreUpdateMemoryConditions((_MI_PARTITION *)StartContext);
}
v9 = 0i64;
v10 = *((_QWORD *)StartContext + 344);
v11 = *((_QWORD *)StartContext + 950);
if( *((__int64 *)StartContext + 896) >= 0 )
v9 = *((_QWORD *)StartContext + 896);
v43 = *((_QWORD *)StartContext + 344);
if( *((_QWORD *)StartContext + 104) < 0x800ui64 && (v11 > *((_QWORD *)StartContext + 866) >> 2 || v11 > v9 >> 2) )
{
v26 = *((_DWORD *)StartContext + 212);
if( v26 >= 0x40 && *((_DWORD *)StartContext + 210) / v26 < (unsigned int)MaxIoSize >> 3 )
{
v27 = *((_DWORD *)StartContext + 1734);
v28 = 3 * (v11 >> 2);
if( v27 )
{
v29 = (char *)StartContext + 6944;
v30 = v27;
do
{
v31 = *(_QWORD *)v29;
if( (*(_WORD *)(*(_QWORD *)v29 + 204i64) & 0x60) == 0 )
{
if( v10 > v28 )
{
v32 = ExAcquireSpinLockExclusive((INT64 *)(v31 + 232));
v33 = *(_BYTE *)(v31 + 207);
v34 = v32;
if( (v33 & 1) == 0 )
{
*(_BYTE *)(v31 + 207) = v33 | 1;
MiInitializePagefileBitmapsCache((_MMPAGING_FILE *)v31);
*(_DWORD *)(v31 + 124) = MaxIoSize;
}
ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)(v31 + 232));
__writecr8(v34);
}
MiFreeModifiedReservations((_MMPAGING_FILE *)v31, 0i64);
v10 = v43;
}
v29 += 8;
--v30;
}
while( v30 );
CurrentThread = v44;
v8 = (_MMMOD_WRITER_MDL_ENTRY **)((char *)StartContext + 904);
v5 = (_KEVENT *)((char *)StartContext + 696);
v6 = (_KEVENT *)((char *)StartContext + 1008);
v4 = (_KEVENT *)((char *)StartContext + 880);
}
++*((_DWORD *)StartContext + 214);
if( v10 > v28 )
{
*((_QWORD *)StartContext + 108) = KiQueryUnbiasedInterruptTime(1u);
_InterlockedOr(v41, 0);
*((_WORD *)StartContext + 438) |= 1u;
++*((_DWORD *)StartContext + 213);
}
*((_DWORD *)StartContext + 212) = 0;
*((_QWORD *)StartContext + 105) = 0i64;
}
}
if( *v8 == (_MMMOD_WRITER_MDL_ENTRY *)v8 )
break;
v12 = *((_DWORD *)StartContext + 288);
if( (v12 & 1) != 0
&& (v12 & 0xFFFFFFFE) == 0
&& _InterlockedCompareExchange((volatile signed __int32 *)StartContext + 288, 0, 1) == 1 )
{
KiLeaveGuardedRegionUnsafe((__int64)CurrentThread);
KeResetEvent((_KEVENT *)((char *)StartContext + 736));
LABEL_45:
v3 = (char *)StartContext + 104;
goto LABEL_2;
}
if( MiUseLowIoPriorityForModifiedPages((_MI_PARTITION *)StartContext) )
{
if( *((_QWORD *)StartContext + 950) < *((_QWORD *)StartContext + 91) )
{
KiLeaveGuardedRegionUnsafe((__int64)CurrentThread);
goto LABEL_45;
}
*((_DWORD *)StartContext + 180) = 4;
v13 = KeSetActualBasePriorityThread(&CurrentThread->Tcb, 4i64);
v14 = 0;
}
else
{
if( *((_DWORD *)StartContext + 173) )
IoBoostThreadIoPriority(CurrentThread, IoPriorityNormal, 0i64);
v13 = -1;
v14 = 8;
}
v15 = *v8;
Flink = (_MMMOD_WRITER_MDL_ENTRY *)(*v8)->Links.Flink;
if( (_MMMOD_WRITER_MDL_ENTRY **)(*v8)->Links.Blink != v8 || (_MMMOD_WRITER_MDL_ENTRY *)Flink->Links.Blink != v15 )
__fastfail(3u);
*v8 = Flink;
Flink->Links.Blink = (_LIST_ENTRY *)v8;
v17 = *(_DWORD *)&v15->u1 & 0xFFFFFFE3;
v15->Links.Flink = (_LIST_ENTRY *)97;
v15->u1 = (_MODWRITER_FLAGS)(v14 | v17);
KiLeaveGuardedRegionUnsafe((__int64)CurrentThread);
v15->PointerMdl = &v15->Mdl;
MiGatherPagefilePages(v15);
v5 = (_KEVENT *)((char *)StartContext + 696);
v3 = (char *)StartContext + 104;
if( v13 == -1 )
{
v6 = (_KEVENT *)((char *)StartContext + 1008);
}
else
{
KeQueryPriorityThread(CurrentThread);
if( v18 != 18 )
KeSetActualBasePriorityThread(&CurrentThread->Tcb, v13);
*((_DWORD *)StartContext + 180) = 18;
v5 = (_KEVENT *)((char *)StartContext + 696);
v6 = (_KEVENT *)((char *)StartContext + 1008);
LABEL_29:
v3 = (char *)StartContext + 104;
}
}
KiLeaveGuardedRegionUnsafe((__int64)CurrentThread);
goto LABEL_29;
}
LABEL_68:
if( *((_DWORD *)StartContext + 173) )
IoBoostThreadIoPriority(CurrentThread, IoPriorityNormal, 0i64);
ExWaitForRundownProtectionRelease((_EX_RUNDOWN_REF *)StartContext + 119);
v35 = *((_DWORD *)StartContext + 1734);
if( v35 )
{
v36 = (char *)StartContext + 6944;
v37 = v35;
do
{
if( *(_QWORD *)v36 )
{
--CurrentThread->Tcb.SpecialApcDisable;
v38 = *(_QWORD *)v36;
for( j = 0; j < *(_DWORD *)(*(_QWORD *)v36 + 72i64); ++j )
{
v40 = *(_QWORD **)(*(_QWORD *)(v38 + 64) + 8i64 * j);
if( v40 )
{
while( *v40 == 97i64 )
{
*((_BYTE *)StartContext + 673) = 1;
KiLeaveGuardedRegionUnsafe((__int64)CurrentThread);
KeWaitForSingleObject((UINT64)StartContext + 920, 19, 0, 0, 0i64);
--CurrentThread->Tcb.SpecialApcDisable;
}
}
v38 = *(_QWORD *)v36;
}
KiLeaveGuardedRegionUnsafe((__int64)CurrentThread);
}
v36 += 8;
--v37;
}
while( v37 );
}
KeSetActualBasePriorityThread(&CurrentThread->Tcb, (unsigned int)NewBase);
KeSetEvent((PRKEVENT)((char *)StartContext + 760), 0, 0);
}Referenced by:
No references.