PopUpdateWakeSourceWorker
VOID __stdcall PopUpdateWakeSourceWorker(VOID *Context){
__int64 *v1;
__int64 v2;
NTSTATUS v3;
POP_WAKE_SOURCE **v4;
POP_WAKE_SOURCE *v5;
POP_WAKE_SOURCE *v6;
__int64 v7;
POP_WAKE_SOURCE **v8;
_POP_WAKE_SOURCE **v9;
_KEVENT *v10;
__int64 *v11;
__int64 **v12;
_POP_WAKE_SOURCE *v13;
__int64 v14;
_POP_WAKE_SOURCE *WakeSource;
_POP_WAKE_SOURCE **p_WakeSource;
_KLOCK_QUEUE_HANDLE LockHandle;
POP_WAKE_SOURCE *NewWakeSource;
POP_WAKE_SOURCE *RemoveWakeSource;
RemoveWakeSource = 0i64;
NewWakeSource = 0i64;
p_WakeSource = &WakeSource;
WakeSource = (_POP_WAKE_SOURCE *)&WakeSource;
memset(&LockHandle, 0, sizeof(LockHandle));
PopAcquireWakeSourceSpinLock(&LockHandle);
while( 1 )
{
v1 = (__int64 *)*(&stru_140C23628 + 361);
if( (_UNKNOWN *)*(&stru_140C23628 + 361) == (_UNKNOWN *)((char *)&stru_140C23628 + 2888) )
break;
PopReleaseWakeSourceSpinLock(&LockHandle);
v2 = v1[3];
IoControlPnpDeviceActionQueue(1u);
v3 = PopProcessWakeSourceWork((POP_WAKE_SOURCE_WORK *)v1, &NewWakeSource, &RemoveWakeSource);
IoControlPnpDeviceActionQueue(0);
ObfDereferenceObjectWithTag((VOID *)v1[2], 0x67446F50ui64);
PopAcquireWakeSourceSpinLock(&LockHandle);
if( (v2 == *(&stru_140C23628 + 357) || v2 == *(&stru_140C23628 + 356)) && v3 >= 0 )
{
v4 = *(POP_WAKE_SOURCE ***)(v2 + 32);
if( *v4 != (POP_WAKE_SOURCE *)(v2 + 24) )
goto LABEL_25;
v5 = NewWakeSource;
NewWakeSource = 0i64;
*(_QWORD *)v5 = v2 + 24;
*((_QWORD *)v5 + 1) = v4;
*v4 = v5;
*(_QWORD *)(v2 + 32) = v5;
++*(_DWORD *)(v2 + 40);
v6 = RemoveWakeSource;
if( !RemoveWakeSource )
goto LABEL_15;
v7 = *(_QWORD *)RemoveWakeSource;
if( *(POP_WAKE_SOURCE **)(*(_QWORD *)RemoveWakeSource + 8i64) != RemoveWakeSource )
goto LABEL_25;
v8 = (POP_WAKE_SOURCE **)*((_QWORD *)RemoveWakeSource + 1);
if( *v8 != RemoveWakeSource )
goto LABEL_25;
*v8 = (POP_WAKE_SOURCE *)v7;
*(_QWORD *)(v7 + 8) = v8;
--*(_DWORD *)(v2 + 40);
NewWakeSource = v6;
}
else
{
v6 = NewWakeSource;
}
if( v6 )
{
v9 = p_WakeSource;
if( *p_WakeSource != (_POP_WAKE_SOURCE *)&WakeSource )
goto LABEL_25;
*((_QWORD *)v6 + 1) = p_WakeSource;
*(_QWORD *)v6 = &WakeSource;
*v9 = v6;
p_WakeSource = (_POP_WAKE_SOURCE **)v6;
}
LABEL_15:
PopWakeInfoDereference(v2);
v10 = (_KEVENT *)v1[4];
if( v10 )
KeSetEvent(v10, 0, 0);
v11 = (__int64 *)*v1;
if( *(__int64 **)(*v1 + 8) != v1 || (v12 = (__int64 **)v1[1], *v12 != v1) )
LABEL_25:
__fastfail(3u);
*v12 = v11;
v11[1] = (__int64)v12;
ExFreePoolWithTag(v1, 0x206D654Du);
}
*(&stru_140C23628 + 2904) = 0;
PopReleaseWakeSourceSpinLock(&LockHandle);
while( 1 )
{
v13 = WakeSource;
if( WakeSource == (_POP_WAKE_SOURCE *)&WakeSource )
break;
if( *((_POP_WAKE_SOURCE ***)WakeSource + 1) != &WakeSource )
goto LABEL_25;
v14 = *(_QWORD *)WakeSource;
if( *(_POP_WAKE_SOURCE **)(*(_QWORD *)WakeSource + 8i64) != WakeSource )
goto LABEL_25;
WakeSource = *(_POP_WAKE_SOURCE **)WakeSource;
*(_QWORD *)(v14 + 8) = &WakeSource;
PopFreeWakeSource(v13);
}
}Referenced by:
No references.