PopFxSetDeviceAccountingCsPlatformState
VOID __stdcall PopFxSetDeviceAccountingCsPlatformState(UINT64 CsPlatformIdleStateIndex){
unsigned int v1;
int v2;
int v3;
_ETHREAD *CurrentThread;
__int64 *i;
__int64 v6;
_DEVICE_OBJECT *v7;
_DEVICE_POWER_STATE *v8;
UINT8 MinimumDevicePowerState;
unsigned __int64 v10;
char v11;
unsigned int v12;
__int64 v13;
INT8 MinimumComponentIdleState;
unsigned __int64 v15;
UINT64 MatchingChangeStamp;
UINT64 CheckStamp;
unsigned int PlatformIdleStateIndex;
char Buffer;
UINT64 State;
_DEVICE_OBJECT *Pdo;
PlatformIdleStateIndex = CsPlatformIdleStateIndex;
v1 = CsPlatformIdleStateIndex;
LODWORD(State) = 0;
v2 = _InterlockedCompareExchange((_DWORD *)&stru_140C23628 + 1058, 0, 0);
v3 = v2;
if( !v2 || v2 < 0 )
{
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--CurrentThread->Tcb.KernelApcDisable;
ExAcquirePushLockSharedEx((_EX_PUSH_LOCK *)&stru_140C23628 + 489, 0i64);
for( i = (__int64 *)*(&stru_140C23628 + 485); i != (__int64 *)((char *)&stru_140C23628 + 3880); i = (__int64 *)*i )
{
v6 = i[6];
if( v6 )
{
v7 = *(_DEVICE_OBJECT **)(v6 + 32);
Pdo = v7;
PopFxActivateDevice(v7, 0);
LOBYTE(v8) = 1;
MinimumDevicePowerState = PopPepGetMinimumDevicePowerState((PEPHANDLE *)i[7], v1, v8);
v10 = (unsigned __int8)KeAcquireSpinLockRaiseToDpc((UINT64 *)i + 75);
*((_DWORD *)i + 154) = v3;
memset(i + 79, 0i64, 0xC0u);
if( MinimumDevicePowerState && (int)State > 1 )
{
*((_DWORD *)i + 153) = State;
*((_BYTE *)i + 608) = 1;
i[78] = *(_QWORD *)&KUSER_SHARED_DATA.InterruptTime.LowPart;
_InterlockedOr((volatile signed __int32 *)i + 206, 0x10u);
}
else
{
i[78] = 0i64;
*((_BYTE *)i + 608) = 0;
}
KxReleaseSpinLock((UINT64 *)i + 75);
__writecr8(v10);
v11 = 0;
v12 = 0;
if( !*((_DWORD *)i + 207) )
goto LABEL_17;
do
{
v13 = *(_QWORD *)(i[104] + 8i64 * v12) + 200i64;
MinimumComponentIdleState = PopPepGetMinimumComponentIdleState(i[7], v12, PlatformIdleStateIndex, &State);
v15 = (unsigned __int8)KeAcquireSpinLockRaiseToDpc((UINT64 *)v13);
*(_DWORD *)(v13 + 16) = v3;
memset((VOID *)(v13 + 32), 0i64, 0xC0u);
if( MinimumComponentIdleState && (_DWORD)State )
{
v11 = 1;
*(_DWORD *)(v13 + 12) = State;
*(_BYTE *)(v13 + 8) = 1;
*(_QWORD *)(v13 + 24) = *(_QWORD *)&KUSER_SHARED_DATA.InterruptTime.LowPart;
_InterlockedOr((volatile signed __int32 *)i + 206, 0x10u);
}
else
{
*(_BYTE *)(v13 + 8) = 0;
*(_QWORD *)(v13 + 24) = 0i64;
}
KxReleaseSpinLock((UINT64 *)v13);
__writecr8(v15);
++v12;
}
while( v12 < *((_DWORD *)i + 207) );
v7 = Pdo;
v1 = PlatformIdleStateIndex;
if( v11 )
_InterlockedOr((volatile signed __int32 *)i + 206, 0x100u);
else
LABEL_17:
_InterlockedAnd((volatile signed __int32 *)i + 206, 0xFFFFFEFF);
PoFxIdleDevice(v7);
}
}
if( _InterlockedCompareExchange64((_QWORD *)&stru_140C23628 + 489, 0i64, 17i64) != 17 )
ExfReleasePushLockShared((_EX_PUSH_LOCK *)&stru_140C23628 + 489);
KeAbPostRelease((char *)&stru_140C23628 + 3912);
KeLeaveCriticalRegionThread(KeGetCurrentThread());
LODWORD(CheckStamp) = 0;
LODWORD(MatchingChangeStamp) = 0;
Buffer = 1;
ZwUpdateWnfStateData(
&WNF_PO_DRIPS_DEVICE_CONSTRAINTS_REGISTERED,
&Buffer,
1ui64,
0i64,
0i64,
MatchingChangeStamp,
CheckStamp);
}
}Referenced by:
PopFxEnablePlatformStates