MiZeroInParallelWorker
VOID __stdcall MiZeroInParallelWorker(VOID *Context){
char *v1;
_ETHREAD *CurrentThread;
KPRIORITY v3;
__int64 v4;
__int64 v5;
_MMPTE *v6;
unsigned __int64 v7;
int v8;
_KTBFLUSH_TYPE v9;
UINT64 v10;
int v11;
INT64 *v12;
__int64 v13;
INT64 v14;
UINT64 v15;
unsigned int PfnPageSizeIndex;
unsigned int v17;
unsigned __int64 v18;
unsigned __int64 v19;
_XSTATE_CONFIGURATION *v20;
UINT64 v21;
int v22;
UINT64 Processor;
_MMPTE *v24;
unsigned int a3;
_ETHREAD *v26;
__int64 v27;
__int64 *v28;
_GROUP_AFFINITY Affinity;
INT64 v31[16];
v1 = (char *)Context;
memset(v31, 0i64, sizeof(v31));
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v3 = -1;
v28 = (__int64 *)*((_QWORD *)v1 + 1);
Processor = 0xFFFFFFFF00000000ui64;
v4 = *v28;
v5 = *((unsigned int *)v28 + 4);
a3 = *((_DWORD *)v28 + 3);
v26 = CurrentThread;
if( KeGetCurrentIrql() == 2 || CurrentThread->Win32StartAddress == KiExecuteDpc )
{
CurrentThread = 0i64;
v26 = 0i64;
}
else if( *(_DWORD *)v1 != -1 )
{
v3 = KeSetPriorityThread(&CurrentThread->Tcb, *(_DWORD *)v1);
HIDWORD(Processor) = v3;
}
v6 = 0i64;
v24 = 0i64;
LODWORD(v7) = 0;
v8 = MiCreateUltraThreadContext((INT64)v31, 0i64, 15i64) != 0 ? 0xF : 0;
v22 = v8;
if( (_DWORD)v5 )
{
v10 = 0i64;
v11 = v8;
v12 = (INT64 *)(v4 + 32);
v13 = v5;
v27 = v5;
do
{
if( !*((_DWORD *)v12 - 8) && _InterlockedIncrement((volatile signed __int32 *)v12 - 8) == 1 )
{
if( CurrentThread )
{
Affinity = *(_GROUP_AFFINITY *)(v12 - 3);
LODWORD(Processor) = MiSetIdealProcessorThread(&Affinity);
}
v14 = *v12;
if( (INT64 *)*v12 != v12 )
{
do
{
v15 = 3i64;
if( (*(_QWORD *)(v14 + 40) & 0x1000000000i64) == 0 )
goto LABEL_18;
PfnPageSizeIndex = MiGetPfnPageSizeIndex(v14);
v15 = PfnPageSizeIndex;
if( PfnPageSizeIndex == -1 )
v15 = v17;
if( (unsigned int)v15 < v17 )
v18 = MiLargePageSizes[v15];
else
LABEL_18:
v18 = 1i64;
if( (unsigned int)v15 > 2 || *(unsigned __int8 *)(v14 + 34) >> 6 == a3 )
{
if( v11 )
{
MiZeroWithUltraSpace((INT64)v31, v14);
}
else
{
if( !v6 )
goto LABEL_28;
if( v10 < v18 )
{
MiReleasePtes((_MI_SYSTEM_PTE_TYPE *)((char *)&stru_140C4DB30 + 4432), v6, (unsigned int)v7, v9);
v6 = 0i64;
}
if( v6 )
{
v20 = (_XSTATE_CONFIGURATION *)v24;
}
else
{
LABEL_28:
v19 = *(v12 - 1);
v7 = v18;
if( v19 > 0x4000 )
v19 = 0x4000i64;
if( v19 >= v18 )
v7 = v19;
do
{
v6 = MiReservePtes((_MI_SYSTEM_PTE_TYPE *)((char *)&stru_140C4DB30 + 4432), (unsigned int)v7);
if( v6 )
break;
v7 = (v7 >> 1) & ~(v18 - 1);
}
while( v7 >= v18 );
v20 = (_XSTATE_CONFIGURATION *)v6;
v10 = v7;
v24 = v6;
}
v21 = MiZeroWithSystemPtes(v20, v10, (_MMPFN *)v14);
v10 -= v21;
v24 += v21;
}
}
else
{
MiZeroAndConvertPage((_MI_ZERO_THREAD_CONTEXT *)v14, v15, a3, *((_DWORD *)v28 + 2));
}
v14 = *(_QWORD *)v14;
*(v12 - 1) -= v18;
}
while( (INT64 *)v14 != v12 );
CurrentThread = v26;
v13 = v27;
}
if( CurrentThread && (_DWORD)Processor != -1 )
KeSetIdealProcessorThreadEx((_ETHREAD *)KeGetCurrentThread(), (unsigned int)Processor, 0i64);
}
v12 += 6;
v27 = --v13;
}
while( v13 );
v1 = (char *)Context;
v3 = HIDWORD(Processor);
if( v6 )
MiReleasePtes((_MI_SYSTEM_PTE_TYPE *)((char *)&stru_140C4DB30 + 4432), v6, (unsigned int)v7, v9);
v8 = v22;
}
if( _InterlockedExchangeAdd((volatile signed __int32 *)v1 + 1, 0xFFFFFFFF) == 1 )
KeSignalGate((_KGATE *)(v1 + 16), 1i64);
if( v3 != -1 )
KeSetPriorityThread(&CurrentThread->Tcb, v3);
if( v8 )
MiDeleteUltraThreadContext((INT64)v31);
}Referenced by:
MiZeroInParallel