PopUpdateWakeSource
NTSTATUS __stdcall PopUpdateWakeSource(DEVICE_OBJECT *Pdo){
_QWORD *PoolWithTag;
NTSTATUS v3;
_QWORD *v4;
INT64 v5;
_QWORD *v6;
bool v7;
struct _KLOCK_QUEUE_HANDLE LockHandle;
memset(&LockHandle, 0, sizeof(LockHandle));
PoolWithTag = ExAllocatePoolWithTag(NonPagedPoolNx, 0x28ui64, 0x206D654Dui64);
v3 = 0;
v4 = PoolWithTag;
if( !PoolWithTag )
return -1073741670;
*(_OWORD *)PoolWithTag = 0i64;
*((_OWORD *)PoolWithTag + 1) = 0i64;
PoolWithTag[4] = 0i64;
KeAcquireInStackQueuedSpinLock(&PopWakeSourceLock, &LockHandle);
if( PopCurrentWakeInfo )
{
ObfReferenceObjectWithTag(Pdo, 0x67446F50u);
v5 = PopCurrentWakeInfo;
v4[3] = PopCurrentWakeInfo;
v4[2] = Pdo;
_InterlockedIncrement((volatile signed __int32 *)(v5 + 16));
v6 = (_QWORD *)qword_140C24178;
if( *(PVOID **)qword_140C24178 != &PopWakeSourceWorkList )
__fastfail(3u);
v7 = PopWakeSourceWorkInProgress == 0;
*v4 = &PopWakeSourceWorkList;
v4[1] = v6;
*v6 = v4;
qword_140C24178 = (__int64)v4;
v4 = 0i64;
if( v7 )
{
PopWakeSourceWorkInProgress = 1;
ExQueueWorkItem(&PopWakeSourceWorkItem, DelayedWorkQueue);
}
}
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
__writecr8(LockHandle.OldIrql);
if( v4 )
ExFreePoolWithTag(v4, 0x206D654Du);
return v3;
}Referenced by:
PoSetSystemWakeDevice
PopRequestCompletion