TtmiSessionTerminalListWorker

void __fastcall TtmiSessionTerminalListWorker(__int64 a1, char *a2, _BYTE *a3){
  __int64 v3; 
  INT64 v4; 
  char v5; 
  char v9; 
  unsigned int *v10; 
  INT64 v11; 
  int v12; 
  UINT64 v13; 
  _QWORD **v14; 
  bool v15; 
  char v16; 
  char v17; 
  __int64 v18; 
  _QWORD *v19; 
  unsigned int v20; 
  __int64 *i; 
  CHAR a4; 
  CHAR a3a; 
  unsigned int v24; 
  _QWORD **v25; 
  v3 = a1 + 40;
  a3a = 0;
  v4 = *(_QWORD *)(a1 + 40);
  v5 = 0;
  a4 = 0;
  *a2 = 0;
  *a3 = 0;
  if( v4 != a1 + 40 )
  {
    v9 = 1;
    do
    {
      v10 = (unsigned int *)(v4 + 36);
      v11 = v4;
      v12 = *(_DWORD *)(v4 + 36);
      if( ((unsigned __int8)v12 & (unsigned __int8)v9) != 0 )
      {
        v13 = *(unsigned int *)a1;
        v14 = (_QWORD **)(v4 + 8);
        v4 = *(_QWORD *)(v4 + 8);
        v25 = v14;
        v24 = *(_DWORD *)(v11 + 28);
        TtmiLogTerminalCleanup((PVOID)v11, v13, v24);
        if( (*v10 & 0x10) != 0 )
        {
          v15 = TtmiUpdateActiveTerminalCount((_DWORD *)a1, 0, 26i64) == 0;
          v17 = v16 + 1;
          if( !v15 )
            *a2 = v17;
        }
        else
        {
          v17 = 1;
        }
        if( *(_DWORD *)(v11 + 32) )
          v5 = v17;
        if( TtmiEvacuateDevices(a1, v11) )
          *a3 = 1;
        v18 = *(_QWORD *)v11;
        if( *(_QWORD *)(*(_QWORD *)v11 + 8i64) != v11 || (v19 = *v25, **v25 != v11) )
          __fastfail(3u);
        *v19 = v18;
        *(_QWORD *)(v18 + 8) = v19;
        *(_QWORD *)(v11 + 16) = 0i64;
        TtmpDereferenceSessionMaybeLast((volatile INT32 *)a1);
        _bittestandreset(*(signed __int32 **)(a1 + 64), v24);
        v20 = *v10;
        *(_QWORD *)(v11 + 16) = 0i64;
        *(_DWORD *)(v11 + 24) = 1417180244;
        *v10 = v20 & 0xFFFFFFFC | 2;
        HalPutDmaAdapter((PADAPTER_OBJECT)v11);
        v9 = 1;
      }
      else if( (v12 & 4) != 0 )
      {
        *v10 = v12 & 0xFFFFFFFB;
        TtmpUpdateTerminalState(a1, v4, &a3a, &a4);
        if( a4 )
        {
          for( i = *(__int64 **)(a1 + 96); i != (__int64 *)(a1 + 96); i = (__int64 *)*i )
          {
            if( *((_DWORD *)i + 149) == *(_DWORD *)(v4 + 28) )
              *((_DWORD *)i + 150) |= 0x40u;
          }
          TtmpWriteDisplayStateChangedEvent(a1, (_DWORD *)v4);
          v9 = 1;
          *a3 = 1;
        }
        else
        {
          v9 = 1;
        }
        if( a3a && TtmiUpdateActiveTerminalCount((_DWORD *)a1, (*v10 & 0x10) != 0, *(unsigned int *)(v4 + 44)) )
          *a2 = v9;
      }
      v4 = *(_QWORD *)v4;
    }
    while( v4 != v3 );
    if( v5 )
      TtmiPurgeSessionPowerRequestEntries(a1);
  }
}

Referenced by:

TtmpSessionWorker