PiUEventNotifyTargetDeviceChange

INT64 __fastcall PiUEventNotifyTargetDeviceChange(INT64 a1){
  _DWORD *v1; 
  char v2; 
  int v3; 
  unsigned int v4; 
  __int64 v6; 
  __int64 v7; 
  __int64 v8; 
  __int64 v9; 
  __int64 v10; 
  int v11; 
  __int64 v12; 
  WCHAR *v13; 
  __int64 *v14; 
  __int64 *v15; 
  char v16; 
  __int64 v17; 
  __int64 v19; 
  _DWORD *PoolWithTag; 
  char v21; 
  char v22; 
  v1 = 0i64;
  v2 = 0;
  v21 = 0;
  v3 = 0;
  v22 = 0;
  v4 = 0;
  v6 = *(_QWORD *)(a1 + 72) - *(_QWORD *)&GUID_TARGET_DEVICE_QUERY_REMOVE.Data1;
  if( !v6 )
    v6 = *(_QWORD *)(a1 + 80) - *(_QWORD *)GUID_TARGET_DEVICE_QUERY_REMOVE.Data4;
  if( !v6 )
    goto LABEL_16;
  v7 = *(_QWORD *)(a1 + 72) - *(_QWORD *)GUID_TARGET_DEVICE_REMOVE_CANCELLED;
  if( !v7 )
    v7 = *(_QWORD *)(a1 + 80) - *((_QWORD *)GUID_TARGET_DEVICE_REMOVE_CANCELLED + 1);
  if( !v7 )
    goto LABEL_16;
  v8 = *(_QWORD *)(a1 + 72) - *(_QWORD *)&GUID_DEVICE_REMOVE_PENDING.Data1;
  if( !v8 )
    v8 = *(_QWORD *)(a1 + 80) - *(_QWORD *)GUID_DEVICE_REMOVE_PENDING.Data4;
  if( !v8 )
    goto LABEL_16;
  v9 = *(_QWORD *)(a1 + 72) - *(_QWORD *)&GUID_TARGET_DEVICE_REMOVE_COMPLETE.Data1;
  if( !v9 )
    v9 = *(_QWORD *)(a1 + 80) - *(_QWORD *)GUID_TARGET_DEVICE_REMOVE_COMPLETE.Data4;
  if( !v9 )
    goto LABEL_16;
  v10 = *(_QWORD *)(a1 + 72) - *(_QWORD *)&GUID_PNP_CUSTOM_NOTIFICATION.Data1;
  if( !v10 )
    v10 = *(_QWORD *)(a1 + 80) - *(_QWORD *)GUID_PNP_CUSTOM_NOTIFICATION.Data4;
  if( !v10 )
  {
LABEL_16:
    v11 = *(_DWORD *)(a1 + 88) - 1;
    if( v11 )
    {
      if( v11 != 2 )
        return(unsigned int)v3;
      v21 = 1;
      v12 = 128i64;
    }
    else
    {
      v12 = 120i64;
    }
    v13 = (WCHAR *)(v12 + a1);
    if( *(_BYTE *)(a1 + 68) )
    {
      PoolWithTag = ExAllocatePoolWithTag(PagedPool, 0x1000ui64, 0x59706E50ui64);
      v1 = PoolWithTag;
      if( !PoolWithTag )
        return(unsigned int)-1073741670;
      memset((INT64)PoolWithTag, 0i64);
      v4 = 1;
    }
    ExAcquireFastMutex(&PiUEventClientRegistrationListLock);
    v14 = &PiUEventDevHandleClientList[2 * (unsigned int)PiUEventHashStringIntoBucket(v13)];
    v15 = (__int64 *)*v14;
    if( (__int64 *)*v14 != v14 )
    {
      v16 = v21;
      do
      {
        v17 = (__int64)v15;
        v15 = (__int64 *)*v15;
        if( !v16 || !*(_BYTE *)(v17 + 40) )
        {
          if( wcsicmp(v13, *(const wchar_t **)(*(_QWORD *)(v17 + 24) + 16i64))
            || !PiUEventApplyAdditionalFilters(a1, v17)
            || (v3 = PiUEventNotifyClient(a1, v17), v3 < 0) )
          {
            v16 = v21;
          }
          else
          {
            v16 = v21;
            if( v1 )
            {
              if( v4 >= 0x400 )
              {
                v2 = 1;
                v22 = 1;
                continue;
              }
              v19 = v4++;
              v1[v19] = *(_DWORD *)(v17 + 48);
            }
          }
        }
        v2 = v22;
      }
      while( v15 != v14 );
    }
    if( v1 && v4 > 1 )
    {
      if( v2 )
      {
        memset((INT64)(v1 + 1), 0i64);
        *v1 = -1;
      }
      else
      {
        *v1 = v4 - 1;
      }
      ZwUpdateWnfStateData();
    }
    KeReleaseGuardedMutex(&PiUEventClientRegistrationListLock);
    if( v1 )
      ExFreePoolWithTag(v1, 0x59706E50u);
  }
  return(unsigned int)v3;
}

Referenced by:

No references.