CcWorkerThread

CHAR __fastcall CcWorkerThread(__int64 a1, __int64 a2, INT64 a3){
  _QWORD *v3; 
  _LIST_ENTRY *v4; 
  _WORK_QUEUE_ENTRY *NextWorkQueueEntry; 
  __int64 v6; 
  int v7; 
  int v8; 
  _LIST_ENTRY *v9; 
  signed __int64 v10; 
  __int64 v11; 
  unsigned int v12; 
  __int64 v13; 
  _QWORD *v14; 
  _QWORD *v16; 
  __int64 *v17; 
  __int64 v18; 
  _QWORD *v19; 
  _LIST_ENTRY **p_Flink; 
  __int64 **v21; 
  _EXTRA_WORKER_THREAD_ACTION v22; 
  __int64 *v23; 
  __int64 v24; 
  char v25; 
  char v26; 
  int v27; 
  _IO_STATUS_BLOCK IoStatus; 
  int v30; 
  _LIST_ENTRY *v31; 
  __int64 v32; 
  _KLOCK_QUEUE_HANDLE LockHandle; 
  __int64 v34[4]; 
  _WORK_QUEUE_ENTRY *v35; 
  _ETHREAD *CurrentThread; 
  _ETHREAD *v37; 
  __int64 v38[2]; 
  __int64 v39[2]; 

  v3 = (_QWORD *)a1;
  v4 = 0i64;
  NextWorkQueueEntry = 0i64;
  v26 = 0;
  IoStatus.Pointer = 0i64;
  v34[2] = a1;
  memset(&LockHandle, 0, sizeof(LockHandle));
  IoStatus.Information = 0i64;
  v27 = *(_DWORD *)(a1 + 32);
  v30 = v27;
  if( (unsigned int)(v27 - 1) > 1 )
    KeBugCheckEx(0x34u, (PVOID)0x1737, (PVOID)0xFFFFFFFFC0000420i64, 0i64, 0i64);
  v6 = *(_QWORD *)(a1 + 56);
  v34[3] = v6;
  v32 = v6;
  while( 1 )
  {
    v7 = 0;
    v25 = 0;
    KeAcquireInStackQueuedSpinLock((PKSPIN_LOCK)(v6 + 192), &LockHandle);
    if( v26 )
    {
      *(_BYTE *)(v6 + 352) = 0;
      v26 = 0;
      CcReEngageWorkerThreads(v6, *(unsigned int *)(v6 + 360));
    }
    if( IoStatus.Information == 35422 )
    {
      if( *((_BYTE *)NextWorkQueueEntry + 120) == 2 )
        *(_QWORD *)(*((_QWORD *)NextWorkQueueEntry + 2) + 496i64) = NextWorkQueueEntry;
      p_Flink = &v4->Blink->Flink;
      if( *p_Flink != v4 )
        goto LABEL_105;
      *(_QWORD *)NextWorkQueueEntry = v4;
      *((_QWORD *)NextWorkQueueEntry + 1) = p_Flink;
      *p_Flink = (_LIST_ENTRY *)NextWorkQueueEntry;
      v4->Blink = (_LIST_ENTRY *)NextWorkQueueEntry;
      IoStatus.Information = 0i64;
    }
    v8 = v27;
    if( v27 == 2 )
      break;
    while( 1 )
    {
      if( (v7 & 1) != 0 || (v7 |= 1u, v4 = (_LIST_ENTRY *)(v6 + 224), v4->Flink == v4) )
      {
        if( (v7 & 2) != 0 || (v7 |= 2u, v4 = (_LIST_ENTRY *)(v6 + 240), v4->Flink == v4) )
        {
LABEL_11:
          if( (v7 & 4) != 0 )
            goto LABEL_43;
          v7 |= 4u;
          v4 = (_LIST_ENTRY *)(v6 + 256);
          if( v4->Flink == v4 )
            goto LABEL_43;
        }
      }
      v31 = v4;
      if( v8 != 2 || (v8 = v27, *(_DWORD *)(v6 + 960) >= *(_DWORD *)(v6 + 200)) )
      {
        if( v4 == (_LIST_ENTRY *)(v6 + 256) )
          goto LABEL_15;
        if( !*(_DWORD *)(v6 + 356) )
          break;
        if( (unsigned int)(*(_DWORD *)(v6 + 372) + 1) < *(_DWORD *)(v6 + 200) )
          break;
        v8 = v27;
        if( *(_DWORD *)(v6 + 320) )
          break;
      }
LABEL_64:
      if( v8 == 2 )
        goto LABEL_11;
    }
    if( v4 != (_LIST_ENTRY *)(v6 + 256) )
      goto LABEL_16;
LABEL_15:
    v8 = v27;
    if( (unsigned int)(*(_DWORD *)(v6 + 368) + 1) > *(_DWORD *)(v6 + 960) )
      goto LABEL_64;
LABEL_16:
    NextWorkQueueEntry = CcFindNextWorkQueueEntry((_LIST_ENTRY *)v6);
    v34[1] = (__int64)NextWorkQueueEntry;
    v8 = v27;
    if( !NextWorkQueueEntry )
      goto LABEL_64;
    v10 = *(_QWORD *)&KUSER_SHARED_DATA.SystemTime.LowPart;
    if( *(_BYTE *)(v6 + 776)
      && *(__int64 *)&KUSER_SHARED_DATA.SystemTime.LowPart >= *(_QWORD *)(v6 + 768) + (unsigned int)dword_140C50814
      && *(_QWORD *)(v6 + 208) == v6 + 208
      && *(_DWORD *)(v6 + 496)
      && v9->Flink != v9 )
    {
      v21 = (__int64 **)(v6 + 304);
      if( *v21 != (__int64 *)v21 )
      {
        v22 = CcOkToAddWriteBehindThread();
        *(_QWORD *)(v6 + 768) = v10;
        if( *(_DWORD *)(v6 + 320) && v22 == RemoveExtraThread )
          *(_BYTE *)(v6 + 777) = 1;
        if( v22 == AddExtraThread )
        {
          v23 = *v21;
          v24 = **v21;
          if( (__int64 **)(*v21)[1] != v21 || *(__int64 **)(v24 + 8) != v23 )
            goto LABEL_105;
          *v21 = (__int64 *)v24;
          *(_QWORD *)(v24 + 8) = v21;
          ++*(_DWORD *)(v6 + 320);
          if( _InterlockedIncrement64((volatile signed __int64 *)(v6 + 968)) <= 1 )
            __fastfail(0xEu);
          *v23 = 0i64;
          ExQueueWorkItemToPartition(v23);
          v25 = 1;
        }
        v9 = (_LIST_ENTRY *)(v6 + 256);
      }
      v3 = (_QWORD *)a1;
    }
    if( v4 == v9 )
      *(_QWORD *)(v6 + 760) = v10;
    if( *(_DWORD *)(v6 + 960) >= *(_DWORD *)(v6 + 200)
      && v10 >= *(_QWORD *)(v6 + 760) + (unsigned int)dword_140C50814
      && *(_QWORD *)(v6 + 208) == v6 + 208
      && v9->Flink != v9 )
    {
      v16 = (_QWORD *)(v6 + 304);
      v17 = *(__int64 **)(v6 + 304);
      if( v17 != (__int64 *)(v6 + 304) && !*(_DWORD *)(v6 + 320) )
      {
        v18 = *v17;
        if( (_QWORD *)v17[1] != v16 || *(__int64 **)(v18 + 8) != v17 )
          goto LABEL_105;
        *v16 = v18;
        *(_QWORD *)(v18 + 8) = v16;
        ++*(_DWORD *)(v6 + 320);
        if( _InterlockedIncrement64((volatile signed __int64 *)(v6 + 968)) <= 1 )
          __fastfail(0xEu);
        *v17 = 0i64;
        ExQueueWorkItemToPartition(v17);
        *(_QWORD *)(v6 + 760) = v10;
        v25 = 1;
        v9 = (_LIST_ENTRY *)(v6 + 256);
      }
    }
    if( v4 == v9 || (v11 = 372i64, v4 == (_LIST_ENTRY *)(v6 + 288)) )
      v11 = 368i64;
    _InterlockedAdd((volatile signed __int32 *)(v32 + v11), 1u);
    KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
    __writecr8(LockHandle.OldIrql);
    if( (xmmword_140CFB490 & 0x20000) != 0 )
    {
      if( v25 )
        CcLogExtraWBThreadAction((_EXTRA_WORKER_THREAD_ACTION)v6);
      if( (xmmword_140CFB490 & 0x20000) != 0 )
      {
        v34[0] = (__int64)NextWorkQueueEntry;
        v38[0] = (__int64)v34;
        v38[1] = 8i64;
        EtwTraceKernelEvent((__int64)v38, 1u, 0x80020000, 0x1601u, 0x401902u);
      }
    }
    switch( *((_BYTE *)NextWorkQueueEntry + 120) )
    {
      case 1:
        CcPerformReadAhead(NextWorkQueueEntry, *((_FILE_OBJECT **)NextWorkQueueEntry + 2));
        break;
      case 2:
        CurrentThread = (_ETHREAD *)KeGetCurrentThread();
        CurrentThread->SameThreadPassiveFlags |= 2u;
        v12 = 0;
        do
        {
          IoStatus.Information = (unsigned __int64)NextWorkQueueEntry;
          CcWriteBehind(*((_SHARED_CACHE_MAP **)NextWorkQueueEntry + 2), &IoStatus);
          if( v12 >= 0xA )
            break;
          ++v12;
        }
        while( IoStatus.Information == 35422 );
        v37 = (_ETHREAD *)KeGetCurrentThread();
        v37->SameThreadPassiveFlags &= ~2u;
        break;
      case 3:
        CcLazyWriteScan((_WORK_QUEUE_ENTRY *)v6, (UINT64)NextWorkQueueEntry);
        break;
      case 4:
        KeSetEvent(*((PRKEVENT *)NextWorkQueueEntry + 2), 0, 0);
        v26 = 1;
        break;
    }
    if( v4 == (_LIST_ENTRY *)(v6 + 256) || (v13 = 372i64, v4 == (_LIST_ENTRY *)(v6 + 288)) )
      v13 = 368i64;
    _InterlockedAdd((volatile signed __int32 *)(v32 + v13), 0xFFFFFFFF);
    if( IoStatus.Information == 35422 )
    {
      if( (xmmword_140CFB490 & 0x20000) != 0 )
        CcPerfLogWorkItemEnqueue(v4, NextWorkQueueEntry, 1u, 0);
    }
    else
    {
      if( (xmmword_140CFB490 & 0x20000) != 0 )
      {
        v35 = NextWorkQueueEntry;
        v39[0] = (__int64)&v35;
        v39[1] = 8i64;
        EtwTraceKernelEvent((__int64)v39, 1u, 0x80020000, 0x1602u, 0x401902u);
      }
      CcFreeWorkQueueEntry(NextWorkQueueEntry);
    }
  }
  if( !*(_BYTE *)(v6 + 777) )
    goto LABEL_64;
  *(_BYTE *)(v6 + 777) = 0;
LABEL_43:
  if( v8 == 2 )
  {
    v19 = *(_QWORD **)(v6 + 312);
    if( *v19 == v6 + 304 )
    {
      *v3 = v6 + 304;
      v3[1] = v19;
      *v19 = v3;
      *(_QWORD *)(v6 + 312) = v3;
      --*(_DWORD *)(v6 + 320);
      goto LABEL_46;
    }
LABEL_105:
    __fastfail(3u);
  }
  v14 = *(_QWORD **)(v6 + 216);
  if( *v14 != v6 + 208 )
    goto LABEL_105;
  *v3 = v6 + 208;
  v3[1] = v14;
  *v14 = v3;
  *(_QWORD *)(v6 + 216) = v3;
  --*(_DWORD *)(v6 + 204);
LABEL_46:
  if( *(_BYTE *)(v6 + 776) && !*(_DWORD *)(v6 + 320) && *(_DWORD *)(v6 + 204) <= 1u )
  {
    *(_BYTE *)(v6 + 776) = 0;
    memset(*(VOID **)(v6 + 720), 0i64, 8 * (*(_DWORD *)(v6 + 324) + 1));
  }
  KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
  __writecr8(LockHandle.OldIrql);
  if( (xmmword_140CFB490 & 0x20000) != 0 && v27 == 2 )
    CcLogExtraWBThreadAction((_EXTRA_WORKER_THREAD_ACTION)v6);
  return CcDereferencePartition(v6);
}

Referenced by:

No references.