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.