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