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