TtmiCreateEventQueue
__int64 __fastcall TtmiCreateEventQueue(__int64 a1, _QWORD *a2, __int64 a3, UINT64 a4){
_ETHREAD *CurrentThread;
NTSTATUS v7;
unsigned int v8;
_QWORD *v9;
_QWORD *v10;
_QWORD *v11;
VOID *v13;
UINT64 ObjectBodySize;
UINT64 v15;
UINT64 v16;
_OBJECT_ATTRIBUTES ObjectAttributes;
VOID *Queue;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
*a2 = 0i64;
Queue = 0i64;
LOBYTE(a4) = CurrentThread->Tcb.PreviousMode;
memset(&ObjectAttributes.Length + 1, 0, 20);
memset(&ObjectAttributes.Attributes + 1, 0, 20);
LODWORD(v16) = 0;
LODWORD(v15) = 0;
LODWORD(ObjectBodySize) = 176;
ObjectAttributes.Length = 48;
ObjectAttributes.Attributes = 32;
v7 = ObCreateObjectEx(0i64, TtmpQueueObjectType, &ObjectAttributes, a4, v13, ObjectBodySize, v15, v16, &Queue, 0i64);
v8 = v7;
if( v7 >= 0 )
{
v9 = Queue;
memset(Queue, 0i64, 0xB0u);
v9[20] = v9 + 19;
v9[19] = v9 + 19;
ExInitializeResourceLite((INT64)(v9 + 3));
KeInitializeEvent((INT64)(v9 + 16), 0, 0);
*((_BYTE *)v9 + 168) = 1;
_InterlockedIncrement((volatile signed __int32 *)(a1 + 8));
v10 = Queue;
*((_QWORD *)Queue + 2) = a1;
v11 = *(_QWORD **)(a1 + 88);
if( *v11 != a1 + 80 )
__fastfail(3u);
v10[1] = v11;
*v10 = a1 + 80;
*v11 = v10;
*(_QWORD *)(a1 + 88) = v10;
TtmiLogQueueCreated(v10);
*a2 = v10;
return 0;
}
else
{
TtmiLogError((INT8 *)"TtmiCreateEventQueue", 0x237ui64, (unsigned int)v7, (unsigned int)v7);
}
return v8;
}Referenced by:
TtmpDispatchCreateEventQueue