PopFxActivateDevicesForSx
VOID __stdcall PopFxActivateDevicesForSx(UINT64 MaxLevel){
_ETHREAD *CurrentThread;
unsigned int v2;
ULONG_PTR i;
__int64 v4;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v2 = MaxLevel;
--*((_WORD *)CurrentThread + 242);
ExAcquirePushLockSharedEx((UINT64)&PopFxDeviceListLock, 0i64);
for( i = PopFxDeviceList; (ULONG_PTR *)i != &PopFxDeviceList; i = *(_QWORD *)i )
{
v4 = *(_QWORD *)(i + 48);
if( v4 && *(unsigned __int8 *)(v4 + 216) < v2 && (*(_DWORD *)(i + 824) & 1) == 0 )
{
PopFxActivateDevice(*(DEVICE_OBJECT **)(v4 + 32), 0);
_InterlockedOr((volatile signed __int32 *)(v4 + 296), 0x1000u);
}
}
if( _InterlockedCompareExchange64((volatile signed __int64 *)&PopFxDeviceListLock, 0i64, 17i64) != 17 )
ExfReleasePushLockShared((INT64 *)&PopFxDeviceListLock);
KeAbPostRelease(&PopFxDeviceListLock);
KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
}Referenced by:
PoBroadcastSystemState
PopFxPrepareDevicesForShutdown