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