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