PopTimeoutWakeTracking
INT64 __fastcall PopTimeoutWakeTracking(INT64 *a1){
int *v2;
INT64 v3;
INT64 result;
__int64 i;
struct _KLOCK_QUEUE_HANDLE LockHandle;
int v7[2];
__int64 v8[2];
v7[0] = 393217;
v7[1] = 0;
v8[1] = (__int64)v8;
v2 = 0i64;
v8[0] = (__int64)v8;
memset(&LockHandle, 0, sizeof(LockHandle));
KeAcquireInStackQueuedSpinLock(&PopWakeSourceLock, &LockHandle);
if( a1 == (INT64 *)PopCurrentWakeInfo )
{
PopCurrentWakeInfo = 0i64;
PopPendingWakeInfo = (__int64)a1;
if( PopWakeSourceWorkInProgress )
{
for( i = qword_140C24178; (PVOID *)i != &PopWakeSourceWorkList; i = *(_QWORD *)(i + 8) )
{
if( *(INT64 **)(i + 24) == a1 )
{
*(_QWORD *)(i + 32) = v7;
v2 = v7;
break;
}
}
}
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
__writecr8(LockHandle.OldIrql);
if( v2 )
KeWaitForSingleObject(v2, Executive, 0, 0, 0i64);
KeAcquireInStackQueuedSpinLock(&PopWakeSourceLock, &LockHandle);
if( a1 == (INT64 *)PopPendingWakeInfo )
{
v3 = PopWakeInfoList;
if( *(__int64 **)(PopWakeInfoList + 8) != &PopWakeInfoList )
__fastfail(3u);
++PopWakeInfoCount;
PopPendingWakeInfo = 0i64;
a1[1] = (INT64)&PopWakeInfoList;
*a1 = v3;
*(_QWORD *)(v3 + 8) = a1;
PopWakeInfoList = (__int64)a1;
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
__writecr8(LockHandle.OldIrql);
PopFinalizeWakeInfo((INT64)a1);
KeAcquireInStackQueuedSpinLock(&PopWakeSourceLock, &LockHandle);
}
}
PopWakeInfoDereference((INT64)a1);
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
result = (unsigned int)KiIrqlFlags;
__writecr8(LockHandle.OldIrql);
return result;
}Referenced by:
PopWakeSourceTimeoutWorker