PiUEventNotifyClient

INT64 __fastcall PiUEventNotifyClient(INT64 a1, INT64 a2){
  int v4; 
  char v5; 
  _QWORD *PoolWithTag; 
  v4 = 0;
  v5 = 0;
  ExAcquireFastMutex(*(FAST_MUTEX **)(a2 + 16));
  if( *(_BYTE *)(a2 + 140) )
  {
    if( !PiUEventIsClientStuck(a2) )
      goto LABEL_3;
    ++*(_DWORD *)(a2 + 136);
  }
  v5 = 1;
LABEL_3:
  KeReleaseGuardedMutex(*(_FAST_MUTEX **)(a2 + 16));
  if( !v5 )
  {
    PoolWithTag = ExAllocatePoolWithTag(PagedPool, 0x20ui64, 0x59706E50ui64);
    if( PoolWithTag )
    {
      PiUEventReferenceEventEntry(a1);
      PoolWithTag[3] = a1;
      ExAcquireFastMutex(*(FAST_MUTEX **)(a2 + 16));
      v4 = PiUEventQueuePendingEvent(a2, PoolWithTag);
      if( v4 < 0 )
      {
        PiUEventDequeuePendingEventWorker(a2, *(INT64 **)(a2 + 112), 0);
        ++*(_DWORD *)(a2 + 136);
        v4 = PiUEventQueuePendingEvent(a2, PoolWithTag);
      }
      if( v4 < 0 )
      {
        ++*(_DWORD *)(a2 + 136);
        KeReleaseGuardedMutex(*(_FAST_MUTEX **)(a2 + 16));
      }
      else
      {
        PoolWithTag[2] = *(_QWORD *)&KUSER_SHARED_DATA.SystemTime.LowPart;
        KeReleaseGuardedMutex(*(_FAST_MUTEX **)(a2 + 16));
        PiUEventNotifyClientPendingEvent(a2);
      }
    }
    else
    {
      return(unsigned int)-1073741670;
    }
  }
  return(unsigned int)v4;
}

Referenced by:

PiUEventNotifyDeviceInstanceChange
PiUEventNotifyDeviceInstancePropertyChange
PiUEventNotifyDeviceInterfaceChange
PiUEventNotifyTargetDeviceChange