PopPepDeviceDState
VOID __fastcall PopPepDeviceDState(
PEPHANDLE__ *DpmContext,
_DEVICE_POWER_STATE PowerState,
INT64 TransitionComplete,
INT64 SystemTransition){
unsigned int v4;
__int64 v5;
int v6;
CHAR v7;
INT64 v9;
INT64 v10;
unsigned int v11;
__int64 v12;
unsigned int v13;
int v14;
char v15;
__int64 v16;
unsigned int v17;
__int64 v18;
__int64 v19;
__int64 v20;
unsigned int v21;
__int64 v22;
__int64 v23;
int v24;
CHAR v25;
__int16 v26;
char v27;
unsigned int v28;
int v29;
v29 = SystemTransition;
v4 = 0;
v5 = PowerState;
v6 = SystemTransition;
v7 = TransitionComplete;
if( (_BYTE)TransitionComplete )
{
if( PowerState == PowerDeviceD0
&& _InterlockedExchangeAdd((volatile signed __int32 *)DpmContext + 33, 0xFFFFFFFF) == 1 )
{
PopPepUpdateConstraints((INT64)DpmContext, 4i64, 1);
}
}
else
{
if( PowerState > PowerDeviceD0 )
{
_InterlockedExchange((volatile __int32 *)DpmContext + 33, 2);
PopPepUpdateConstraints((INT64)DpmContext, 4i64, 0);
if( (unsigned int)(v6 - 1) <= 1 )
_InterlockedDecrement((volatile signed __int32 *)DpmContext + 33);
}
v9 = *((unsigned int *)DpmContext + 42);
if( (_DWORD)v9 != (_DWORD)v5 )
PopPlNotifyDeviceDState(*((_QWORD *)DpmContext + 4), v9, (unsigned int)v5, 0);
}
if( !*((_BYTE *)DpmContext + 124) && !*((_BYTE *)DpmContext + 384) )
goto LABEL_7;
v11 = 0;
if( (_DWORD)v5 != 4 )
v11 = *((_DWORD *)DpmContext + v5 + 35);
v12 = *((int *)DpmContext + 42);
v28 = v11;
v13 = 0;
if( (_DWORD)v12 != 4 )
v13 = *((_DWORD *)DpmContext + v12 + 35);
if( !v7 && (_DWORD)v12 != (_DWORD)v5 )
{
if( (_DWORD)v5 == 1 )
{
v17 = 0;
if( *((_DWORD *)DpmContext + 45) )
{
do
{
v18 = 200i64 * v17;
v19 = *(unsigned int *)((char *)DpmContext + v18 + 360);
PopPepUpdateIdleStateRefCount(
0i64,
*(unsigned int *)(*(_QWORD *)((char *)DpmContext + v18 + 376) + 24 * v19 + 16),
1i64);
PopFxUpdateComponentAccountingEnhanced(
*((_QWORD *)DpmContext + 4),
*(unsigned int *)((char *)DpmContext + v18 + 192),
(unsigned int)v19,
0i64);
++v17;
}
while( v17 < *((_DWORD *)DpmContext + 45) );
v6 = v29;
v4 = 0;
}
v11 = v28;
}
PopPepUpdateIdleStateRefCount(v13, v11, 1i64);
PopFxUpdateDeviceAccountingEnhanced(*((_QWORD *)DpmContext + 4), (unsigned int)v5, 0i64);
}
if( *((_BYTE *)DpmContext + 124) )
{
v20 = *((_QWORD *)DpmContext + 4);
v27 = 0;
v24 = v5;
v25 = v7;
v26 = v6 == 1;
v23 = *(_QWORD *)(v20 + 72);
(*(void(__fastcall **)(__int64, __int64 *))(*(_QWORD *)(v20 + 64) + 96i64))(5i64, &v23);
}
if( v7 )
{
v14 = *((_DWORD *)DpmContext + 42);
if( v14 != (_DWORD)v5 )
{
v15 = 0;
if( PopFxPerfQueryOnDevicePowerChanges )
{
if( *((_BYTE *)DpmContext + 177) )
goto LABEL_42;
if( *((_BYTE *)DpmContext + 176) && (_DWORD)v5 == 1 )
v15 = 1;
if( v15 )
{
LABEL_42:
v21 = 0;
if( *((_DWORD *)DpmContext + 45) )
{
do
{
v22 = 200i64 * v21;
if( *((_BYTE *)DpmContext + v22 + 368) )
PopFxUpdateComponentPerfStateNominalChange(
*((_QWORD *)DpmContext + 4),
*(_DWORD *)((char *)DpmContext + v22 + 192),
1u,
v5);
++v21;
}
while( v21 < *((_DWORD *)DpmContext + 45) );
v14 = *((_DWORD *)DpmContext + 42);
}
}
}
if( v14 == 1 && *((_DWORD *)DpmContext + 45) )
{
do
{
v16 = 200i64 * v4;
PopPepUpdateIdleStateRefCount(
*(unsigned int *)(*(_QWORD *)((char *)DpmContext + v16 + 376)
+ 24i64 * *(unsigned int *)((char *)DpmContext + v16 + 360)
+ 16),
0i64,
0i64);
PopFxUpdateComponentAccountingEnhanced(
*((_QWORD *)DpmContext + 4),
*(unsigned int *)((char *)DpmContext + v16 + 192),
(unsigned int)(*(_DWORD *)((char *)DpmContext + v16 + 372) - 1),
1i64);
++v4;
}
while( v4 < *((_DWORD *)DpmContext + 45) );
}
PopPepUpdateIdleStateRefCount(v13, v11, 0i64);
PopFxUpdateDeviceAccountingEnhanced(*((_QWORD *)DpmContext + 4), (unsigned int)v5, 1i64);
}
LABEL_7:
if( v7 )
{
v10 = *((unsigned int *)DpmContext + 42);
if( (_DWORD)v10 != (_DWORD)v5 )
{
PopPlNotifyDeviceDState(*((_QWORD *)DpmContext + 4), v10, (unsigned int)v5, v7);
*((_DWORD *)DpmContext + 42) = v5;
}
}
}
}Referenced by:
PoFxReportDevicePoweredOn
PopIrpWorker
PopRequestCompletion