PopSleepDeviceList

VOID __stdcall PopSleepDeviceList(_POP_DEVICE_SYS_STATE *DevState, _PO_NOTIFY_ORDER_LEVEL *Level){
  signed int ActiveCount; 
  _LIST_ENTRY *p_ReadySleep; 
  _LIST_ENTRY *Flink; 
  int v6; 
  int v7; 
  _PO_DEVICE_NOTIFY *v8; 
  _LIST_ENTRY *v9; 
  _LIST_ENTRY *Blink; 
  __int16 v11; 
  char v12; 
  char v13; 
  int v14; 
  __int64 v15[2]; 
  _BYTE v16[4]; 
  int v17; 
  __int64 v18[2]; 
  int v19; 
  int v20; 
  char v21[4]; 
  int v22; 
  __int64 v23[2]; 
  int v24; 
  int v25; 
  _KLOCK_QUEUE_HANDLE LockHandle; 
  VOID *Object[2]; 

  ActiveCount = Level->ActiveCount;
  p_ReadySleep = &Level->ReadySleep;
  v13 = 0;
  Flink = Level->ReadySleep.Flink;
  v6 = 0;
  v16[1] = 0;
  v7 = 0;
  v16[3] = 0;
  v20 = 0;
  memset(&LockHandle, 0, sizeof(LockHandle));
  v21[1] = 0;
  v21[3] = 0;
  v25 = 0;
  while( Flink != p_ReadySleep )
  {
    Flink = Flink->Flink;
    ++v7;
  }
  v11 = 1;
  v15[1] = (__int64)v15;
  v15[0] = (__int64)v15;
  v23[1] = (__int64)v23;
  v23[0] = (__int64)v23;
  v18[1] = (__int64)v18;
  v18[0] = (__int64)v18;
  DevState->AbortEvent = (_KEVENT *)&v11;
  DevState->ReadySemaphore = (_KSEMAPHORE *)v21;
  DevState->FinishedSemaphore = (_KSEMAPHORE *)v16;
  Object[0] = &v11;
  Object[1] = v21;
  v12 = 6;
  v14 = 0;
  v21[0] = 5;
  v21[2] = 8;
  v22 = v7;
  v24 = ActiveCount;
  v16[0] = 5;
  v16[2] = 8;
  v17 = 0;
  v19 = ActiveCount;
  if( ActiveCount > 0 )
  {
    do
    {
      KeWaitForMultipleObjects(2ui64, Object, WaitAny, Executive, 0, 0, 0i64, 0i64);
      if( DevState->Status < 0 )
        break;
      KeAcquireInStackQueuedSpinLock((PKSPIN_LOCK)rcx0 + 1, &LockHandle);
      v8 = (_PO_DEVICE_NOTIFY *)p_ReadySleep->Flink;
      v9 = p_ReadySleep->Flink->Flink;
      if( p_ReadySleep->Flink->Blink == p_ReadySleep && (_PO_DEVICE_NOTIFY *)v9->Blink == v8 )
      {
        p_ReadySleep->Flink = v9;
        v9->Blink = p_ReadySleep;
        Blink = DevState->Pending.Blink;
        if( Blink->Flink == &DevState->Pending )
          continue;
      }
      __fastfail(3u);
      v8->Link.Blink = Blink;
      v8->Link.Flink = &DevState->Pending;
      Blink->Flink = &v8->Link;
      DevState->Pending.Blink = &v8->Link;
      KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
      __writecr8(LockHandle.OldIrql);
      --ActiveCount;
      ++v6;
      if( PopIsNotifyForDirectedPowerTransition((INT64)v8) )
        PopIssueDirectedPowerTransition((INT64)DevState, (__int64)v8);
      else
        PopNotifyDevice(DevState, v8);
      if( (*(&stru_140C23628 + 582) & 0x80000) != 0 )
      {
        while( v6 > 0 )
        {
          KeWaitForSingleObject((UINT64)v16, 0, 0, 0, 0i64);
          --v6;
        }
      }
    }
    while( ActiveCount > 0 );
    while( v6 > 0 )
    {
      KeWaitForSingleObject((UINT64)v16, 0, 0, 0, 0i64);
      --v6;
    }
  }
  DevState->AbortEvent = 0i64;
  DevState->ReadySemaphore = 0i64;
  DevState->FinishedSemaphore = 0i64;
}

Referenced by:

PoBroadcastSystemState