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