TtmiSessionDeviceListWorker

VOID __stdcall TtmiSessionDeviceListWorker(_TTMI_SESSION *LockedSession){
  _TTMI_SESSION *v1; 
  __int64 i; 
  int v4; 
  void *v5; 
  unsigned int v6; 
  int v7; 
  int v8; 
  void(__fastcall *Data)(_QWORD); 
  __int64 v10; 
  void **v11; 
  _TTMP_CALLOUT_CONTEXT Context[4]; 
  __int128 v13; 
  __int64 v14; 

  v1 = LockedSession + 24;
  for( i = *((_QWORD *)LockedSession + 12); (_TTMI_SESSION *)i != v1; i = *(_QWORD *)i )
  {
    v4 = *(_DWORD *)(i + 600);
    v5 = (void *)i;
    if( (v4 & 4) != 0 )
      goto LABEL_14;
    if( (v4 & 1) != 0 )
    {
      v6 = v4 & 0xFFFFFFFC | 2;
      *(_DWORD *)(i + 600) = v6;
      if( (LockedSession[1] & 0x800) != 0 )
      {
        *(_DWORD *)(i + 596) = 0;
        v6 |= 0x40u;
      }
      v7 = 3;
    }
    else
    {
      if( (v4 & 0x10) == 0 )
        goto LABEL_12;
      v6 = v4 & 0xFFFFFFEF;
      *(_DWORD *)(i + 600) = v6;
      if( (LockedSession[1] & 0x800) != 0 )
      {
        *(_DWORD *)(i + 596) = 0;
        v6 |= 0x40u;
      }
      v7 = 4;
    }
    *(_DWORD *)(i + 600) = v6 | 0x20;
    TtmpPublishDeviceEvent((__int64)LockedSession, 0i64, i, v7);
LABEL_12:
    v4 = *(_DWORD *)(i + 600);
    if( (v4 & 0x20) != 0 )
    {
      *(_DWORD *)(i + 600) = v4 & 0xFFFFFFDF;
      TtmpCallAssignedToTerminal(LockedSession, (_TTMI_DEVICE_ENTRY *)i);
      v4 = *(_DWORD *)(i + 600);
    }
LABEL_14:
    if( (v4 & 0x44) == 64 )
    {
      *(_DWORD *)(i + 600) = v4 & 0xFFFFFFBF;
      if( TtmpPushTerminalState(LockedSession, (_TTMI_DEVICE_ENTRY *)i) )
      {
        *(_DWORD *)(i + 600) |= 0x40u;
        LockedSession[1] |= 0x1000u;
      }
    }
    v8 = *(_DWORD *)(i + 600);
    if( (v8 & 4) != 0 )
    {
      if( (v8 & 2) != 0 )
      {
        *(_DWORD *)(i + 600) = v8 | 8;
        TtmpPublishDeviceEvent((__int64)LockedSession, 0i64, i, 5);
      }
      Data = *(void(__fastcall **)(_QWORD))(i + 40);
      if( Data )
      {
        v14 = 0i64;
        *(_OWORD *)Context = 0i64;
        v13 = 0i64;
        TtmpStartCallout(Context, LockedSession, (_TTMI_DEVICE_ENTRY *)i, 2ui64, (UINT64)Data);
        Data(*(_QWORD *)(i + 24));
        TtmpStopCallout(Context, 0i64);
      }
      v10 = *(_QWORD *)i;
      v11 = *(void ***)(i + 8);
      i = (__int64)v11;
      if( *(void **)(*(_QWORD *)v5 + 8i64) != v5 || *v11 != v5 )
        __fastfail(3u);
      *v11 = (void *)v10;
      *(_QWORD *)(v10 + 8) = v11;
      --LockedSession[29];
      ExFreePoolWithTag(v5, 0x446D7454u);
    }
  }
  TtmpCommitTerminalDisplayStateUpdateWorker(LockedSession, 0i64);
  TtmpCommitTerminalDisplayStateUpdateWorker(LockedSession, 1i64);
  TtmpCommitTerminalDisplayStateUpdateWorker(LockedSession, 2i64);
  TtmpCommitTerminalDisplayStateUpdateWorker(LockedSession, 3i64);
}

Referenced by:

TtmpSessionWorker