CcQueueLazyWriteScanThread

VOID __stdcall CcQueueLazyWriteScanThread(VOID *StartContext){
  char *v1; 
  unsigned int v3; 
  char v4; 
  NTSTATUS v5; 
  int v6; 
  int v7; 
  signed __int64 v8; 
  unsigned __int64 i; 
  signed __int64 v10; 
  _WORK_QUEUE_ENTRY *v11; 
  __int64 v12; 
  char v13; 
  int v14; 
  int v15; 
  _KLOCK_QUEUE_HANDLE WaitBlockArray; 
  __int64 v17; 
  _WORK_QUEUE_ENTRY *WorkQueueEntry; 
  VOID *Object[6]; 
  _KWAIT_BLOCK v20; 

  v1 = (char *)StartContext + 1000;
  WorkQueueEntry = 0i64;
  v17 = 0i64;
  Object[5] = (char *)StartContext + 1000;
  Object[0] = (char *)StartContext + 376;
  v3 = 0;
  Object[1] = (char *)StartContext + 400;
  v4 = 0;
  Object[2] = (char *)StartContext + 424;
  Object[3] = (char *)StartContext + 448;
  Object[4] = (char *)StartContext + 472;
  *(_OWORD *)&WaitBlockArray.LockQueue.Lock = 0i64;
  while( 1 )
  {
    if( v4 )
      CcDereferencePartition((INT64)StartContext);
    v5 = KeWaitForMultipleObjects(6ui64, Object, WaitAny, WrFreePage, 0, 0, 0i64, &v20);
    if( !v5 )
    {
      v3 = 1;
      goto LABEL_39;
    }
    v6 = v5 - 1;
    if( !v6 )
    {
      v3 = 2;
      goto LABEL_8;
    }
    v7 = v6 - 1;
    if( v7 )
      break;
    v3 = 4;
LABEL_8:
    _m_prefetchw((char *)StartContext + 968);
    v8 = *((_QWORD *)StartContext + 121);
    for( i = v8 + 1; ; i = v8 + 1 )
    {
      if( i <= 1 )
      {
        if( i != 1 )
          __fastfail(0xEu);
        KeWaitForSingleObject((UINT64)v1, 0, 0, 0, 0i64);
        return;
      }
      v10 = v8;
      v8 = _InterlockedCompareExchange64((volatile signed __int64 *)StartContext + 121, i, v8);
      if( v10 == v8 )
        break;
    }
    v4 = 1;
    if( *(&CmpDummyThreadEvent + 720)
      && (_UNKNOWN *)*(&CmpDummyThreadEvent + 386) != (_UNKNOWN *)((char *)&CmpDummyThreadEvent + 3088)
      && StartContext == *(VOID **)(PspSystemPartition + 8) )
    {
      CcNotifyExternalCaches(v3);
    }
    CcAdjustWriteBehindThreadPoolIfNeeded((UINT8)StartContext);
    KeAcquireInStackQueuedSpinLock((PKSPIN_LOCK)StartContext + 16, (PKLOCK_QUEUE_HANDLE)&WaitBlockArray.LockQueue.Lock);
    if( v3 > 2 )
    {
      if( v3 == 4 )
      {
        if( !*((_BYTE *)StartContext + 635) && !*((_BYTE *)StartContext + 634) )
          goto LABEL_16;
LABEL_31:
        KeReleaseInStackQueuedSpinLockFromDpcLevel((PKLOCK_QUEUE_HANDLE)&WaitBlockArray.LockQueue.Lock);
        __writecr8((unsigned __int8)v17);
        continue;
      }
      if( v3 == 8 )
      {
        v13 = *((_BYTE *)StartContext + 634);
LABEL_30:
        if( !v13 )
          goto LABEL_16;
        goto LABEL_31;
      }
    }
    if( *((_BYTE *)StartContext + 636) || *((_BYTE *)StartContext + 637) || *((_BYTE *)StartContext + 638) )
    {
      v13 = 1;
      goto LABEL_30;
    }
LABEL_16:
    CcSetLazyWriteScanQueued((UINT64)StartContext, v3);
    KeReleaseInStackQueuedSpinLockFromDpcLevel((PKLOCK_QUEUE_HANDLE)&WaitBlockArray.LockQueue.Lock);
    __writecr8((unsigned __int8)v17);
    if( (int)CcAllocateWorkQueueEntry((__int64)StartContext, (PSLIST_ENTRY *)&WorkQueueEntry) < 0 )
    {
      ++*(&CmpDummyThreadEvent + 767);
      KeAcquireInStackQueuedSpinLock(
        (PKSPIN_LOCK)StartContext + 16,
        (PKLOCK_QUEUE_HANDLE)&WaitBlockArray.LockQueue.Lock);
      *((_BYTE *)StartContext + 632) = 0;
      CcSetLazyWriteScanQueued((UINT64)StartContext, v3);
      goto LABEL_31;
    }
    v11 = WorkQueueEntry;
    v12 = 224i64;
    *((_BYTE *)WorkQueueEntry + 120) = 3;
    if( v3 != 8 )
      v12 = 256i64;
    *((_DWORD *)v11 + 4) = v3;
    CcPostWorkQueue(v11, (_LIST_ENTRY *)((char *)StartContext + v12));
  }
  v14 = v7 - 1;
  if( !v14 )
  {
    v3 = 8;
    goto LABEL_8;
  }
  v15 = v14 - 1;
  if( !v15 )
  {
    v3 = 16;
    goto LABEL_8;
  }
  if( v15 == 1 )
    return;
LABEL_39:
  if( v3 )
    goto LABEL_8;
}

Referenced by:

No references.