IoWMIWriteEvent
NTSTATUS __stdcall IoWMIWriteEvent(VOID *WnodeEventItem){
NTSTATUS v1;
int v3;
_LIST_ENTRY *PoolWithTag;
unsigned int v5;
unsigned __int64 v6;
VOID **RegEntryByProviderId;
_LIST_ENTRY *v8;
NTSTATUS result;
int v10;
int v11;
_KSPIN_LOCK *v12;
v1 = 0;
if( !*(&ExBootDevicesRemovedEvent + 391) )
return -1073741823;
v3 = *((_DWORD *)WnodeEventItem + 11);
if( (v3 & 0x60000) != 0 )
{
v10 = *(_DWORD *)WnodeEventItem;
v11 = v3 & 0x20000;
v12 = (_KSPIN_LOCK *)*((unsigned __int16 *)WnodeEventItem + 4);
if( (unsigned int)v10 < 0x30 )
return -1073741789;
if( v11 )
{
if( (unsigned int)v10 <= 0xFFFF )
goto LABEL_15;
}
else if( v10 >= 0 )
{
LABEL_15:
result = EtwTraceEvent(v12, (unsigned __int16 *)WnodeEventItem, 0x30u, -1072431104, 0);
if( v11 )
return result;
goto LABEL_3;
}
return -2147483643;
}
LABEL_3:
PoolWithTag = (_LIST_ENTRY *)ExAllocatePoolWithTag(0x200ui64, 0x20ui64, 2003397975i64);
if( !PoolWithTag )
return -1073741670;
v5 = *((_DWORD *)WnodeEventItem + 1);
v6 = (unsigned __int8)KeAcquireSpinLockRaiseToDpc((UINT64 *)&ExBootDevicesRemovedEvent + 436);
RegEntryByProviderId = WmipDoFindRegEntryByProviderId(v5);
v8 = (_LIST_ENTRY *)RegEntryByProviderId;
if( RegEntryByProviderId )
_InterlockedIncrement((volatile signed __int32 *)RegEntryByProviderId + 12);
KxReleaseSpinLock((UINT64 *)&ExBootDevicesRemovedEvent + 436);
__writecr8(v6);
*((_DWORD *)WnodeEventItem + 10) = *((_DWORD *)WnodeEventItem + 2);
PoolWithTag[1].Flink = v8;
PoolWithTag[1].Blink = (_LIST_ENTRY *)WnodeEventItem;
ExInterlockedInsertTailList(
(PLIST_ENTRY)&stru_140C00F40 + 472,
PoolWithTag,
(PKSPIN_LOCK)&ExBootDevicesRemovedEvent + 396);
if( _InterlockedIncrement((_DWORD *)&ExBootDevicesRemovedEvent + 794) == 1 )
ExQueueWorkItem((PWORK_QUEUE_ITEM)&ExBootDevicesRemovedEvent + 98, DelayedWorkQueue);
return v1;
}Referenced by:
PpmFireWmiEvent
PpmWmiFireIdleAccountingEvent