TtmiRetrieveEventFromQueue

__int64 __fastcall TtmiRetrieveEventFromQueue(__int64 a1, _OWORD *a2, INT64 a3){
  _ETHREAD *CurrentThread; 
  unsigned int v6; 
  UINT64 v7; 
  _QWORD *v8; 
  _QWORD *v9; 
  __int64 v10; 
  _OWORD *v11; 
  __int64 v12; 
  __int128 v13; 

  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  --CurrentThread->Tcb.KernelApcDisable;
  ExAcquireResourceExclusiveLite(a1 + 24, 1, a3);
  v6 = 0;
  if( !*(_BYTE *)(a1 + 168) )
  {
    v6 = -1073740032;
    v7 = 477i64;
LABEL_3:
    TtmiLogError((INT8 *)"TtmiRetrieveEventFromQueue", v7, 0xFFFFFFFFi64, v6);
    goto LABEL_13;
  }
  v8 = (_QWORD *)(a1 + 152);
  v9 = *(_QWORD **)(a1 + 152);
  if( v9 == (_QWORD *)(a1 + 152) )
  {
    v6 = -2147483622;
    v7 = 482i64;
    goto LABEL_3;
  }
  if( (_QWORD *)v9[1] != v8 || (v10 = *v9, *(_QWORD **)(*v9 + 8i64) != v9) )
    __fastfail(3u);
  *v8 = v10;
  *(_QWORD *)(v10 + 8) = v8;
  if( (_QWORD *)*v8 == v8 )
    KeResetEvent((_KEVENT *)(a1 + 128));
  v11 = v9 + 2;
  TtmiLogQueueDequeueEvent();
  v12 = 4i64;
  do
  {
    *a2 = *v11;
    a2[1] = v11[1];
    a2[2] = v11[2];
    a2[3] = v11[3];
    a2[4] = v11[4];
    a2[5] = v11[5];
    a2[6] = v11[6];
    a2 += 8;
    v13 = v11[7];
    v11 += 8;
    *(a2 - 1) = v13;
    --v12;
  }
  while( v12 );
  *a2 = *v11;
  a2[1] = v11[1];
  ExFreePoolWithTag(v9, 0x716D7454u);
LABEL_13:
  ExReleaseResourceLite((PERESOURCE)(a1 + 24));
  KeLeaveCriticalRegionThread(KeGetCurrentThread());
  return v6;
}

Referenced by:

TtmpDispatchGetTerminalEvent