TtmiCreateTerminal
NTSTATUS __stdcall TtmiCreateTerminal(
_TTMI_SESSION *LockedSession,
UINT64 DesiredAccess,
INT8 PreviousMode,
VOID **Handle,
UINT64 *TerminalId,
_TTMI_TERMINAL **Terminal){
UINT64 *v6;
unsigned int v8;
unsigned int ClearBitsAndSet;
UINT64 v12;
NTSTATUS v13;
INT64 v14;
INT64 v15;
UINT64 v16;
NTSTATUS v17;
UINT64 *v18;
_ADAPTER_OBJECT *v19;
_TTMI_SESSION **v20;
NTSTATUS inserted;
_TTMI_TERMINAL **v22;
VOID *v24;
VOID *v25;
VOID *v26;
_TABLE_SEARCH_RESULT ObjectBodySize;
UINT64 ObjectBodySizea;
PVOID *Handlea;
UINT64 v30;
_OBJECT_ATTRIBUTES ObjectAttributes;
v6 = TerminalId;
*Handle = 0i64;
TerminalId = 0i64;
v8 = DesiredAccess;
*(_DWORD *)v6 = -1;
ClearBitsAndSet = (unsigned int)RtlFindClearBitsAndSet(
(_RTL_AVL_TABLE *)(LockedSession + 14),
(VOID *)1,
0i64,
(UINT8 *)Handle,
v24,
ObjectBodySize);
if( ClearBitsAndSet == -1 )
{
v13 = -1073741756;
TtmiLogError((INT8 *)"TtmiAcquireTerminalId", 0x643ui64, 0xFFFFFFFFi64, 3221225540i64);
v14 = 3221225540i64;
v15 = 3221225540i64;
v16 = 581i64;
LABEL_3:
TtmiLogError((INT8 *)"TtmiCreateTerminal", v16, v15, v14);
return v13;
}
LOBYTE(v12) = PreviousMode;
LODWORD(v30) = 0;
LODWORD(Handlea) = 0;
memset(&ObjectAttributes.ObjectName, 0, 32);
ObjectAttributes.Attributes = PreviousMode == 0 ? 0x200 : 0;
*(_OWORD *)&ObjectAttributes.Length = 0i64;
ObjectAttributes.Length = 48;
LODWORD(ObjectBodySizea) = 288;
v17 = ObCreateObjectEx(
0i64,
TtmpTerminalObjectType,
&ObjectAttributes,
v12,
v25,
ObjectBodySizea,
(UINT64)Handlea,
v30,
(VOID **)&TerminalId,
0i64);
v13 = v17;
if( v17 < 0 )
{
v14 = (unsigned int)v17;
v15 = (unsigned int)v17;
v16 = 614i64;
_bittestandreset(*((signed __int32 **)LockedSession + 8), ClearBitsAndSet);
goto LABEL_3;
}
v18 = TerminalId;
ObfReferenceObject(TerminalId);
memset(v18, 0i64, 0x120u);
*((_DWORD *)v18 + 6) = 1416459348;
*((_DWORD *)v18 + 7) = ClearBitsAndSet;
if( ClearBitsAndSet )
{
*((_DWORD *)v18 + 10) = 1;
*((_DWORD *)v18 + 69) = 1;
*((_DWORD *)v18 + 12) = 2;
v18[9] = 300000000i64;
}
else
{
*((_DWORD *)v18 + 10) = 3;
*((_DWORD *)v18 + 69) = 3;
*((_DWORD *)v18 + 12) = 0;
*((_DWORD *)v18 + 9) |= 0x10u;
v18 = TerminalId;
TerminalId[10] = *(_QWORD *)&KUSER_SHARED_DATA.InterruptTime.LowPart;
TtmiUpdateActiveTerminalCount(LockedSession, 1u, MonitorRequestReasonTerminal);
}
KeInitializeTimerEx((INT64)(v18 + 11), 0);
KeInitializeDpc((PRKDPC)(v18 + 19), TtmpScheduledEvaluationDpc, v18);
v18[27] = 0i64;
v18[29] = (UINT64)TtmpScheduledEvaluationWorker;
v18[30] = (UINT64)v18;
_InterlockedAdd(LockedSession + 2, 1u);
v19 = (_ADAPTER_OBJECT *)TerminalId;
TerminalId[2] = (UINT64)LockedSession;
v20 = (_TTMI_SESSION **)*((_QWORD *)LockedSession + 6);
if( *v20 != LockedSession + 10 )
__fastfail(3u);
v19->AdapterObject.DmaHeader.DmaOperations = (_DMA_OPERATIONS *)v20;
*(_QWORD *)&v19->AdapterObject.DmaHeader.Version = LockedSession + 10;
*v20 = (_TTMI_SESSION *)v19;
*((_QWORD *)LockedSession + 6) = v19;
TtmiLogTerminalCreated(v19, ClearBitsAndSet);
LODWORD(v26) = 0;
inserted = ObInsertObjectEx(v19, 0i64, v8, 1ui64, (UINT64)v26, 0i64, Handle);
v13 = inserted;
if( inserted >= 0 )
{
v22 = Terminal;
*(_DWORD *)v6 = ClearBitsAndSet;
if( v22 )
*v22 = (_TTMI_TERMINAL *)v19;
else
HalPutDmaAdapter(v19);
return 0;
}
else
{
TtmiLogError((INT8 *)"TtmiCreateTerminal", 0x2C1ui64, (unsigned int)inserted, (unsigned int)inserted);
TtmpSetTerminalPendingCleanup(LockedSession, (_TTMI_TERMINAL *)v19);
}
return v13;
}Referenced by:
TtmpDispatchCreateTerminal