EtwpQueueNotification
NTSTATUS __stdcall EtwpQueueNotification(
_EPROCESS *Process,
_ETWP_NOTIFICATION_HEADER *DataBlock,
_ETW_REG_ENTRY *RegEntry){
NTSTATUS v3;
__int64 v5;
char v8;
VOID **v9;
VOID **PoolWithTag;
_ETW_QUEUE_ENTRY *v11;
_ETHREAD *CurrentThread;
_LIST_ENTRY *v13;
VOID **v14;
_ETW_QUEUE_ENTRY **v15;
_KEVENT *v16;
_ETW_REG_ENTRY *ReplyHandle;
unsigned int v19;
bool v20;
v3 = 0;
v5 = RegEntry->Flags & 0x100;
v8 = 1;
v20 = (RegEntry->Flags & 0x100) != 0;
v9 = EtwpAddDataSource((__int64)Process);
if( !v9 )
return -1073741801;
PoolWithTag = ExAllocatePoolWithTag(0x200ui64, 0x38ui64, 1920431173i64);
v11 = (_ETW_QUEUE_ENTRY *)PoolWithTag;
if( !PoolWithTag )
return -1073741801;
*(_OWORD *)PoolWithTag = 0i64;
*((_OWORD *)PoolWithTag + 1) = 0i64;
*((_OWORD *)PoolWithTag + 2) = 0i64;
PoolWithTag[6] = 0i64;
PoolWithTag[2] = DataBlock;
PoolWithTag[3] = RegEntry;
*((_WORD *)PoolWithTag + 24) = RegEntry->Index;
*((_DWORD *)PoolWithTag + 13) = 1;
if( !DataBlock->ReplyRequested )
goto LABEL_4;
ReplyHandle = (_ETW_REG_ENTRY *)DataBlock->ReplyHandle;
*((_DWORD *)PoolWithTag + 13) |= 2u;
ObfReferenceObject(ReplyHandle);
v11->ReplyObject = ReplyHandle;
v11->WakeReference = PsChargeProcessWakeCounter(Process, 1ui64, PsWakeReasonInstrumentation, (UINT64)RegEntry);
v19 = 0;
v3 = -1073741823;
while( _InterlockedCompareExchange64(
(volatile signed __int64 *)&RegEntry->ReplyQueue + v19,
(signed __int64)v11,
0i64) )
{
if( ++v19 >= 4 )
goto LABEL_18;
}
v11->ReplyIndex = v19;
v3 = 0;
LABEL_18:
if( v3 < 0 )
{
EtwpReleaseQueueEntry(v11, 3ui64);
}
else
{
LABEL_4:
_InterlockedIncrement(&DataBlock->RefCount);
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--CurrentThread->Tcb.KernelApcDisable;
ExAcquirePushLockExclusiveEx((_EX_PUSH_LOCK *)v9 + 2, 0i64);
v13 = (_LIST_ENTRY *)(v9 + 3);
v14 = (VOID **)v9[3];
if( v14 != v9 + 3 )
{
while( v20 != (*((_BYTE *)v14[3] + 99) & 1) )
{
v14 = (VOID **)*v14;
if( v14 == (VOID **)v13 )
goto LABEL_5;
}
v8 = 0;
}
LABEL_5:
v15 = (_ETW_QUEUE_ENTRY **)v9[4];
if( *v15 != (_ETW_QUEUE_ENTRY *)v13 )
__fastfail(3u);
v11->ListEntry.Flink = v13;
v11->ListEntry.Blink = (_LIST_ENTRY *)v15;
*v15 = v11;
v9[4] = v11;
if( v8 )
{
if( (_WORD)v5 )
v16 = (_KEVENT *)v9[1];
else
v16 = (_KEVENT *)*v9;
if( v16 )
KeSetEvent(v16, 1, 0);
}
ExReleasePushLockEx((_DWORD)v9 + 16, 0);
KeLeaveCriticalRegionThread(KeGetCurrentThread());
}
return v3;
}Referenced by:
EtwpSendDataBlock