PopUpdateWakeSource
NTSTATUS __stdcall PopUpdateWakeSource(_DEVICE_OBJECT *Pdo){
VOID **PoolWithTag;
NTSTATUS v3;
VOID **v4;
__int64 v5;
VOID ***v6;
bool v7;
_KLOCK_QUEUE_HANDLE LockHandle;
memset(&LockHandle, 0, sizeof(LockHandle));
PoolWithTag = ExAllocatePoolWithTag(0x200ui64, 0x28ui64, 544040269i64);
v3 = 0;
v4 = PoolWithTag;
if( !PoolWithTag )
return -1073741670;
*(_OWORD *)PoolWithTag = 0i64;
*((_OWORD *)PoolWithTag + 1) = 0i64;
PoolWithTag[4] = 0i64;
KeAcquireInStackQueuedSpinLock((PKSPIN_LOCK)&stru_140C23628 + 355, &LockHandle);
if( *(&stru_140C23628 + 357) )
{
ObfReferenceObjectWithTag(Pdo, 0x67446F50ui64);
v5 = *(&stru_140C23628 + 357);
v4[3] = (VOID *)*(&stru_140C23628 + 357);
v4[2] = Pdo;
_InterlockedIncrement((volatile signed __int32 *)(v5 + 16));
v6 = (VOID ***)*(&stru_140C23628 + 362);
if( (_UNKNOWN *)**(&stru_140C23628 + 362) != (_UNKNOWN *)((char *)&stru_140C23628 + 2888) )
__fastfail(3u);
v7 = *(&stru_140C23628 + 2904) == 0;
*v4 = (char *)&stru_140C23628 + 2888;
v4[1] = v6;
*v6 = v4;
*(&stru_140C23628 + 362) = v4;
v4 = 0i64;
if( v7 )
{
*(&stru_140C23628 + 2904) = 1;
ExQueueWorkItem((PWORK_QUEUE_ITEM)((char *)&stru_140C23628 + 2968), DelayedWorkQueue);
}
}
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
__writecr8(LockHandle.OldIrql);
if( v4 )
ExFreePoolWithTag(v4, 0x206D654Du);
return v3;
}Referenced by:
PoSetSystemWakeDevice
PopRequestCompletion