CcPostWorkQueueAsyncRead

NTSTATUS __stdcall CcPostWorkQueueAsyncRead(PSLIST_ENTRY ListEntry){
  _LIST_ENTRY *v1; 
  char v2; 
  _LIST_ENTRY *v3; 
  _SLIST_ENTRY *Next; 
  __int64 Next_high; 
  char v7; 
  PSLIST_ENTRY *Blink; 
  __int64 v9; 
  _QWORD *v10; 
  UINT64 v11; 
  _QWORD *PoolWithTag; 
  _DWORD *v13; 
  __int64 v14; 
  PSLIST_ENTRY *v15; 
  ULONG_PTR BugCheckParameter2; 
  BugCheckParameter2 = 0i64;
  v2 = 0;
  v3 = v1;
  Next = ListEntry[8].Next;
  Next_high = HIDWORD(ListEntry[7].Next);
  if( (*(_DWORD *)(&PerfGlobalGroupMask + 2) & 0x20000) != 0 )
    CcPerfLogWorkItemEnqueue(v1, (_WORK_QUEUE_ENTRY *)ListEntry, 0, 0);
  if( *((_BYTE *)&ListEntry[7].Next + 8) != 5 )
  {
    if( *(_QWORD *)(16 * Next_high + *((_QWORD *)&Next[54].Next + 1)) == 16 * Next_high
                                                                        + *((_QWORD *)&Next[54].Next + 1)
      && (LODWORD(v9) = CcMaxNumberCompleteAsyncReadExWorkItems,
          *(_DWORD *)(*((_QWORD *)&Next[53].Next + 1) + 4 * Next_high) < (unsigned int)CcMaxNumberCompleteAsyncReadExWorkItems) )
    {
      v11 = (UINT64)&Next[56];
    }
    else
    {
      v11 = (UINT64)&Next[56];
      ExAcquirePushLockExclusiveEx((UINT64)&Next[56], 0i64);
      v14 = 16 * Next_high + *((_QWORD *)&Next[54].Next + 1);
      if( *(_QWORD *)v14 != v14
        || *(_DWORD *)(*((_QWORD *)&Next[53].Next + 1) + 4 * Next_high) >= (unsigned int)CcMaxNumberCompleteAsyncReadExWorkItems )
      {
        v15 = *(PSLIST_ENTRY **)(v14 + 8);
        if( *v15 != (PSLIST_ENTRY)v14 )
LABEL_27:
          __fastfail(3u);
        ListEntry->Next = (_SLIST_ENTRY *)v14;
        v2 = 1;
        *((_QWORD *)&ListEntry->Next + 1) = v15;
        *v15 = ListEntry;
        *(_QWORD *)(v14 + 8) = ListEntry;
      }
      ExReleasePushLockEx((UINT64)&Next[56], 0i64);
    }
    if( v2 )
      return v9;
    PoolWithTag = ExAllocatePoolWithTag(NonPagedPoolNx, 0x40ui64, 0x71576343ui64);
    v13 = PoolWithTag;
    if( !PoolWithTag )
    {
      **((_DWORD **)&ListEntry[4].Next + 1) = -1073741670;
      CcCompleteAsyncRead((INT64)ListEntry);
      LOBYTE(v9) = CcFreeWorkQueueEntry((INT64)ListEntry);
      return v9;
    }
    *((_DWORD *)PoolWithTag + 8) = 4;
    PoolWithTag[7] = Next;
    PoolWithTag[6] = ListEntry;
    *((_DWORD *)PoolWithTag + 9) = Next_high;
    *PoolWithTag = 0i64;
    PoolWithTag[2] = CcCompleteAsyncReadWorker;
    PoolWithTag[3] = PoolWithTag;
    ExAcquirePushLockExclusiveEx(v11, 0i64);
    v13[10] = (*(_DWORD *)(*((_QWORD *)&Next[53].Next + 1) + 4 * Next_high))++;
    if( _InterlockedIncrement64((volatile signed __int64 *)&Next[60].Next + 1) <= 1 )
      __fastfail(0xEu);
    ExReleasePushLockEx(v11, 0i64);
    *(_QWORD *)v13 = 0i64;
    LODWORD(v9) = ExQueueWorkItemToPartition(v13);
    v10 = (_QWORD *)BugCheckParameter2;
    goto LABEL_9;
  }
  v7 = 0;
  ExAcquirePushLockExclusiveEx((UINT64)&Next[56], 0i64);
  Blink = (PSLIST_ENTRY *)v3->Blink;
  if( *Blink != (PSLIST_ENTRY)v3 )
    goto LABEL_27;
  *((_QWORD *)&ListEntry->Next + 1) = Blink;
  ListEntry->Next = (_SLIST_ENTRY *)v3;
  *Blink = ListEntry;
  v3->Blink = (_LIST_ENTRY *)ListEntry;
  if( *(_QWORD *)(*((_QWORD *)&Next[54].Next + 1) + 16 * Next_high) == *((_QWORD *)&Next[54].Next + 1) + 16 * Next_high
    || *((_DWORD *)&Next[53].Next->Next + Next_high) <= 1u )
  {
    KeSetEvent((PRKEVENT)Next[55].Next + Next_high, 0);
  }
  else
  {
    v7 = 1;
  }
  ExReleasePushLockEx((UINT64)&Next[56], 0i64);
  if( !v7 )
  {
    LOBYTE(v9) = CcShouldSpinAsyncReadWorkerThread((LIST_ENTRY **)Next, (UINT64)&BugCheckParameter2);
    v10 = (_QWORD *)BugCheckParameter2;
    if( (_BYTE)v9 )
    {
      if( !BugCheckParameter2 )
        return v9;
      v9 = *((_QWORD *)&Next[55].Next + 1);
      *(_DWORD *)(v9 + 4 * (101 * Next_high + *(unsigned int *)(BugCheckParameter2 + 40))) = 0;
    }
LABEL_9:
    if( v10 )
    {
      *v10 = 0i64;
      LODWORD(v9) = ExQueueWorkItemToPartition(v10);
    }
  }
  return v9;
}

Referenced by:

CcAsyncCopyRead
CcAsyncReadWorker