WmipProcessEvent
NTSTATUS __stdcall WmipProcessEvent(WNODE_HEADER *InWnode, BOOL IsHighPriority, UINT8 FreeBuffer){
UINT8 v3;
WNODE_HEADER *v4;
WNODE_HEADER *v5;
WNODE_HEADER *v6;
volatile signed __int64 *GEByGuid;
NTSTATUS v8;
volatile signed __int64 *v10;
INT64 v11;
void(__fastcall *v12)(WNODE_HEADER *, _QWORD);
_WNODE_HEADER *v13;
bool v15;
_WNODE_HEADER *v17;
v15 = IsHighPriority;
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.Data1, 1);
if( GEByGuid )
{
v8 = 0;
KeWaitForSingleObject(&WmipSMMutex, Executive, 0, 0, 0i64);
v10 = (volatile signed __int64 *)*((_QWORD *)GEByGuid + 5);
if( v10 != GEByGuid + 5 )
{
do
{
v11 = (INT64)(v10 - 5);
v10 = (volatile signed __int64 *)*v10;
if( ObReferenceObjectSafe((PVOID)v11) )
{
if( (*(_DWORD *)(v11 + 164) & 2) != 0 )
{
v12 = *(void(__fastcall **)(WNODE_HEADER *, _QWORD))(v11 + 72);
if( v12 )
v12(v6, *(_QWORD *)(v11 + 80));
}
else if( (int)WmipWriteWnodeToObject(v11, (UINT64 *)&v6->BufferSize, v15) < 0 )
{
v8 = -1073741823;
}
HalPutDmaAdapter((PADAPTER_OBJECT)v11);
}
}
while( v10 != GEByGuid + 5 );
v5 = v17;
v4 = InWnode;
v3 = FreeBuffer;
}
KeReleaseMutex(&WmipSMMutex, 0);
WmipUnreferenceEntry((__int64)&WmipGEChunkInfo, 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((tagWNODE_EVENT_REFERENCE *)InWnode);
v17 = v13;
v5 = v13;
if( v13 )
{
v6 = v13;
goto LABEL_3;
}
if( v3 )
ExFreePoolWithTag(v4, 0);
return -1073741823;
}Referenced by:
WmipEventNotification
WmipGenerateBinaryMofNotification
WmipGenerateMofResourceNotification
WmipSendGuidUpdateNotifications