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