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