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