TtmpUpdateTerminalState

VOID __fastcall TtmpUpdateTerminalState(INT64 a1, INT64 a2, CHAR *a3, CHAR *a4){
  int v7; 
  int v8; 
  int v9; 
  unsigned int v10; 
  _BOOL8 v11; 
  CHAR v12; 
  int v13; 
  int v14; 
  int v15; 
  CHAR v16; 
  INT64 a3a[2]; 
  __int128 v18; 
  INT64 a2a[5]; 
  char v20; 
  bool v21; 
  __int16 v22; 
  int v23; 
  int v24; 
  int v25; 
  a2a[0] = *(unsigned int *)(a2 + 40);
  a2a[1] = *(_QWORD *)(a2 + 80);
  v22 = 0;
  v25 = 0;
  *(_OWORD *)a3a = 0i64;
  a2a[2] = *(_QWORD *)&KUSER_SHARED_DATA.InterruptTime.LowPart;
  a2a[3] = *(_QWORD *)(a2 + 64);
  a2a[4] = *(_QWORD *)(a2 + 72);
  v7 = *(_DWORD *)(a2 + 36);
  v18 = 0i64;
  if( *(_DWORD *)(a2 + 32) || (v20 = 0, (v7 & 8) != 0) )
    v20 = 1;
  v21 = (v7 & 0x60) != 0;
  *(_DWORD *)(a2 + 36) = v7 & 0xFFFFFF9F;
  v23 = *(_DWORD *)(a2 + 52);
  v8 = *(_DWORD *)(a2 + 56);
  *(_QWORD *)(a2 + 52) = 0i64;
  v24 = v8;
  TtmpTsmIterate((INT64)a2a, (INT64)a3a);
  TtmiLogTerminalStateMachine(*(unsigned int *)(a2 + 28), (INT64)a2a, a3a);
  v9 = a3a[0];
  *(_QWORD *)(a2 + 80) = v18;
  *(_DWORD *)(a2 + 40) = v9;
  if( !BYTE4(a3a[0])
    || (v10 = *(_DWORD *)(a2 + 36), *(_DWORD *)(a2 + 44) = a3a[1], v11 = v9 != 1, ((v10 >> 4) & 1) == v11) )
  {
    v12 = 0;
  }
  else
  {
    v12 = 1;
    *(_DWORD *)(a2 + 36) = v10 & 0xFFFFFFEF | (16 * v11);
  }
  *a3 = v12;
  v13 = *(_DWORD *)(a2 + 44);
  if( (*(_DWORD *)(a2 + 36) & 8) != 0 )
    v14 = 0;
  else
    v14 = *(_DWORD *)(a2 + 40);
  v15 = *(_DWORD *)(a2 + 276);
  if( v15 == v14 )
  {
    v16 = 0;
  }
  else
  {
    if( !v15 || !v14 )
      v13 = 22;
    *(_DWORD *)(a2 + 280) = v13;
    v15 = v14;
    *(_DWORD *)(a2 + 276) = v14;
    v16 = 1;
  }
  *a4 = v16;
  if( v15 )
  {
    if( v15 == 1 )
      *(_DWORD *)(a2 + 48) = 2;
    else
      *(_DWORD *)(a2 + 48) = 0;
  }
  else
  {
    *(_DWORD *)(a2 + 48) = 1;
  }
  TtmpResetEvaluationTimer((PADAPTER_OBJECT)a2, *((__int64 *)&v18 + 1));
}

Referenced by:

TtmiSessionTerminalListWorker