PopFxSetDeviceAccountingCsPlatformState
void __fastcall PopFxSetDeviceAccountingCsPlatformState(char a1){
char v1;
int v2;
int v3;
_ETHREAD *CurrentThread;
ULONG_PTR i;
__int64 v6;
DEVICE_OBJECT *v7;
char MinimumDevicePowerState;
UINT64 v9;
unsigned __int8 v10;
unsigned __int64 v11;
char v12;
unsigned int v13;
__int64 v14;
CHAR MinimumComponentIdleState;
UINT64 v16;
unsigned __int8 v17;
unsigned __int64 v18;
UINT64 a4;
DEVICE_OBJECT *Pdo;
v1 = a1;
LODWORD(a4) = 0;
v2 = _InterlockedCompareExchange(&PopFxDeviceAccountingLevel, 0, 0);
v3 = v2;
if( !v2 || v2 < 0 )
{
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--*((_WORD *)CurrentThread + 242);
ExAcquirePushLockSharedEx((UINT64)&PopFxDeviceListLock, 0i64);
for( i = PopFxDeviceList; (ULONG_PTR *)i != &PopFxDeviceList; i = *(_QWORD *)i )
{
v6 = *(_QWORD *)(i + 48);
if( v6 )
{
v7 = *(DEVICE_OBJECT **)(v6 + 32);
Pdo = v7;
PopFxActivateDevice(v7, 0);
MinimumDevicePowerState = PopPepGetMinimumDevicePowerState(*(_QWORD *)(i + 56), v1, 1, &a4, 0i64);
KeAcquireSpinLockRaiseToDpc((UINT64 *)(i + 600), v9);
v11 = v10;
*(_DWORD *)(i + 616) = v3;
memset(i + 632, 0i64);
if( MinimumDevicePowerState && (int)a4 > 1 )
{
*(_DWORD *)(i + 612) = a4;
*(_BYTE *)(i + 608) = 1;
*(_QWORD *)(i + 624) = *(_QWORD *)&KUSER_SHARED_DATA.InterruptTime.LowPart;
_InterlockedOr((volatile signed __int32 *)(i + 824), 0x10u);
}
else
{
*(_QWORD *)(i + 624) = 0i64;
*(_BYTE *)(i + 608) = 0;
}
KxReleaseSpinLock((UINT64 *)(i + 600));
__writecr8(v11);
v12 = 0;
v13 = 0;
if( !*(_DWORD *)(i + 828) )
goto LABEL_17;
do
{
v14 = *(_QWORD *)(*(_QWORD *)(i + 832) + 8i64 * v13) + 200i64;
MinimumComponentIdleState = PopPepGetMinimumComponentIdleState(*(_QWORD *)(i + 56), v13, a1, &a4);
KeAcquireSpinLockRaiseToDpc((UINT64 *)v14, v16);
v18 = v17;
*(_DWORD *)(v14 + 16) = v3;
memset(v14 + 32, 0i64);
if( MinimumComponentIdleState && (_DWORD)a4 )
{
v12 = 1;
*(_DWORD *)(v14 + 12) = a4;
*(_BYTE *)(v14 + 8) = 1;
*(_QWORD *)(v14 + 24) = *(_QWORD *)&KUSER_SHARED_DATA.InterruptTime.LowPart;
_InterlockedOr((volatile signed __int32 *)(i + 824), 0x10u);
}
else
{
*(_BYTE *)(v14 + 8) = 0;
*(_QWORD *)(v14 + 24) = 0i64;
}
KxReleaseSpinLock((UINT64 *)v14);
__writecr8(v18);
++v13;
}
while( v13 < *(_DWORD *)(i + 828) );
v7 = Pdo;
v1 = a1;
if( v12 )
_InterlockedOr((volatile signed __int32 *)(i + 824), 0x100u);
else
LABEL_17:
_InterlockedAnd((volatile signed __int32 *)(i + 824), 0xFFFFFEFF);
PoFxIdleDevice(v7);
}
}
if( _InterlockedCompareExchange64((volatile signed __int64 *)&PopFxDeviceListLock, 0i64, 17i64) != 17 )
ExfReleasePushLockShared((INT64 *)&PopFxDeviceListLock);
KeAbPostRelease(&PopFxDeviceListLock);
KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
ZwUpdateWnfStateData();
}
}Referenced by:
PopFxEnablePlatformStates