PiUEventProcessBroadcastNotifications

__int64 __fastcall PiUEventProcessBroadcastNotifications(__int64 a1){
  NTSTATUS ObjectProperty; 
  int v3; 
  int v4; 
  int v5; 
  int v6; 
  INT64 v7; 
  __int64 v8; 
  __int64 v9; 
  bool v11; 
  __int64 v12; 
  VOID **v13; 
  VOID **v14; 
  __int64 v15; 
  __int64 v16; 
  __int64 v17; 
  __int64 v18; 
  __int64 v19; 
  __int64 v20; 
  __int64 v21; 
  __int64 v22; 
  VOID **v23; 
  VOID **v24; 
  VOID **v25; 
  VOID **v26; 
  VOID **PoolWithTag; 
  size_t pcchLength[2]; 
  _UNICODE_STRING DestinationString; 
  INT64 v30; 
  int v31; 
  int v32; 

  ObjectProperty = 0;
  *(_QWORD *)pcchLength = 0i64;
  v31 = 0;
  DestinationString = 0i64;
  LODWORD(v30) = 0;
  if( !PiUEventBroadcastSubscriberPresent )
    return(unsigned int)ObjectProperty;
  v3 = *(_DWORD *)(a1 + 88);
  if( !v3 )
  {
    PoolWithTag = ExAllocatePoolWithTag(1ui64, 0x1C0ui64, 1500540496i64);
    v14 = PoolWithTag;
    if( !PoolWithTag )
      return(unsigned int)-1073741670;
    memset(PoolWithTag, 0i64, 0x1C0u);
    *((_DWORD *)v14 + 6) = -1;
    *((_DWORD *)v14 + 5) = 2;
    *(_OWORD *)((char *)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 = ExAllocatePoolWithTag(1ui64, 0x1C0ui64, 1500540496i64);
      v14 = v13;
      if( !v13 )
        return(unsigned int)-1073741670;
      memset(v13, 0i64, 0x1C0u);
      ObjectProperty = PnpGetObjectProperty(
                         *(&stru_140CF2E80 + 1214),
                         a1 + 120,
                         1i64,
                         0i64,
                         0i64,
                         (INT64)&DEVPKEY_Device_SessionId,
                         (INT64)&v30,
                         (INT64)(v14 + 3));
      if( ObjectProperty < 0 || v31 != 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;
      }
      v26 = ExAllocatePoolWithTag(1ui64, 0x1C0ui64, 1500540496i64);
      v14 = v26;
      if( !v26 )
        return(unsigned int)-1073741670;
      memset(v26, 0i64, 0x1C0u);
      RtlInitUnicodeString(&DestinationString, (PCWSTR)(a1 + 136));
      *((_DWORD *)v14 + 5) = 3;
      *(_OWORD *)((char *)v14 + 28) = *(_OWORD *)(a1 + 72);
      v32 = 400;
      ObjectProperty = PnpGetObjectProperty(
                         *(&stru_140CF2E80 + 1214),
                         a1 + 136,
                         3i64,
                         0i64,
                         0i64,
                         (INT64)&DEVPKEY_Device_InstanceId,
                         (INT64)&v30,
                         (INT64)v14 + 44);
      if( ObjectProperty < 0 || (_DWORD)v30 != 18 )
      {
        ExFreePoolWithTag(v14, 0x59706E50u);
        return(unsigned int)ObjectProperty;
      }
      v32 = 4;
      ObjectProperty = PnpGetObjectProperty(
                         *(&stru_140CF2E80 + 1214),
                         (INT64)v14 + 44,
                         1i64,
                         0i64,
                         0i64,
                         (INT64)&DEVPKEY_Device_SessionId,
                         (INT64)&v30,
                         (INT64)(v14 + 3));
      if( ObjectProperty < 0 || (_DWORD)v30 != 7 )
      {
        *((_DWORD *)v14 + 6) = -1;
        ObjectProperty = 0;
      }
    }
    else
    {
      v23 = ExAllocatePoolWithTag(1ui64, 0x1C0ui64, 1500540496i64);
      v14 = v23;
      if( !v23 )
        return(unsigned int)-1073741670;
      memset(v23, 0i64, 0x1C0u);
      RtlInitUnicodeString(&DestinationString, (PCWSTR)(a1 + 136));
      *((_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((WCHAR *)(a1 + 128), 0xC8ui64, (UINT64 *)pcchLength);
  if( ObjectProperty >= 0 && *(_QWORD *)pcchLength )
  {
    if( 2 * pcchLength[0] + 82 < 0x50 || 2 * pcchLength[0] + 89 < 2 * pcchLength[0] + 82 )
      return(unsigned int)-1073741675;
    ObjectProperty = 0;
    v8 = (2 * pcchLength[0] + 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 )
    {
      v24 = ExAllocatePoolWithTag(1ui64, 0x1C0ui64, 1500540496i64);
      v25 = v24;
      if( v24 )
      {
        memset(v24, 0i64, 0x1C0u);
        *((_DWORD *)v25 + 5) = 1;
        ObjectProperty = PnpGetObjectProperty(
                           *(&stru_140CF2E80 + 1214),
                           v7,
                           1i64,
                           0i64,
                           0i64,
                           (INT64)&DEVPKEY_Device_SessionId,
                           (INT64)&v30,
                           (INT64)(v25 + 3));
        if( ObjectProperty < 0 || v31 != 4 )
        {
          *((_DWORD *)v25 + 6) = -1;
          ObjectProperty = 0;
        }
        v15 = (__int64)v25;
        goto LABEL_24;
      }
      return(unsigned int)-1073741670;
    }
  }
  return(unsigned int)ObjectProperty;
}

Referenced by:

No references.