MiMappedPageWriter
VOID __stdcall MiMappedPageWriter(PVOID StartContext, CHAR a2){
_ETHREAD *CurrentThread;
KPRIORITY v4;
VOID **p_Object;
int v6;
char *v7;
__int64 v8;
unsigned int v9;
unsigned __int64 v10;
unsigned __int64 v11;
int v12;
_MMMOD_WRITER_MDL_ENTRY *ModWriterEntry;
unsigned __int32 v14;
unsigned int v15;
_QWORD *v16;
__int64 *v17;
__int64 v18;
PVOID *v19;
VOID *Object;
INT64 result[17];
struct _KWAIT_BLOCK WaitBlockArray;
memset((INT64)result, 0i64);
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v4 = KeSetPriorityThread((PKTHREAD)CurrentThread, 18);
*((_DWORD *)CurrentThread + 325) |= 2u;
p_Object = &Object;
v6 = v4;
v7 = (char *)StartContext + 4408;
v8 = 16i64;
do
{
*p_Object = v7;
v7 += 24;
++p_Object;
--v8;
}
while( v8 );
result[15] = (INT64)StartContext + 104;
result[16] = (INT64)StartContext + 792;
*((_QWORD *)KeGetCurrentThread() + 152) = 3i64;
LABEL_4:
v9 = -1;
LABEL_5:
if( v9 == -1
|| (v10 = *((_QWORD *)StartContext + 936), v11 = *((_QWORD *)StartContext + 950), v10 <= v11)
|| v10 - v11 < 0x10 && !*((_DWORD *)StartContext + 197) )
{
KeWaitForMultipleObjects((_BYTE *)0x12, &Object, WaitAny, WrFreePage, 0, 0, 0i64, &WaitBlockArray);
v9 = v15;
}
while( 1 )
{
while( 1 )
{
v12 = *((_DWORD *)StartContext + 27);
if( !v12 && v9 < 0x10 && *((_QWORD *)StartContext + 5 * v9 + 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 = (_MMMOD_WRITER_MDL_ENTRY *)MiAllocateModWriterEntry((__int64)StartContext, 16i64, 1);
if( ModWriterEntry )
{
memset((INT64)ModWriterEntry, 0i64);
*(_QWORD *)ModWriterEntry = 97i64;
*((_QWORD *)ModWriterEntry + 24) = StartContext;
}
else
{
--*((_WORD *)CurrentThread + 243);
v16 = (char *)StartContext + 632;
v17 = (__int64 *)*((_QWORD *)StartContext + 79);
if( v17 == (__int64 *)((char *)StartContext + 632) )
{
*((_BYTE *)StartContext + 672) = 1;
}
else
{
ModWriterEntry = (_MMMOD_WRITER_MDL_ENTRY *)*((_QWORD *)StartContext + 79);
if( (_QWORD *)v17[1] != v16 )
goto LABEL_41;
v18 = *v17;
if( *(_MMMOD_WRITER_MDL_ENTRY **)(v18 + 8) != ModWriterEntry )
goto LABEL_41;
*v16 = v18;
*(_QWORD *)(v18 + 8) = v16;
}
KiLeaveGuardedRegionUnsafe((__int64)CurrentThread);
}
if( ModWriterEntry )
{
v14 = _InterlockedIncrement((volatile signed __int32 *)StartContext + 156);
if( v14 > *((_DWORD *)StartContext + 157) )
*((_DWORD *)StartContext + 157) = v14;
*((_QWORD *)ModWriterEntry + 25) = 0i64;
if( !(unsigned int)MiGatherMappedPages((__int64)StartContext, v9, (__int64)ModWriterEntry) )
{
_InterlockedAdd((volatile signed __int32 *)StartContext + 156, 0xFFFFFFFF);
if( (*((_DWORD *)ModWriterEntry + 10) & 1) != 0 )
{
--*((_WORD *)CurrentThread + 243);
v19 = (PVOID *)*((_QWORD *)StartContext + 80);
if( *v19 != (char *)StartContext + 632 )
LABEL_41:
__fastfail(3u);
*((_QWORD *)ModWriterEntry + 1) = v19;
*(_QWORD *)ModWriterEntry = (char *)StartContext + 632;
*v19 = ModWriterEntry;
*((_QWORD *)StartContext + 80) = ModWriterEntry;
KiLeaveGuardedRegionUnsafe((__int64)CurrentThread);
}
else
{
MiFreeModWriterEntry(ModWriterEntry, 1ui64);
}
}
goto LABEL_5;
}
KeWaitForGate((char *)StartContext + 648, 19);
}
if( !v12 )
goto LABEL_4;
if( !*((_DWORD *)StartContext + 156) )
break;
do
KeDelayExecutionThread(0, 0, (PLARGE_INTEGER)&MiShortTime);
while( *((_DWORD *)StartContext + 156) );
}
MiDeleteMappedMdls((_MI_PARTITION *)StartContext);
KeSetActualBasePriorityThread((__int64)CurrentThread, v6);
}Referenced by:
No references.