IoWMIWriteEvent
NTSTATUS __stdcall IoWMIWriteEvent(PVOID WnodeEventItem){
NTSTATUS v1;
int v3;
UINT64 v4;
_LIST_ENTRY *PoolWithTag;
unsigned int v6;
unsigned __int8 v7;
unsigned __int64 v8;
VOID **RegEntryByProviderId;
_LIST_ENTRY *v10;
NTSTATUS result;
int v12;
int v13;
UINT16 v14;
v1 = 0;
if( !WmipServiceDeviceObject )
return -1073741823;
v3 = *((_DWORD *)WnodeEventItem + 11);
if( (v3 & 0x60000) != 0 )
{
v12 = *(_DWORD *)WnodeEventItem;
v13 = v3 & 0x20000;
v14 = *((_WORD *)WnodeEventItem + 4);
if( (unsigned int)v12 < 0x30 )
return -1073741789;
if( v13 )
{
if( (unsigned int)v12 <= 0xFFFF )
goto LABEL_15;
}
else if( v12 >= 0 )
{
LABEL_15:
result = EtwTraceEvent(v14, (UINT16 *)WnodeEventItem, 0x30ui64, 3222536192i64, 0);
if( v13 )
return result;
goto LABEL_3;
}
return -2147483643;
}
LABEL_3:
PoolWithTag = (_LIST_ENTRY *)ExAllocatePoolWithTag(NonPagedPoolNx, 0x20ui64, 0x77696D57ui64);
if( !PoolWithTag )
return -1073741670;
v6 = *((_DWORD *)WnodeEventItem + 1);
KeAcquireSpinLockRaiseToDpc(&WmipRegistrationSpinLock, v4);
v8 = v7;
RegEntryByProviderId = WmipDoFindRegEntryByProviderId(v6);
v10 = (_LIST_ENTRY *)RegEntryByProviderId;
if( RegEntryByProviderId )
_InterlockedIncrement((volatile signed __int32 *)RegEntryByProviderId + 12);
KxReleaseSpinLock(&WmipRegistrationSpinLock);
__writecr8(v8);
*((_DWORD *)WnodeEventItem + 10) = *((_DWORD *)WnodeEventItem + 2);
PoolWithTag[1].Flink = v10;
PoolWithTag[1].Blink = (_LIST_ENTRY *)WnodeEventItem;
ExInterlockedInsertTailList(&WmipNPEvent, PoolWithTag, &WmipNPNotificationSpinlock);
if( _InterlockedIncrement(&WmipEventWorkItems) == 1 )
ExQueueWorkItem(&WmipEventWorkQueueItem, DelayedWorkQueue);
return v1;
}Referenced by:
PpmFireWmiEvent
PpmWmiFireIdleAccountingEvent