PopUpdateWakeSourceWorker
VOID __stdcall PopUpdateWakeSourceWorker(VOID *Context){
PVOID v1;
INT64 v2;
int v3;
CHAR **v4;
CHAR *v5;
CHAR *v6;
__int64 *v7;
__int64 **v8;
_QWORD *v9;
struct _KEVENT *v10;
_QWORD *v11;
PVOID *v12;
PVOID v13;
__int64 v14;
PVOID P;
PVOID *p_P;
struct _KLOCK_QUEUE_HANDLE LockHandle;
CHAR *a2;
__int64 *a3;
a3 = 0i64;
a2 = 0i64;
p_P = &P;
P = &P;
memset(&LockHandle, 0, sizeof(LockHandle));
PopAcquireWakeSourceSpinLock(&LockHandle);
while( 1 )
{
v1 = PopWakeSourceWorkList;
if( PopWakeSourceWorkList == &PopWakeSourceWorkList )
break;
PopReleaseWakeSourceSpinLock(&LockHandle);
v2 = *((_QWORD *)v1 + 3);
IoControlPnpDeviceActionQueue(1u);
v3 = PopProcessWakeSourceWork((INT64)v1, &a2, &a3);
IoControlPnpDeviceActionQueue(0);
ObfDereferenceObjectWithTag(*((PVOID *)v1 + 2), 0x67446F50ui64);
PopAcquireWakeSourceSpinLock(&LockHandle);
if( (v2 == PopCurrentWakeInfo || v2 == PopPendingWakeInfo) && v3 >= 0 )
{
v4 = *(CHAR ***)(v2 + 32);
if( *v4 != (CHAR *)(v2 + 24) )
goto LABEL_25;
v5 = a2;
a2 = 0i64;
*(_QWORD *)v5 = v2 + 24;
*((_QWORD *)v5 + 1) = v4;
*v4 = v5;
*(_QWORD *)(v2 + 32) = v5;
++*(_DWORD *)(v2 + 40);
v6 = (CHAR *)a3;
if( !a3 )
goto LABEL_15;
v7 = (__int64 *)*a3;
if( *(__int64 **)(*a3 + 8) != a3 )
goto LABEL_25;
v8 = (__int64 **)a3[1];
if( *v8 != a3 )
goto LABEL_25;
*v8 = v7;
v7[1] = (__int64)v8;
--*(_DWORD *)(v2 + 40);
a2 = v6;
}
else
{
v6 = a2;
}
if( v6 )
{
v9 = p_P;
if( *p_P != &P )
goto LABEL_25;
*((_QWORD *)v6 + 1) = p_P;
*(_QWORD *)v6 = &P;
*v9 = v6;
p_P = (PVOID *)v6;
}
LABEL_15:
PopWakeInfoDereference(v2);
v10 = (struct _KEVENT *)*((_QWORD *)v1 + 4);
if( v10 )
KeSetEvent(v10, 0);
v11 = *(_QWORD **)v1;
if( *(PVOID *)(*(_QWORD *)v1 + 8i64) != v1 || (v12 = (PVOID *)*((_QWORD *)v1 + 1), *v12 != v1) )
LABEL_25:
__fastfail(3u);
*v12 = v11;
v11[1] = v12;
ExFreePoolWithTag(v1, 0x206D654Du);
}
PopWakeSourceWorkInProgress = 0;
PopReleaseWakeSourceSpinLock(&LockHandle);
while( 1 )
{
v13 = P;
if( P == &P )
break;
if( *((PVOID **)P + 1) != &P )
goto LABEL_25;
v14 = *(_QWORD *)P;
if( *(PVOID *)(*(_QWORD *)P + 8i64) != P )
goto LABEL_25;
P = *(PVOID *)P;
*(_QWORD *)(v14 + 8) = &P;
PopFreeWakeSource(v13, &P);
}
}Referenced by:
No references.