CcPostWorkQueueAsyncRead

VOID __stdcall CcPostWorkQueueAsyncRead(_WORK_QUEUE_ENTRY *WorkQueueEntry, _LIST_ENTRY *WorkQueue){
  char v2; 
  _EX_PUSH_LOCK *v4; 
  __int64 v6; 
  char v7; 
  _LIST_ENTRY *Blink; 
  UINT8 WorkerThread; 
  _QWORD *v10; 
  _EX_PUSH_LOCK *v11; 
  VOID **PoolWithTag; 
  VOID **v13; 
  _WORK_QUEUE_ENTRY *v14; 
  _WORK_QUEUE_ENTRY **v15; 
  UINT64 NestingLevel; 

  NestingLevel = 0i64;
  v2 = 0;
  v4 = (_EX_PUSH_LOCK *)*((_QWORD *)WorkQueueEntry + 16);
  v6 = *((unsigned int *)WorkQueueEntry + 29);
  if( (xmmword_140CFB490 & 0x20000) != 0 )
    CcPerfLogWorkItemEnqueue(WorkQueue, WorkQueueEntry, 0, 0);
  if( *((_BYTE *)WorkQueueEntry + 120) != 5 )
  {
    if( *(_QWORD *)(16 * v6 + v4[109]._bf_0) == 16 * v6 + v4[109]._bf_0
      && *(_DWORD *)(v4[107]._bf_0 + 4 * v6) < (unsigned int)dword_140C50828 )
    {
      v11 = v4 + 112;
    }
    else
    {
      v11 = v4 + 112;
      ExAcquirePushLockExclusiveEx(v4 + 112, 0i64);
      v14 = (_WORK_QUEUE_ENTRY *)(16 * v6 + v4[109]._bf_0);
      if( *(_WORK_QUEUE_ENTRY **)v14 != v14 || *(_DWORD *)(v4[107]._bf_0 + 4 * v6) >= (unsigned int)dword_140C50828 )
      {
        v15 = (_WORK_QUEUE_ENTRY **)*((_QWORD *)v14 + 1);
        if( *v15 != v14 )
LABEL_27:
          __fastfail(3u);
        *(_QWORD *)WorkQueueEntry = v14;
        v2 = 1;
        *((_QWORD *)WorkQueueEntry + 1) = v15;
        *v15 = WorkQueueEntry;
        *((_QWORD *)v14 + 1) = WorkQueueEntry;
      }
      ExReleasePushLockEx((_DWORD)v4 + 896, 0);
    }
    if( v2 )
      return;
    PoolWithTag = ExAllocatePoolWithTag(0x200ui64, 0x40ui64, 1901552451i64);
    v13 = PoolWithTag;
    if( !PoolWithTag )
    {
      **((_DWORD **)WorkQueueEntry + 9) = -1073741670;
      CcCompleteAsyncRead(WorkQueueEntry);
      CcFreeWorkQueueEntry(WorkQueueEntry);
      return;
    }
    *((_DWORD *)PoolWithTag + 8) = 4;
    PoolWithTag[7] = v4;
    PoolWithTag[6] = WorkQueueEntry;
    *((_DWORD *)PoolWithTag + 9) = v6;
    *PoolWithTag = 0i64;
    PoolWithTag[2] = CcCompleteAsyncReadWorker;
    PoolWithTag[3] = PoolWithTag;
    ExAcquirePushLockExclusiveEx(v11, 0i64);
    *((_DWORD *)v13 + 10) = (*(_DWORD *)(v4[107]._bf_0 + 4 * v6))++;
    if( _InterlockedIncrement64(&v4[121]._bf_0) <= 1 )
      __fastfail(0xEu);
    ExReleasePushLockEx((ULONG_PTR)v11, 0);
    *v13 = 0i64;
    ExQueueWorkItemToPartition(v13);
    v10 = (_QWORD *)NestingLevel;
LABEL_9:
    if( v10 )
    {
      *v10 = 0i64;
      ExQueueWorkItemToPartition(v10);
    }
    return;
  }
  v7 = 0;
  ExAcquirePushLockExclusiveEx(v4 + 112, 0i64);
  Blink = WorkQueue->Blink;
  if( Blink->Flink != WorkQueue )
    goto LABEL_27;
  *((_QWORD *)WorkQueueEntry + 1) = Blink;
  *(_QWORD *)WorkQueueEntry = WorkQueue;
  Blink->Flink = (_LIST_ENTRY *)WorkQueueEntry;
  WorkQueue->Blink = (_LIST_ENTRY *)WorkQueueEntry;
  if( *(_QWORD *)(v4[109]._bf_0 + 16 * v6) == v4[109]._bf_0 + 16 * v6 || *(_DWORD *)(v4[106]._bf_0 + 4 * v6) <= 1u )
    KeSetEvent((PRKEVENT)(v4[110]._bf_0 + 24 * v6), 0, 0);
  else
    v7 = 1;
  ExReleasePushLockEx((_DWORD)v4 + 896, 0);
  if( !v7 )
  {
    WorkerThread = CcShouldSpinAsyncReadWorkerThread((_LIST_ENTRY **)v4, (UINT64)&NestingLevel);
    v10 = (_QWORD *)NestingLevel;
    if( WorkerThread )
    {
      if( !NestingLevel )
        return;
      *(_DWORD *)(v4[111]._bf_0 + 4 * (101 * v6 + *(unsigned int *)(NestingLevel + 40))) = 0;
    }
    goto LABEL_9;
  }
}

Referenced by:

CcAsyncCopyRead
CcAsyncReadWorker