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.