PopFxIdleDevicesFromSx
VOID __stdcall PopFxIdleDevicesFromSx(UINT64 MaxLevel){
_ETHREAD *CurrentThread;
ULONG_PTR i;
__int64 v3;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--*((_WORD *)CurrentThread + 242);
ExAcquirePushLockSharedEx((UINT64)&PopFxDeviceListLock, 0i64);
for( i = PopFxDeviceList; (ULONG_PTR *)i != &PopFxDeviceList; i = *(_QWORD *)i )
{
v3 = *(_QWORD *)(i + 48);
if( v3 && (*(_DWORD *)(i + 824) & 1) == 0 && !*(_BYTE *)(v3 + 216) )
{
PoFxIdleDevice(*(DEVICE_OBJECT **)(v3 + 32));
_InterlockedAnd((volatile signed __int32 *)(v3 + 296), 0xFFFFEFFF);
}
}
if( _InterlockedCompareExchange64((volatile signed __int64 *)&PopFxDeviceListLock, 0i64, 17i64) != 17 )
ExfReleasePushLockShared((INT64 *)&PopFxDeviceListLock);
KeAbPostRelease(&PopFxDeviceListLock);
KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
}Referenced by:
PoBroadcastSystemState