MiZeroNodePages
VOID __stdcall MiZeroNodePages(PVOID Context){
INT64 v1;
__int64 v3;
__int64 v4;
unsigned int v5;
__int16 epi16;
unsigned int v7;
char *v8;
char *v9;
unsigned int v10;
char *v11;
unsigned __int64 v12;
__int128 v13;
__int64 v14;
unsigned __int8 v15;
__int64 v16;
unsigned __int64 v17;
_QWORD *ZeroThreadContext;
__int128 v19;
unsigned int v20;
signed __int32 v21[8];
PVOID StartContext;
GROUP_AFFINITY *GroupAffinity;
UINT64 *v24;
unsigned __int64 v25;
PVOID P;
INT64 v27;
__int128 v28;
__int128 v29;
__int128 v30;
struct _KLOCK_QUEUE_HANDLE LockHandle;
unsigned int v32;
HANDLE Handle;
PVOID v34;
v1 = *((_QWORD *)Context + 9);
*(_QWORD *)&LockHandle.OldIrql = 0i64;
v3 = 0i64;
*((_QWORD *)Context + 3) = 0i64;
*((_WORD *)Context + 44) = 0;
*((_BYTE *)Context + 90) = 6;
*((_DWORD *)Context + 23) = 0;
Handle = 0i64;
LockHandle.LockQueue = 0i64;
v30 = 0i64;
*((_QWORD *)Context + 13) = (char *)Context + 96;
*((_QWORD *)Context + 12) = (char *)Context + 96;
v4 = *((unsigned int *)Context + 20);
*((_QWORD *)Context + 8) = (char *)Context + 56;
*((_QWORD *)Context + 7) = (char *)Context + 56;
v27 = *(_QWORD *)(v1 + 16) + 4544 * v4;
v5 = *(unsigned __int16 *)(v27 + 4488);
epi16 = _mm_extract_epi16(*(__m128i *)(v27 + 4472), 4);
v28 = *(_OWORD *)(v27 + 4472);
*((_WORD *)Context + 60) = epi16;
v32 = dword_140C4DC24;
v7 = v5 / dword_140C4DC24;
*(_WORD *)Context = 263;
*((_BYTE *)Context + 2) = 6;
*((_DWORD *)Context + 1) = 0;
if( !v7 )
v7 = 1;
*((_QWORD *)Context + 2) = (char *)Context + 8;
*((_QWORD *)Context + 1) = (char *)Context + 8;
*((_DWORD *)Context + 32) = v7;
*((_DWORD *)Context + 38) = v7;
*((_DWORD *)Context + 34) = 0;
*((_DWORD *)Context + 39) = v7;
LODWORD(v8) = MiAllocatePool((struct _SLIST_ENTRY *)0x40);
P = v8;
v9 = v8;
if( !v8 )
{
*(_BYTE *)(v1 + 6400) = 1;
v7 = 0;
}
*((_QWORD *)Context + 18) = v8;
*((_DWORD *)Context + 41) = v7;
v25 = __rdtsc();
_InterlockedOr(v21, 0);
v10 = 0;
if( !v7 )
goto LABEL_28;
v11 = v9 + 17;
while( 1 )
{
v12 = v28;
v13 = v28;
*(_WORD *)(v11 - 1) = 1;
v11[1] = 6;
*(_DWORD *)(v11 + 3) = 0;
*(_QWORD *)(v11 + 15) = v11 + 7;
*(_QWORD *)(v11 + 7) = v11 + 7;
*(_QWORD *)&v30 = 0i64;
v29 = v13;
if( v12 )
{
v14 = 0i64;
v15 = 0;
*(_QWORD *)&v29 = 0i64;
if( v32 )
{
do
{
v16 = v3;
if( !v12 )
break;
_BitScanForward64(&v17, v12);
v14 |= 1i64 << v17;
*(_QWORD *)&v29 = v14;
if( !v15 )
{
v3 |= v14;
*(_QWORD *)&v30 = v16 | v14;
}
++v15;
v12 &= ~v14;
}
while( v15 < v32 );
*(_QWORD *)&v28 = v12;
}
}
ZeroThreadContext = MiCreateZeroThreadContext((INT64)Context, 1i64);
v34 = ZeroThreadContext;
if( !ZeroThreadContext )
break;
v24 = 0i64;
v19 = v29;
GroupAffinity = (GROUP_AFFINITY *)(ZeroThreadContext + 35);
StartContext = ZeroThreadContext;
*((_DWORD *)ZeroThreadContext + 66) = v10;
*(_OWORD *)(ZeroThreadContext + 35) = v19;
if( PsCreateSystemThreadEx(
&Handle,
0x1FFFFFui64,
0i64,
0i64,
0i64,
MiZeroLargePageThread,
StartContext,
GroupAffinity,
v24) < 0 )
{
v20 = v7 - v10;
MiDeleteZeroThreadContext(v34);
goto LABEL_24;
}
ObCloseHandle(Handle, 0);
*((_QWORD *)Context + 14) |= v3;
++v10;
v11 += 40;
v3 = 0i64;
if( v10 >= v7 )
goto LABEL_17;
}
v20 = v7 - v10;
if( _InterlockedExchangeAdd((volatile signed __int32 *)Context + 32, -v20) == v20 )
KeSignalGate((_KGATE *)Context, 1i64);
LABEL_24:
if( v20 )
{
*(_BYTE *)(v1 + 6400) = 1;
KeAcquireInStackQueuedSpinLock((UINT64 *)Context + 3, &LockHandle);
MiWakeZeroingThreads((INT64)Context, 1);
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
__writecr8(LockHandle.OldIrql);
}
LABEL_17:
if( v10 )
{
MiZeroPageCalibrate(v1, (INT64)Context);
*((_DWORD *)Context + 40) = MiGetOptimalProcessorWriteCount((unsigned int)v4);
}
else
{
LABEL_28:
MiZeroPageCalibrate(v1, 0i64);
}
KeSetEvent((PRKEVENT)((char *)Context + 88), 0);
if( v10 )
KeWaitForGate(Context, 0);
_InterlockedOr(v21, 0);
*((_QWORD *)Context + 4) = __rdtsc() - v25;
MiNodeCompletedBootZeroing(v1);
if( *(_BYTE *)(v1 + 6400) == 1 )
{
if( P )
ExFreePoolWithTag(P, 0);
ExFreePoolWithTag(Context, 0);
}
else
{
MiPreserveBootDecisions(v27, (UINT16)Context);
*(_BYTE *)(v1 + 6297) = 1;
}
}Referenced by:
No references.