IopQueueWorkItemProlog

_IO_WORKITEM *__stdcall IopQueueWorkItemProlog(
        _IO_WORKITEM *IoWorkItem,
        VOID *WorkerRoutine,
        VOID *a3,
        VOID *a4,
        _IO_WORKITEM *a5,
        VOID *Context){
  _IO_WORKITEM *result; 
  VOID **CurrentThread; 
  _ETHREAD *WorkOnBehalfThread; 
  _LIST_ENTRY *Flink; 
  UINT64 DerefThread; 

  LODWORD(DerefThread) = 0;
  if( IopIsActivityTracingEnabled()
    && KeGetCurrentIrql() < 2u
    && (Flink = KeGetCurrentThread()[1].WaitBlock[1].WaitListEntry.Flink) != 0i64 )
  {
    IoWorkItem->ActivityId[0] = (_GUID)*Flink;
  }
  else
  {
    IoWorkItem->ActivityId[0] = 0i64;
  }
  if( (KeGetPcr()->Prcb._bf_0 & 0x10001) == 0 )
  {
    CurrentThread = (VOID **)KeGetCurrentThread();
    WorkOnBehalfThread = PsGetWorkOnBehalfThread(CurrentThread, &DerefThread);
    IoWorkItem->WorkOnBehalfThread = WorkOnBehalfThread;
    if( WorkOnBehalfThread )
    {
      if( !(_DWORD)DerefThread )
        ObfReferenceObjectWithTag(WorkOnBehalfThread, 0x746C6644ui64);
    }
    else if( KeGetCurrentThread()->ApcState.Process->Job || *(&stru_140C23628 + 6120) )
    {
      ObfReferenceObjectWithTag(CurrentThread, 0x746C6644ui64);
      IoWorkItem->WorkOnBehalfThread = (_ETHREAD *)CurrentThread;
    }
  }
  ObfReferenceObjectWithTag(IoWorkItem->IoObject, 0x746C6644ui64);
  IoWorkItem->Routine = (void(__fastcall *)(void *, void *, _IO_WORKITEM *))WorkerRoutine;
  result = IoWorkItem;
  IoWorkItem->Context = a3;
  return result;
}

Referenced by:

No references.