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.