TtmpAcquireSessionFromTerminalHandle

NTSTATUS __stdcall TtmpAcquireSessionFromTerminalHandle(
        VOID *TerminalHandle,
        UINT8 AllowTerminal0,
        UINT8 AllowTerminalN,
        _TTMI_SESSION **LockedSession,
        _TTMI_TERMINAL **Terminal){
  _ETHREAD *CurrentThread; 
  _TTMI_TERMINAL **v7; 
  INT8 PreviousMode; 
  _OBJECT_TYPE *v11; 
  NTSTATUS v12; 
  INT64 v13; 
  NTSTATUS v14; 
  _TTMI_TERMINAL *v16; 
  UINT64 v17; 
  unsigned int v18; 
  _ETHREAD *v19; 
  _TTMI_SESSION *v20; 

  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  v7 = Terminal;
  *LockedSession = 0i64;
  PreviousMode = CurrentThread->Tcb.PreviousMode;
  v11 = TtmpTerminalObjectType;
  *v7 = 0i64;
  Terminal = 0i64;
  v12 = ObReferenceObjectByHandle(TerminalHandle, 2ui64, v11, PreviousMode, (VOID **)&Terminal, 0i64);
  v14 = v12;
  if( v12 >= 0 )
  {
    v14 = 0;
    *v7 = (_TTMI_TERMINAL *)Terminal;
  }
  else
  {
    *v7 = 0i64;
    TtmiLogError((INT8 *)"TtmiReferenceTerminalByHandle", 0x365ui64, (unsigned int)v12, (unsigned int)v12);
  }
  if( v14 < 0 )
  {
    TtmiLogError((INT8 *)"TtmpAcquireSessionFromTerminalHandle", 0x58ui64, (unsigned int)v14, (unsigned int)v14);
    return v14;
  }
  v16 = *v7;
  if( v16[7] )
  {
    if( !AllowTerminalN )
    {
      v17 = 98i64;
      goto LABEL_9;
    }
  }
  else if( !AllowTerminal0 )
  {
    v17 = 93i64;
LABEL_9:
    v18 = -1073741788;
LABEL_10:
    TtmiLogError((INT8 *)"TtmpAcquireSessionFromTerminalHandle", v17, 0xFFFFFFFFi64, v18);
    return v18;
  }
  v19 = (_ETHREAD *)KeGetCurrentThread();
  --v19->Tcb.KernelApcDisable;
  ExAcquireResourceExclusiveLite((UINT64)&TtmpSessionLock, 1, v13);
  v20 = (_TTMI_SESSION *)*((_QWORD *)v16 + 2);
  if( (v20[1] & 4) != 0 )
  {
    ExReleaseResourceLite(&TtmpSessionLock);
    KeLeaveCriticalRegion();
    v17 = 105i64;
    v18 = -1073740715;
    goto LABEL_10;
  }
  *LockedSession = v20;
  return 0;
}

Referenced by:

TtmpDispatchAssignDevice
TtmpDispatchCreateEventQueue
TtmpDispatchCreateTerminal
TtmpDispatchEvacuateDevices
TtmpDispatchSetDefaultDeviceAssignment
TtmpDispatchSetDisplayPowerRequest
TtmpDispatchSetDisplayState
TtmpDispatchSetDisplayTimeouts
TtmpDispatchSetInputWakeCapability