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