MiZeroNodePages
VOID __stdcall MiZeroNodePages(VOID *Context){
INT64 v1;
__int64 v3;
__int64 v4;
unsigned int v5;
__int16 epi16;
__int64 v7;
char *Pool;
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;
CHAR v20;
int v21;
signed __int32 v22[8];
_QWORD *v23;
__int128 *v24;
_DWORD *v25;
unsigned __int64 v26;
PVOID P;
INT64 v28;
__int128 v29;
__int128 v30;
__int128 v31;
_KLOCK_QUEUE_HANDLE LockHandle;
unsigned int v33;
VOID *Handle;
_MI_ZERO_THREAD_CONTEXT *ThreadContext;
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;
v31 = 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;
v28 = *(_QWORD *)(v1 + 16) + 4544 * v4;
v5 = *(unsigned __int16 *)(v28 + 4488);
epi16 = _mm_extract_epi16(*(__m128i *)(v28 + 4472), 4);
v29 = *(_OWORD *)(v28 + 4472);
*((_WORD *)Context + 60) = epi16;
v33 = *(&stru_140C4DB30 + 61);
v7 = v5 / *(&stru_140C4DB30 + 61);
*(_WORD *)Context = 263;
*((_BYTE *)Context + 2) = 6;
*((_DWORD *)Context + 1) = 0;
if( !(_DWORD)v7 )
v7 = 1i64;
*((_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;
Pool = (char *)MiAllocatePool(64i64, 40 * v7, 0x20206D4Dui64);
P = Pool;
v9 = Pool;
if( !Pool )
{
*(_BYTE *)(v1 + 6400) = 1;
LODWORD(v7) = 0;
}
*((_QWORD *)Context + 18) = Pool;
*((_DWORD *)Context + 41) = v7;
v26 = __rdtsc();
_InterlockedOr(v22, 0);
v10 = 0;
if( !(_DWORD)v7 )
goto LABEL_28;
v11 = v9 + 17;
while( 1 )
{
v12 = v29;
v13 = v29;
*(_WORD *)(v11 - 1) = 1;
v11[1] = 6;
*(_DWORD *)(v11 + 3) = 0;
*(_QWORD *)(v11 + 15) = v11 + 7;
*(_QWORD *)(v11 + 7) = v11 + 7;
*(_QWORD *)&v31 = 0i64;
v30 = v13;
if( v12 )
{
v14 = 0i64;
v15 = 0;
*(_QWORD *)&v30 = 0i64;
if( v33 )
{
do
{
v16 = v3;
if( !v12 )
break;
_BitScanForward64(&v17, v12);
v14 |= 1i64 << v17;
*(_QWORD *)&v30 = v14;
if( !v15 )
{
v3 |= v14;
*(_QWORD *)&v31 = v16 | v14;
}
++v15;
v12 &= ~v14;
}
while( v15 < v33 );
*(_QWORD *)&v29 = v12;
}
}
ZeroThreadContext = MiCreateZeroThreadContext((__int64)Context, 1);
ThreadContext = (_MI_ZERO_THREAD_CONTEXT *)ZeroThreadContext;
if( !ZeroThreadContext )
break;
v25 = 0i64;
v19 = v30;
v24 = (__int128 *)(ZeroThreadContext + 35);
v23 = ZeroThreadContext;
*((_DWORD *)ZeroThreadContext + 66) = v10;
*(_OWORD *)(ZeroThreadContext + 35) = v19;
if( (int)PsCreateSystemThreadEx(
(__int64)&Handle,
0x1FFFFF,
0i64,
0i64,
0i64,
MiZeroLargePageThread,
(INT64)v23,
v24,
v25) < 0 )
{
v21 = v7 - v10;
MiDeleteZeroThreadContext(ThreadContext);
goto LABEL_24;
}
ObCloseHandle(Handle, 0);
*((_QWORD *)Context + 14) |= v3;
++v10;
v11 += 40;
v3 = 0i64;
if( v10 >= (unsigned int)v7 )
goto LABEL_17;
}
v21 = v7 - v10;
if( _InterlockedExchangeAdd((volatile signed __int32 *)Context + 32, -v21) == v21 )
KeSignalGate((_KGATE *)Context, 1i64);
LABEL_24:
if( v21 )
{
*(_BYTE *)(v1 + 6400) = 1;
KeAcquireInStackQueuedSpinLock((PKSPIN_LOCK)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, 0);
if( v10 )
KeWaitForGate((_KGATE *)Context, Executive, v20);
_InterlockedOr(v22, 0);
*((_QWORD *)Context + 4) = __rdtsc() - v26;
MiNodeCompletedBootZeroing(v1);
if( *(_BYTE *)(v1 + 6400) == 1 )
{
if( P )
ExFreePoolWithTag(P, 0);
ExFreePoolWithTag(Context, 0);
}
else
{
MiPreserveBootDecisions(v28, (INT64)Context);
*(_BYTE *)(v1 + 6297) = 1;
}
}Referenced by:
No references.