TtmpPublishDeviceEvent

__int64 __fastcall TtmpPublishDeviceEvent(__int64 a1, __int64 a2, __int64 a3, int a4){
  INT64 v8; 
  unsigned int v9; 
  INT64 v10; 
  int v11; 
  int v12; 
  int v13; 
  int v14; 
  const WCHAR *v16; 
  char Event[544]; 

  memset(&Event[4], 0i64, 0x21Cu);
  v9 = 0;
  *(_DWORD *)Event = a4;
  switch( a4 )
  {
    case 0:
    case 3:
      *(_DWORD *)&Event[8] = *(_DWORD *)(a3 + 32);
      *(_DWORD *)&Event[12] = *(_DWORD *)(a3 + 596);
      *(_DWORD *)&Event[16] = *(_DWORD *)(a3 + 16);
      *(_DWORD *)&Event[20] = *(_DWORD *)(a3 + 72);
      RtlStringCchCopyW((WCHAR *)&Event[24], 0x104ui64, (WCHAR *)(a3 + 76));
      v11 = *(_DWORD *)(a3 + 72);
      v12 = *(_DWORD *)(a3 + 16);
      v13 = *(_DWORD *)(a3 + 596);
      v14 = *(_DWORD *)(a3 + 32);
      v16 = (const WCHAR *)(a3 + 76);
      if( a4 )
        TtmiLogDeviceArrivedTerminalEvent(v14, v13, v12, v11, v16);
      else
        TtmiLogDeviceEnumeratedTerminalEvent(v14, v13, v12, v11, v16);
      break;
    case 4:
      v10 = *(unsigned int *)(a3 + 596);
      *(_DWORD *)&Event[8] = *(_DWORD *)(a3 + 32);
      *(_DWORD *)&Event[12] = v10;
      TtmiLogDeviceAssignedTerminalEvent(*(unsigned int *)&Event[8], v10);
      break;
    case 5:
      *(_DWORD *)&Event[8] = *(_DWORD *)(a3 + 32);
      TtmiLogDeviceDepartedTerminalEvent(*(unsigned int *)&Event[8]);
      break;
  }
  if( a2 )
    return(unsigned int)TtmiWriteEventToSingleQueue(a2, Event, v8);
  else
    TtmiWriteEventToAllQueues((_TTMI_SESSION *)a1, (_TERMINAL_EVENT *)Event);
  return v9;
}

Referenced by:

TtmiAssignDevice
TtmiPublishDeviceEnumerationEvents
TtmiSessionDeviceListWorker