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