IopQueueWorkItemProlog

INT64 __fastcall IopQueueWorkItemProlog(INT64 a1, INT64 a2, INT64 a3){
  INT64 result; 
  _ETHREAD *CurrentThread; 
  void *WorkOnBehalfThread; 
  _OWORD *v9; 
  int v10; 
  v10 = 0;
  if( IopIsActivityTracingEnabled()
    && KeGetCurrentIrql() < 2u
    && (v9 = (_OWORD *)*((_QWORD *)KeGetCurrentThread() + 180)) != 0i64 )
  {
    *(_OWORD *)(a1 + 68) = *v9;
  }
  else
  {
    *(_OWORD *)(a1 + 68) = 0i64;
  }
  if( (*((_DWORD *)KeGetPcr() + 3243) & 0x10001) == 0 )
  {
    CurrentThread = (_ETHREAD *)KeGetCurrentThread();
    WorkOnBehalfThread = (void *)PsGetWorkOnBehalfThread((__int64)CurrentThread, &v10);
    *(_QWORD *)(a1 + 56) = WorkOnBehalfThread;
    if( WorkOnBehalfThread )
    {
      if( !v10 )
        ObfReferenceObjectWithTag(WorkOnBehalfThread, 0x746C6644u);
    }
    else if( *(_QWORD *)(*((_QWORD *)KeGetCurrentThread() + 23) + 1296i64) || PopEnergyEstimationEnabled )
    {
      ObfReferenceObjectWithTag(CurrentThread, 0x746C6644u);
      *(_QWORD *)(a1 + 56) = CurrentThread;
    }
  }
  ObfReferenceObjectWithTag(*(PVOID *)(a1 + 40), 0x746C6644u);
  *(_QWORD *)(a1 + 32) = a2;
  result = a1;
  *(_QWORD *)(a1 + 48) = a3;
  return result;
}

Referenced by:

IoQueueWorkItem
IoQueueWorkItemEx
IoQueueWorkItemToNode
IoTryQueueWorkItem
PnpDeviceCompletionRequestDestroy