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