MiZeroBootLargePages
INT64 __fastcall MiZeroBootLargePages(INT64 a1){
unsigned int v2;
__int64 **StartContext;
int v4;
int v5;
unsigned int v6;
__int64 v7;
__int64 v8;
_QWORD *v9;
__int64 *v10;
NTSTATUS v11;
HANDLE v12;
__int64 *v14;
__int64 *P;
__int64 **p_P;
HANDLE Handle;
GROUP_AFFINITY GroupAffinity;
Handle = 0i64;
GroupAffinity = 0i64;
KeQueryPerformanceCounter(&stru_140C4DC50);
if( !(unsigned int)MiComputeMemoryNodeProcessorAssignments(a1) )
return 3221225473i64;
*(_WORD *)(a1 + 6416) = 0;
*(_DWORD *)(a1 + 6420) = 0;
v2 = (unsigned __int16)KeNumberNodes;
StartContext = &P;
*(_QWORD *)(a1 + 6432) = a1 + 6424;
v4 = 0;
*(_QWORD *)(a1 + 6424) = a1 + 6424;
v5 = 0;
*(_BYTE *)(a1 + 6418) = 6;
*(_DWORD *)(a1 + 6348) = 0;
v6 = 0;
*(_QWORD *)(a1 + 6360) = a1 + 6352;
*(_QWORD *)(a1 + 6352) = a1 + 6352;
p_P = &P;
*(_WORD *)(a1 + 6344) = 263;
*(_BYTE *)(a1 + 6346) = 6;
P = (__int64 *)&P;
if( v2 )
{
while( 1 )
{
GroupAffinity = *(GROUP_AFFINITY *)(4544i64 * v6 + *(_QWORD *)(a1 + 16) + 4472);
LODWORD(v7) = MiAllocatePool((struct _SLIST_ENTRY *)0x40);
v8 = v7;
if( !v7 )
break;
*(_QWORD *)(v7 + 304) = MiAllocateZeroPageDecisionTraceBuffer(a1, v6);
*(_DWORD *)(v8 + 80) = v6;
*(_QWORD *)(v8 + 72) = a1;
v9 = p_P;
if( *p_P != (__int64 *)&P )
LABEL_25:
__fastfail(3u);
*(_QWORD *)(v8 + 8) = p_P;
*(_QWORD *)v8 = &P;
++v5;
++v6;
*v9 = v8;
p_P = (__int64 **)v8;
if( v6 >= v2 )
goto LABEL_6;
}
v4 = -1073741670;
*(_BYTE *)(a1 + 6400) = 1;
LABEL_6:
StartContext = (__int64 **)P;
}
*(_DWORD *)(a1 + 6336) = v5;
*(_DWORD *)(a1 + 6408) = v5;
while( StartContext != &P )
{
if( StartContext[1] != (__int64 *)&P )
goto LABEL_25;
v10 = *StartContext;
if( (__int64 **)(*StartContext)[1] != StartContext )
goto LABEL_25;
P = *StartContext;
v10[1] = (__int64)&P;
*(_OWORD *)StartContext = 0i64;
StartContext[2] = 0i64;
if( v4 < 0 )
{
v12 = 0i64;
Handle = 0i64;
}
else
{
GroupAffinity = *(GROUP_AFFINITY *)(4544i64 * *((unsigned int *)StartContext + 20) + *(_QWORD *)(a1 + 16) + 4472);
v11 = PsCreateSystemThreadEx(
&Handle,
0x1FFFFFui64,
0i64,
0i64,
0i64,
MiZeroNodePages,
StartContext,
&GroupAffinity,
0i64);
v12 = Handle;
v4 = v11;
}
if( v4 < 0 )
{
*(_BYTE *)(a1 + 6400) = 1;
MiNodeCompletedBootZeroing(a1);
MiZeroPageCalibrate(a1, 0i64);
v14 = StartContext[38];
if( v14 )
ExFreePoolWithTag(v14, 0);
ExFreePoolWithTag(StartContext, 0);
}
else
{
ObCloseHandle(v12, 0);
}
StartContext = (__int64 **)P;
}
KeWaitForGate((PVOID)(a1 + 6344), 0);
if( *(_BYTE *)(a1 + 6400) )
return(unsigned int)-1073741823;
return(unsigned int)v4;
}Referenced by:
MiZeroPageThread