MiRebuildLargeZeroPage

VOID __stdcall MiRebuildLargeZeroPage(INT64 rcx0){
  unsigned __int64 v1; 
  unsigned __int64 v3; 
  unsigned __int64 v4; 
  unsigned __int64 v5; 
  __int64 v6; 
  unsigned __int64 v7; 
  _QWORD *v8; 
  __int64 v9; 
  unsigned __int64 v10; 
  INT64 v11; 
  __int64 v12; 
  __int64 v13; 
  unsigned __int8 CurrentIrql; 
  __int64 v15; 
  _BYTE *v16; 
  unsigned __int64 v17; 
  _WORD *v18; 
  _KLOCK_QUEUE_HANDLE LockQueue; 

  v1 = 0i64;
  v3 = 0i64;
  memset(&LockQueue, 0, sizeof(LockQueue));
LABEL_2:
  v4 = *(_QWORD *)(rcx0 + 5112);
  v5 = v3;
  v6 = *(_QWORD *)(rcx0 + 5120);
  if( v3 >= v4 )
    v5 = 0i64;
  v7 = v4 - 1;
  while( 1 )
  {
    if( v7 - v5 != -1i64 )
    {
      v8 = (_QWORD *)(v6 + 8 * (v5 >> 6));
      v9 = ((1i64 << (v5 & 0x3F)) - 1) | ~*v8;
      if( v9 == -1 )
      {
        while( (unsigned __int64)++v8 <= v6 + 8 * (v7 >> 6) )
        {
          v9 = ~*v8;
          if( *v8 )
            goto LABEL_7;
        }
      }
      else
      {
LABEL_7:
        _BitScanForward64((unsigned __int64 *)&v9, ~v9);
        v10 = v9 + (((__int64)v8 - v6) >> 3 << 6);
        if( v10 <= v7 && v10 != -1i64 )
        {
          v11 = v10 << 18;
          LODWORD(v12) = MiSearchNumaNodeTable((PVOID)(v10 << 18));
          v13 = *(_QWORD *)(rcx0 + 16) + 4544i64 * *(unsigned int *)(v12 + 8);
          CurrentIrql = KeGetCurrentIrql();
          __writecr8(2ui64);
          LockQueue.LockQueue.Next = 0i64;
          LockQueue.LockQueue.Lock = (unsigned __int64 *volatile)(v13 + 4328);
          KxAcquireQueuedSpinLock(&LockQueue.LockQueue, (UINT64 *)(v13 + 4328));
          _bittestandreset64(*(signed __int64 **)(rcx0 + 5120), v10);
          KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockQueue);
          __writecr8(CurrentIrql);
          v3 = v10 + 1;
          v15 = 512i64;
          v16 = (_BYTE *)(*(_QWORD *)(rcx0 + 5104) + (v10 << 9));
          do
          {
            if( *v16 == 32 )
              MiCoalesceFreeLargePages(rcx0, v11, 2ui64);
            v11 += 512i64;
            ++v16;
            --v15;
          }
          while( v15 );
          goto LABEL_2;
        }
      }
    }
    if( !v5 )
      break;
    v17 = v3 + 1;
    if( v3 + 1 > v4 )
      v17 = *(_QWORD *)(rcx0 + 5112);
    v7 = v17 - 1;
    v5 = 0i64;
  }
  if( _InterlockedExchange((volatile __int32 *)(rcx0 + 5136), 0) )
  {
    v18 = *(_WORD **)(rcx0 + 5128);
    do
    {
      if( *v18 == 512 )
        MiCoalesceFreeLargePages(rcx0, v1, 1ui64);
      ++v18;
      v1 += 0x40000i64;
    }
    while( v1 < 0x1000000000i64 );
  }
}

Referenced by:

MiRebuildLargePagesThread