PiUEventProcessBroadcastNotifications

__int64 __fastcall PiUEventProcessBroadcastNotifications(__int64 a1){
  int ObjectProperty; 
  int v3; 
  int v4; 
  int v5; 
  int v6; 
  __int64 v7; 
  __int64 v8; 
  __int64 v9; 
  bool v11; 
  __int64 v12; 
  char *v13; 
  char *v14; 
  __int64 v15; 
  __int64 v16; 
  __int64 v17; 
  __int64 v18; 
  __int64 v19; 
  __int64 v20; 
  __int64 v21; 
  __int64 v22; 
  char *v23; 
  WCHAR v24; 
  _DWORD *v25; 
  _DWORD *v26; 
  char *v27; 
  WCHAR v28; 
  char *PoolWithTag; 
  size_t pcchLength; 
  struct _UNICODE_STRING DestinationString; 
  int v32; 
  ULONG v33; 
  ULONG v34; 
  ObjectProperty = 0;
  pcchLength = 0i64;
  v33 = 0;
  DestinationString = 0i64;
  v32 = 0;
  if( !PiUEventBroadcastSubscriberPresent )
    return(unsigned int)ObjectProperty;
  v3 = *(_DWORD *)(a1 + 88);
  if( !v3 )
  {
    PoolWithTag = (char *)ExAllocatePoolWithTag(PagedPool, 0x1C0ui64, 0x59706E50ui64);
    v14 = PoolWithTag;
    if( !PoolWithTag )
      return(unsigned int)-1073741670;
    memset((INT64)PoolWithTag, 0i64);
    *((_DWORD *)v14 + 6) = -1;
    *((_DWORD *)v14 + 5) = 2;
    *(_OWORD *)(v14 + 28) = *(_OWORD *)(a1 + 72);
    goto LABEL_23;
  }
  v4 = v3 - 1;
  if( !v4 )
  {
    v12 = *(_QWORD *)(a1 + 72) - *(_QWORD *)&GUID_DEVICE_ARRIVAL.Data1;
    if( !v12 )
      v12 = *(_QWORD *)(a1 + 80) - *(_QWORD *)GUID_DEVICE_ARRIVAL.Data4;
    if( !v12 )
      goto LABEL_20;
    v21 = *(_QWORD *)(a1 + 72) - *(_QWORD *)&GUID_DEVICE_REMOVE_PENDING.Data1;
    if( !v21 )
      v21 = *(_QWORD *)(a1 + 80) - *(_QWORD *)GUID_DEVICE_REMOVE_PENDING.Data4;
    if( !v21 )
    {
LABEL_20:
      v13 = (char *)ExAllocatePoolWithTag(PagedPool, 0x1C0ui64, 0x59706E50ui64);
      v14 = v13;
      if( !v13 )
        return(unsigned int)-1073741670;
      memset((INT64)v13, 0i64);
      ObjectProperty = PnpGetObjectProperty(
                         PiPnpRtlCtx,
                         a1 + 120,
                         1i64,
                         0i64,
                         0i64,
                         (__int64)&DEVPKEY_Device_SessionId,
                         &v32,
                         (unsigned __int64)(v14 + 24),
                         4,
                         &v33,
                         0);
      if( ObjectProperty < 0 || v33 != 4 )
      {
        *((_DWORD *)v14 + 6) = -1;
        ObjectProperty = 0;
      }
      goto LABEL_23;
    }
    v22 = *(_QWORD *)(a1 + 72) - *(_QWORD *)&GUID_TARGET_DEVICE_REMOVE_COMPLETE.Data1;
    if( !v22 )
      v22 = *(_QWORD *)(a1 + 80) - *(_QWORD *)GUID_TARGET_DEVICE_REMOVE_COMPLETE.Data4;
    v11 = v22 == 0;
LABEL_15:
    if( !v11 )
      return(unsigned int)ObjectProperty;
    goto LABEL_20;
  }
  v5 = v4 - 1;
  if( !v5 )
  {
    v16 = *(_QWORD *)(a1 + 72) - *(_QWORD *)&GUID_DEVICE_INTERFACE_ARRIVAL.Data1;
    if( !v16 )
      v16 = *(_QWORD *)(a1 + 80) - *(_QWORD *)GUID_DEVICE_INTERFACE_ARRIVAL.Data4;
    if( v16 )
    {
      v20 = *(_QWORD *)(a1 + 72) - *(_QWORD *)&GUID_DEVICE_INTERFACE_REMOVAL.Data1;
      if( !v20 )
        v20 = *(_QWORD *)(a1 + 80) - *(_QWORD *)GUID_DEVICE_INTERFACE_REMOVAL.Data4;
      if( v20 )
        return(unsigned int)ObjectProperty;
    }
    v17 = *(_QWORD *)(a1 + 120) - *(_QWORD *)&GUID_DEVINTERFACE_VOLUME.Data1;
    if( !v17 )
      v17 = *(_QWORD *)(a1 + 128) - *(_QWORD *)GUID_DEVINTERFACE_VOLUME.Data4;
    if( v17 )
    {
      v18 = *(_QWORD *)(a1 + 120) - *(_QWORD *)&GUID_DEVINTERFACE_PARALLEL.Data1;
      if( !v18 )
        v18 = *(_QWORD *)(a1 + 128) - *(_QWORD *)GUID_DEVINTERFACE_PARALLEL.Data4;
      if( v18 )
      {
        v19 = *(_QWORD *)(a1 + 120) - *(_QWORD *)&GUID_DEVINTERFACE_COMPORT.Data1;
        if( !v19 )
          v19 = *(_QWORD *)(a1 + 128) - *(_QWORD *)GUID_DEVINTERFACE_COMPORT.Data4;
        if( v19 )
          return(unsigned int)ObjectProperty;
      }
      v27 = (char *)ExAllocatePoolWithTag(PagedPool, 0x1C0ui64, 0x59706E50ui64);
      v14 = v27;
      if( !v27 )
        return(unsigned int)-1073741670;
      memset((INT64)v27, 0i64);
      RtlInitUnicodeString(&DestinationString, (PCWSTR)(a1 + 136), v28);
      *((_DWORD *)v14 + 5) = 3;
      *(_OWORD *)(v14 + 28) = *(_OWORD *)(a1 + 72);
      v34 = 400;
      ObjectProperty = PnpGetObjectProperty(
                         PiPnpRtlCtx,
                         a1 + 136,
                         3i64,
                         0i64,
                         0i64,
                         (__int64)&DEVPKEY_Device_InstanceId,
                         &v32,
                         (unsigned __int64)(v14 + 44),
                         400,
                         &v34,
                         0);
      if( ObjectProperty < 0 || v32 != 18 )
      {
        ExFreePoolWithTag(v14, 0x59706E50u);
        return(unsigned int)ObjectProperty;
      }
      v34 = 4;
      ObjectProperty = PnpGetObjectProperty(
                         PiPnpRtlCtx,
                         (__int64)(v14 + 44),
                         1i64,
                         0i64,
                         0i64,
                         (__int64)&DEVPKEY_Device_SessionId,
                         &v32,
                         (unsigned __int64)(v14 + 24),
                         4,
                         &v34,
                         0);
      if( ObjectProperty < 0 || v32 != 7 )
      {
        *((_DWORD *)v14 + 6) = -1;
        ObjectProperty = 0;
      }
    }
    else
    {
      v23 = (char *)ExAllocatePoolWithTag(PagedPool, 0x1C0ui64, 0x59706E50ui64);
      v14 = v23;
      if( !v23 )
        return(unsigned int)-1073741670;
      memset((INT64)v23, 0i64);
      RtlInitUnicodeString(&DestinationString, (PCWSTR)(a1 + 136), v24);
      *((_DWORD *)v14 + 5) = 1;
      *((_DWORD *)v14 + 6) = IopGetSessionIdFromSymbolicName(&DestinationString);
    }
LABEL_23:
    v15 = (__int64)v14;
LABEL_24:
    PiUEventQueueBroadcastEventEntry(v15);
    return(unsigned int)ObjectProperty;
  }
  v6 = v5 - 1;
  if( v6 )
  {
    v11 = v6 == 1;
    goto LABEL_15;
  }
  v7 = a1 + 128;
  ObjectProperty = RtlStringCchLengthW((STRSAFE_PCNZWCH)(a1 + 128), 0xC8ui64, &pcchLength);
  if( ObjectProperty >= 0 && pcchLength )
  {
    if( (unsigned int)(2 * pcchLength + 82) < 0x50 || 2 * (int)pcchLength + 89 < (unsigned int)(2 * pcchLength + 82) )
      return(unsigned int)-1073741675;
    ObjectProperty = 0;
    v8 = (2 * (_DWORD)pcchLength + 89) & 0xFFFFFFF8;
    v9 = *(_QWORD *)(v8 + a1 + 76) - *(_QWORD *)&GUID_IO_VOLUME_NAME_CHANGE.Data1;
    if( !v9 )
      v9 = *(_QWORD *)(v8 + a1 + 84) - *(_QWORD *)GUID_IO_VOLUME_NAME_CHANGE.Data4;
    if( !v9 )
    {
      v25 = ExAllocatePoolWithTag(PagedPool, 0x1C0ui64, 0x59706E50ui64);
      v26 = v25;
      if( v25 )
      {
        memset((INT64)v25, 0i64);
        v26[5] = 1;
        ObjectProperty = PnpGetObjectProperty(
                           PiPnpRtlCtx,
                           v7,
                           1i64,
                           0i64,
                           0i64,
                           (__int64)&DEVPKEY_Device_SessionId,
                           &v32,
                           (unsigned __int64)(v26 + 6),
                           4,
                           &v33,
                           0);
        if( ObjectProperty < 0 || v33 != 4 )
        {
          v26[6] = -1;
          ObjectProperty = 0;
        }
        v15 = (__int64)v26;
        goto LABEL_24;
      }
      return(unsigned int)-1073741670;
    }
  }
  return(unsigned int)ObjectProperty;
}

Referenced by:

No references.