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