MiMappedPageWriter
VOID __stdcall MiMappedPageWriter(VOID *StartContext){
_ETHREAD *CurrentThread;
KPRIORITY v3;
VOID **v4;
unsigned int v5;
char *v6;
__int64 v7;
unsigned int v8;
unsigned __int64 v9;
unsigned __int64 v10;
int v11;
_MMMOD_WRITER_MDL_ENTRY *ModWriterEntry;
CHAR v13;
unsigned __int32 v14;
_QWORD *v15;
__int64 *v16;
__int64 v17;
VOID **v18;
VOID *Object[18];
_KWAIT_BLOCK WaitBlockArray;
memset(&Object[1], 0i64, 0x88u);
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v3 = KeSetPriorityThread(&CurrentThread->Tcb, 18);
CurrentThread->SameThreadPassiveFlags |= 2u;
v4 = Object;
v5 = v3;
v6 = (char *)StartContext + 4408;
v7 = 16i64;
do
{
*v4 = v6;
v6 += 24;
++v4;
--v7;
}
while( v7 );
Object[16] = (char *)StartContext + 104;
Object[17] = (char *)StartContext + 792;
KeGetCurrentThread()[1].TrapFrame = (_KTRAP_FRAME *)3;
LABEL_4:
v8 = -1;
LABEL_5:
if( v8 == -1
|| (v9 = *((_QWORD *)StartContext + 936), v10 = *((_QWORD *)StartContext + 950), v9 <= v10)
|| v9 - v10 < 0x10 && !*((_DWORD *)StartContext + 197) )
{
v8 = KeWaitForMultipleObjects(0x12ui64, Object, WaitAny, WrFreePage, 0, 0, 0i64, &WaitBlockArray);
}
while( 1 )
{
while( 1 )
{
v11 = *((_DWORD *)StartContext + 27);
if( !v11 && v8 < 0x10 && *((_QWORD *)StartContext + 5 * v8 + 434) == 0xFFFFFFFFFi64 )
goto LABEL_4;
if( *((_QWORD *)StartContext + 936) == *((_QWORD *)StartContext + 950) )
break;
if( (unsigned __int64)*((unsigned int *)StartContext + 156) >= *((_QWORD *)StartContext + 77) )
ModWriterEntry = 0i64;
else
ModWriterEntry = MiAllocateModWriterEntry((_MI_PARTITION *)StartContext, 0x10ui64, 1ui64);
if( ModWriterEntry )
{
memset(ModWriterEntry, 0i64, sizeof(_MMMOD_WRITER_MDL_ENTRY));
ModWriterEntry->Links.Flink = (_LIST_ENTRY *)97;
ModWriterEntry->Partition = (_MI_PARTITION *)StartContext;
}
else
{
--CurrentThread->Tcb.SpecialApcDisable;
v15 = (char *)StartContext + 632;
v16 = (__int64 *)*((_QWORD *)StartContext + 79);
if( v16 == (__int64 *)((char *)StartContext + 632) )
{
*((_BYTE *)StartContext + 672) = 1;
}
else
{
ModWriterEntry = (_MMMOD_WRITER_MDL_ENTRY *)*((_QWORD *)StartContext + 79);
if( (_QWORD *)v16[1] != v15 )
goto LABEL_41;
v17 = *v16;
if( *(_MMMOD_WRITER_MDL_ENTRY **)(v17 + 8) != ModWriterEntry )
goto LABEL_41;
*v15 = v17;
*(_QWORD *)(v17 + 8) = v15;
}
KiLeaveGuardedRegionUnsafe((__int64)CurrentThread);
}
if( ModWriterEntry )
{
v14 = _InterlockedIncrement((volatile signed __int32 *)StartContext + 156);
if( v14 > *((_DWORD *)StartContext + 157) )
*((_DWORD *)StartContext + 157) = v14;
ModWriterEntry->PointerMdl = 0i64;
if( !MiGatherMappedPages((_MI_PARTITION *)StartContext, v8, ModWriterEntry) )
{
_InterlockedAdd((volatile signed __int32 *)StartContext + 156, 0xFFFFFFFF);
if( (*(_DWORD *)&ModWriterEntry->u1 & 1) != 0 )
{
--CurrentThread->Tcb.SpecialApcDisable;
v18 = (VOID **)*((_QWORD *)StartContext + 80);
if( *v18 != (char *)StartContext + 632 )
LABEL_41:
__fastfail(3u);
ModWriterEntry->Links.Blink = (_LIST_ENTRY *)v18;
ModWriterEntry->Links.Flink = (_LIST_ENTRY *)((char *)StartContext + 632);
*v18 = ModWriterEntry;
*((_QWORD *)StartContext + 80) = ModWriterEntry;
KiLeaveGuardedRegionUnsafe((__int64)CurrentThread);
}
else
{
MiFreeModWriterEntry(ModWriterEntry, 1ui64);
}
}
goto LABEL_5;
}
KeWaitForGate((_KGATE *)((char *)StartContext + 648), WrPageOut, v13);
}
if( !v11 )
goto LABEL_4;
if( !*((_DWORD *)StartContext + 156) )
break;
do
KeDelayExecutionThread(0, 0, (_LARGE_INTEGER *)&Interval);
while( *((_DWORD *)StartContext + 156) );
}
MiDeleteMappedMdls((_MI_PARTITION *)StartContext);
KeSetActualBasePriorityThread(&CurrentThread->Tcb, v5);
}Referenced by:
No references.