TtmiRetrieveEventFromQueue

__int64 __fastcall TtmiRetrieveEventFromQueue(__int64 a1, _OWORD *a2){
  _ETHREAD *CurrentThread; 
  UINT64 v5; 
  UINT8 v6; 
  UINT8 v7; 
  unsigned int v8; 
  INT64 v9; 
  _QWORD *v10; 
  _QWORD *v11; 
  __int64 v12; 
  _OWORD *v13; 
  __int64 v14; 
  __int128 v15; 
  IRP *v17; 
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  --*((_WORD *)CurrentThread + 242);
  ExAcquireResourceExclusiveLite((ERESOURCE *)(a1 + 24), 1u);
  v8 = 0;
  if( !*(_BYTE *)(a1 + 168) )
  {
    v8 = -1073740032;
    v9 = 477i64;
LABEL_3:
    TtmiLogError((PSTR)"TtmiRetrieveEventFromQueue", v9, 0xFFFFFFFFi64, v8);
    goto LABEL_13;
  }
  v10 = (_QWORD *)(a1 + 152);
  v11 = *(_QWORD **)(a1 + 152);
  if( v11 == (_QWORD *)(a1 + 152) )
  {
    v8 = -2147483622;
    v9 = 482i64;
    goto LABEL_3;
  }
  if( (_QWORD *)v11[1] != v10 || (v12 = *v11, *(_QWORD **)(*v11 + 8i64) != v11) )
    __fastfail(3u);
  *v10 = v12;
  *(_QWORD *)(v12 + 8) = v10;
  if( (_QWORD *)*v10 == v10 )
    KeResetEvent((VOID *)(a1 + 128), v5, v6, v7, v17);
  v13 = v11 + 2;
  TtmiLogQueueDequeueEvent();
  v14 = 4i64;
  do
  {
    *a2 = *v13;
    a2[1] = v13[1];
    a2[2] = v13[2];
    a2[3] = v13[3];
    a2[4] = v13[4];
    a2[5] = v13[5];
    a2[6] = v13[6];
    a2 += 8;
    v15 = v13[7];
    v13 += 8;
    *(a2 - 1) = v15;
    --v14;
  }
  while( v14 );
  *a2 = *v13;
  a2[1] = v13[1];
  ExFreePoolWithTag(v11, 0x716D7454u);
LABEL_13:
  ExReleaseResourceLite((PERESOURCE)(a1 + 24));
  KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
  return v8;
}

Referenced by:

TtmpDispatchGetTerminalEvent