WmipProcessEvent
NTSTATUS __stdcall WmipProcessEvent(_WNODE_HEADER *InWnode, UINT8 IsHighPriority, UINT8 FreeBuffer){
UINT8 v3;
_WNODE_HEADER *v4;
_WNODE_HEADER *v5;
_WNODE_HEADER *v6;
tagGUIDENTRY *GEByGuid;
NTSTATUS v8;
tagGUIDENTRY *v10;
INT64 v11;
void(__fastcall *v12)(_WNODE_HEADER *, _QWORD);
unsigned int *v13;
unsigned int *v17;
v3 = FreeBuffer;
v4 = InWnode;
if( (InWnode->Flags & 0x2000) == 0 )
{
v5 = 0i64;
v6 = InWnode;
v17 = 0i64;
LABEL_3:
if( (v6->Flags & 0x80u) != 0 )
v6 = WmipIncludeStaticNames(v6, v6->BufferSize);
GEByGuid = WmipFindGEByGuid(&v6->Guid, 1u);
if( GEByGuid )
{
v8 = 0;
KeWaitForSingleObject((UINT64)&ExBootDevicesRemovedEvent + 3072, 0, 0, 0, 0i64);
v10 = (tagGUIDENTRY *)*((_QWORD *)GEByGuid + 5);
if( v10 != GEByGuid + 10 )
{
do
{
v11 = (INT64)(v10 - 10);
v10 = *(tagGUIDENTRY **)v10;
if( ObReferenceObjectSafe(v11) )
{
if( (*(_DWORD *)(v11 + 164) & 2) != 0 )
{
v12 = *(void(__fastcall **)(_WNODE_HEADER *, _QWORD))(v11 + 72);
if( v12 )
v12(v6, *(_QWORD *)(v11 + 80));
}
else if( WmipWriteWnodeToObject((_WMIGUIDOBJECT *)v11, v6, IsHighPriority) < 0 )
{
v8 = -1073741823;
}
HalPutDmaAdapter((PADAPTER_OBJECT)v11);
}
}
while( v10 != GEByGuid + 10 );
v5 = (_WNODE_HEADER *)v17;
v4 = InWnode;
v3 = FreeBuffer;
}
KeReleaseMutex((_KMUTANT *)((char *)&ExBootDevicesRemovedEvent + 3072), 0);
WmipUnreferenceEntry((__int64)&stru_140C00F40 + 4528, (volatile signed __int64 *)GEByGuid);
}
else
{
v8 = -1073741163;
}
if( v3 )
ExFreePoolWithTag(v4, 0);
if( v6 != v4 && v6 != v5 )
ExFreePoolWithTag(v6, 0);
if( v5 )
ExFreePoolWithTag(v5, 0);
return v8;
}
v13 = WmipDereferenceEvent((__int64)InWnode);
v17 = v13;
v5 = (_WNODE_HEADER *)v13;
if( v13 )
{
v6 = (_WNODE_HEADER *)v13;
goto LABEL_3;
}
if( v3 )
ExFreePoolWithTag(v4, 0);
return -1073741823;
}Referenced by:
WmipEventNotification
WmipGenerateBinaryMofNotification
WmipGenerateMofResourceNotification
WmipSendGuidUpdateNotifications