ExpTryQueueWorkItem
CHAR __stdcall ExpTryQueueWorkItem(INT64 a1, _WORK_QUEUE_ITEM *a2, INT64 a3, INT64 a4){
unsigned int v5;
CHAR v6;
__int64 CurrentIrql;
unsigned int v8;
unsigned __int16 NextNode;
INT64 v10;
char v11;
INT64 v12;
CHAR v13;
char LookupIndex[12];
int v16;
v16 = a4;
*(_DWORD *)LookupIndex = 0;
v5 = a3;
v6 = 0;
ExpValidateWorkItem(a2, (_WORK_QUEUE_TYPE)a3);
ExpTypeToPriority(v5);
CurrentIrql = KeGetCurrentIrql();
*(_QWORD *)&LookupIndex[4] = CurrentIrql;
__writecr8(2ui64);
v8 = KeGetCurrentPrcb()->ParentNode->Affinity.Reserved[0];
NextNode = v8;
if( (unsigned __int16)v8 < (unsigned __int16)KeNumberNodes )
{
while( 1 )
{
v10 = KeNodeBlock[NextNode];
if( (_UNKNOWN *)v10 == (_UNKNOWN *)((char *)&KiNodeInit + 384 * NextNode) )
v10 = 0i64;
ExpIsPoolReadyForWork((_BYTE *)a1, (_EXQUEUEINDEX)v10);
if( v11 )
{
v12 = *(_QWORD *)(*(_QWORD *)(*(_QWORD *)(a1 + 8) + 8i64 * *(unsigned __int16 *)(v10 + 146)) + 8i64 * v16);
if( (v12 & 1) != 0 )
v12 = 0i64;
KeInsertPriQueue();
v6 = v13;
if( v13 )
{
LABEL_8:
LOBYTE(CurrentIrql) = LookupIndex[4];
break;
}
*(_DWORD *)(v12 + 716) |= 0x80000000;
ExpPartitionCreateThreadIfNecessary(a1, v10, v12);
}
NextNode = MmGetNextNode(v8, (UINT64 *)LookupIndex);
if( NextNode >= (unsigned __int16)KeNumberNodes )
goto LABEL_8;
}
}
__writecr8((unsigned __int8)CurrentIrql);
return v6;
}Referenced by:
ExTryQueueWorkItem