TtmpAcquireSessionFromTerminalHandle

INT64 __fastcall TtmpAcquireSessionFromTerminalHandle(VOID *a1, CHAR a2, CHAR a3, _QWORD *a4, INT64 *a5){
  _ETHREAD *CurrentThread; 
  INT64 *v7; 
  KPROCESSOR_MODE v10; 
  _OBJECT_TYPE *v11; 
  NTSTATUS v12; 
  unsigned int v13; 
  INT64 v15; 
  INT64 v16; 
  unsigned int v17; 
  _ETHREAD *v18; 
  __int64 v19; 
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  v7 = a5;
  *a4 = 0i64;
  v10 = *((_BYTE *)CurrentThread + 562);
  v11 = TtmpTerminalObjectType;
  *v7 = 0i64;
  a5 = 0i64;
  v12 = ObReferenceObjectByHandle(a1, 2u, v11, v10, (PVOID *)&a5, 0i64);
  v13 = v12;
  if( v12 >= 0 )
  {
    v13 = 0;
    *v7 = (INT64)a5;
  }
  else
  {
    *v7 = 0i64;
    TtmiLogError((PSTR)"TtmiReferenceTerminalByHandle", 869i64, (unsigned int)v12, (unsigned int)v12);
  }
  if( (v13 & 0x80000000) != 0 )
  {
    TtmiLogError((PSTR)"TtmpAcquireSessionFromTerminalHandle", 88i64, v13, v13);
    return v13;
  }
  v15 = *v7;
  if( *(_DWORD *)(v15 + 28) )
  {
    if( !a3 )
    {
      v16 = 98i64;
      goto LABEL_9;
    }
  }
  else if( !a2 )
  {
    v16 = 93i64;
LABEL_9:
    v17 = -1073741788;
LABEL_10:
    TtmiLogError((PSTR)"TtmpAcquireSessionFromTerminalHandle", v16, 0xFFFFFFFFi64, v17);
    return v17;
  }
  v18 = (_ETHREAD *)KeGetCurrentThread();
  --*((_WORD *)v18 + 242);
  ExAcquireResourceExclusiveLite(&TtmpSessionLock, 1u);
  v19 = *(_QWORD *)(v15 + 16);
  if( (*(_DWORD *)(v19 + 4) & 4) != 0 )
  {
    ExReleaseResourceLite(&TtmpSessionLock);
    KeLeaveCriticalRegion();
    v16 = 105i64;
    v17 = -1073740715;
    goto LABEL_10;
  }
  *a4 = v19;
  return 0i64;
}

Referenced by:

TtmpDispatchAssignDevice
TtmpDispatchCreateEventQueue
TtmpDispatchCreateTerminal
TtmpDispatchEvacuateDevices
TtmpDispatchSetDefaultDeviceAssignment
TtmpDispatchSetDisplayPowerRequest
TtmpDispatchSetDisplayState
TtmpDispatchSetDisplayTimeouts
TtmpDispatchSetInputWakeCapability