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