MiZeroLargePageThread

VOID __stdcall MiZeroLargePageThread(VOID *Context){
  INT64 v1; 
  __int64 v2; 
  __int64 v4; 
  int v5; 
  __int64 v6; 
  __int64 v7; 
  unsigned int *v8; 
  unsigned __int8 CurrentIrql; 
  bool v10; 
  __int64 v11; 
  _KSPIN_LOCK_QUEUE *volatile Next; 
  __int64 v13; 
  _QWORD *v14; 
  __int64 v15; 
  UINT8 v16; 
  void *v17; 
  _MI_PARTITION *v18; 
  struct _KPRCB *CurrentPrcb; 
  __int64 v20; 
  _KSPIN_LOCK_QUEUE LockQueue; 
  __int64 v22; 
  _KLOCK_QUEUE_HANDLE LockHandle; 
  void *v24; 
  INT64 v25; 
  __int64 v26; 
  __int64 v27; 

  v1 = *((_QWORD *)Context + 29);
  v22 = 0i64;
  v2 = *((unsigned int *)Context + 66);
  LockQueue = 0i64;
  v4 = *(_QWORD *)(v1 + 72);
  v25 = v1;
  v27 = v4;
  v5 = 1;
  v6 = *(_QWORD *)(v1 + 144) + 40 * v2;
  v7 = *(_QWORD *)(v4 + 16) + 4544i64 * *(unsigned int *)(v1 + 80);
  v26 = v7;
  KeWaitForSingleObject(v1 + 88, 0, 0, 0, 0i64);
  while( 1 )
  {
    MiZeroLargePages((_MI_ZERO_THREAD_CONTEXT *)Context);
    if( *(_BYTE *)(v4 + 6400) == 1 )
      break;
    if( *((_BYTE *)Context + 80) )
    {
      v8 = (unsigned int *)*((_QWORD *)Context + 28);
      memset(&LockHandle, 0, sizeof(LockHandle));
      if( v8 )
      {
        KeAcquireInStackQueuedSpinLock((PKSPIN_LOCK)(qword_140C50AD0 + 4544i64 * v8[46] + 4304), &LockHandle);
        MiDecrementHugeContext(v8);
        KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
        __writecr8(LockHandle.OldIrql);
        *((_QWORD *)Context + 28) = 0i64;
      }
    }
    if( v5 )
      MiSignalZeroingPassComplete((INT64)Context);
    LockQueue.Next = 0i64;
    LockQueue.Lock = (unsigned __int64 *volatile)(v1 + 24);
    CurrentIrql = KeGetCurrentIrql();
    __writecr8(2ui64);
    LOBYTE(v22) = CurrentIrql;
    if( _InterlockedExchange64((volatile __int64 *)(v1 + 24), (__int64)&LockQueue) )
      KxWaitForLockOwnerShip((INT64)&LockQueue);
    if( v5 && !*(_BYTE *)(v1 + 132) )
    {
      *(_BYTE *)(v1 + 132) = 1;
      MiWakeZeroingThreads(v1, 5);
    }
    *(_BYTE *)(v6 + 4) &= ~2u;
    *(_BYTE *)(v6 + 4) |= 4u;
    if( (*(_BYTE *)(v6 + 4) & 1) == 0 )
    {
      *(_BYTE *)(v6 + 4) |= 1u;
      v10 = (*(_DWORD *)(v1 + 164))-- == 1;
      if( v10 )
        *(_BYTE *)(v7 + 4490) = 0;
    }
    v11 = *((_QWORD *)Context + 30);
    *((_QWORD *)Context + 30) = 0i64;
    _m_prefetchw(&LockQueue);
    Next = LockQueue.Next;
    if( !LockQueue.Next )
    {
      if( (_KSPIN_LOCK_QUEUE *)_InterlockedCompareExchange64(
                                  (volatile signed __int64 *)LockQueue.Lock,
                                  0i64,
                                  (signed __int64)&LockQueue) == &LockQueue )
        goto LABEL_16;
      Next = KxWaitForLockChainValid(&LockQueue);
    }
    LockQueue.Next = 0i64;
    _InterlockedXor64((volatile signed __int64 *)&Next->Lock, 1ui64);
LABEL_16:
    __writecr8((unsigned __int8)v22);
    if( v11 )
    {
      v13 = *(_QWORD *)(v11 - 16);
      v14 = (_QWORD *)(v11 - 16);
      v15 = 0i64;
      v24 = 0i64;
      v16 = KeGetCurrentIrql();
      __writecr8(2ui64);
      ExpAcquireSpinLockExclusive((INT64 *)(v13 + 200), v16);
      v10 = v14[1]-- == 1i64;
      if( v10 )
      {
        v17 = v14;
        v24 = v14;
      }
      else
      {
        v17 = 0i64;
      }
      v18 = &Irp;
      if( (_MI_PARTITION *)v13 != &Irp )
      {
        ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)(v13 + 200));
        __writecr8(v16);
        LODWORD(v18) = ExAcquireSpinLockExclusive((INT64 *)&stru_140C50B28 + 12);
        v17 = v24;
        v16 = (unsigned __int8)v18;
      }
      if( !--qword_140C50AE8 )
      {
        v15 = qword_140C50B18;
        qword_140C50B18 = 0i64;
      }
      *(&stru_140C50B28 + 24) = 0;
      CurrentPrcb = KeGetCurrentPrcb();
      if( CurrentPrcb->SchedulerAssist && CurrentPrcb->NestingLevel <= 1u && !(_DWORD)v18 )
        v17 = v24;
      __writecr8(v16);
      if( v15 )
      {
        do
        {
          v20 = *(_QWORD *)v15;
          KeSignalGate((_KGATE *)(v15 + 8), 1i64);
          v15 = v20;
        }
        while( v20 );
        v17 = v24;
      }
      if( v17 )
        ExFreePoolWithTag(v17, 0);
      v7 = v26;
      v1 = v25;
    }
    v4 = v27;
    v5 = 0;
  }
  MiDeleteZeroThreadContext((_MI_ZERO_THREAD_CONTEXT *)Context);
}

Referenced by:

No references.