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