PopPepInitializeVetoMasks
VOID __stdcall PopPepInitializeVetoMasks(_POP_PEP_DEVICE *Device, UINT64 PlatformStateCount){
__int64 v2;
__int64 v4;
int v5;
char v6;
__int64 v7;
__int128 v8;
char *v9;
unsigned int i;
_DEVICE_POWER_STATE v11;
unsigned __int64 v12;
_DEVICE_POWER_STATE *v13;
unsigned __int8 v14;
__int64 v15;
int v16;
__int64 v17;
_DEVICE_POWER_STATE v18;
_DEVICE_POWER_STATE *v19;
int v20;
ULONG_PTR v21;
__int64 v22;
_DEVICE_POWER_STATE *v23;
unsigned int v24;
unsigned int v25;
__int64 v26;
_POP_PEP_DEVICE v27;
__int64 v28;
char v29;
ULONG_PTR v30;
__int64 v31;
__int64 v32;
_DEVICE_POWER_STATE *v33;
int v34;
ULONG_PTR v35;
_POP_PEP_DEVICE *v36;
_DEVICE_POWER_STATE *v37;
__int64 v38;
_DEVICE_POWER_STATE v39;
_DWORD *v40;
UINT8 v41;
char v42;
unsigned __int8 v43;
INT64 UpdatedAccountingLevel;
int DeepSleepPlatformStateIndex;
__int128 *v46;
_POP_PEP_DEVICE *v47;
_DEVICE_OBJECT *Pdo;
__int128 v49;
_QWORD v50[20];
_DEVICE_POWER_STATE MinimumDStates[32];
v2 = (unsigned int)PlatformStateCount;
HIDWORD(UpdatedAccountingLevel) = 0;
v49 = 0i64;
memset(v50, 0i64, 0x98u);
v4 = *((_QWORD *)Device + 4);
v46 = 0i64;
if( *(_QWORD *)(v4 + 48) )
{
v5 = v50[3];
v7 = (v6 + 120) & 4;
*((_BYTE *)Device + 384) = 0;
v8 = *(_OWORD *)(v4 + 216);
v9 = (char *)&v50[3];
if( ((v6 + 120) & 4) != 0 )
v5 = 1;
LODWORD(v50[3]) = v5;
if( ((v6 + 120) & 4) != 0 )
v9 = (char *)&v50[3] + 4;
*(_OWORD *)&v50[1] = v8;
memset64(v9, 0x100000001ui64, 16i64 - ((unsigned int)v7 != 0i64));
if( ((v6 + 120) & 4) != 0 )
*(_DWORD *)&v9[(-(__int64)(v7 != 0) & 0xFFFFFFFFFFFFFFFCui64) + 124] = 1;
for( i = 0; i < (unsigned int)v2; ++i )
{
LODWORD(v50[0]) = i;
*(_QWORD *)&v49 = v50;
DWORD2(v49) = 8;
v46 = &v49;
EmClientRuleEvaluate(
(__int64)&GUID_EM_PEP_UPADTE_DEVICE_CONTRAINT,
(__int64)&v46,
1,
(_DWORD *)&UpdatedAccountingLevel + 1);
if( HIDWORD(UpdatedAccountingLevel) == 2 )
*((_BYTE *)Device + 384) = 1;
}
Pdo = *(_DEVICE_OBJECT **)(*(_QWORD *)(v4 + 48) + 32i64);
PopFxActivateDevice(Pdo, 0);
v11 = MinimumDStates[0];
v12 = (unsigned __int64)MinimumDStates & 4;
v13 = MinimumDStates;
if( ((unsigned __int8)MinimumDStates & 4) != 0 )
v11 = PowerDeviceD0;
MinimumDStates[0] = v11;
if( ((unsigned __int8)MinimumDStates & 4) != 0 )
v13 = &MinimumDStates[1];
memset64(v13, 0x100000001ui64, 16i64 - ((unsigned int)v12 != 0i64));
if( ((unsigned __int8)MinimumDStates & 4) != 0 )
*(_DEVICE_POWER_STATE *)((char *)v13 + (-(__int64)(v12 != 0) & 0xFFFFFFFFFFFFFFFCui64) + 124) = PowerDeviceD0;
v14 = ExAcquireSpinLockExclusive((INT64 *)Device + 8);
v43 = v14;
v15 = 0i64;
DeepSleepPlatformStateIndex = PpmGetDeepSleepPlatformStateIndex();
v41 = 0;
LODWORD(UpdatedAccountingLevel) = _InterlockedCompareExchange((_DWORD *)&stru_140C23628 + 1058, 0, 0);
v16 = UpdatedAccountingLevel;
KxAcquireSpinLock((UINT64 *)(v4 + 600));
*(_DWORD *)(v4 + 616) = UpdatedAccountingLevel;
memset((VOID *)(v4 + 632), 0i64, 0xC0u);
*(_BYTE *)(v4 + 608) = 0;
if( PopPluginRequestDeviceIdleConstraints(*((_POP_FX_DEVICE **)Device + 4), MinimumDStates, (unsigned int)v2)
|| *((_BYTE *)Device + 384) )
{
v41 = PopFxEnableEnhancedAccounting(&UpdatedAccountingLevel);
if( *((_BYTE *)Device + 384) && (_DWORD)v2 )
{
v17 = 0i64;
v15 = v2;
do
{
v18 = *(_DWORD *)((char *)&v50[3] + v17 * 4);
if( MinimumDStates[v17] < (unsigned int)v18 )
MinimumDStates[v17] = v18;
++v17;
--v15;
}
while( v15 );
}
v19 = MinimumDStates;
v20 = 1;
v21 = v15;
if( (_DWORD)v2 )
{
v22 = v15;
v23 = MinimumDStates;
do
{
if( *(_BYTE *)(v22 + PopPepPlatformState + 57) == (_BYTE)v15 && *v23 != PowerDeviceD0 )
PopFxBugCheck(0x620u, v4, v21, 0);
v24 = *v19;
v25 = 1;
do
{
if( v25 >= v24 )
break;
v26 = v25++ - 1;
Device[v26 + 36] |= v20;
}
while( v25 <= 3 );
if( DeepSleepPlatformStateIndex != -1 && v21 == DeepSleepPlatformStateIndex && v24 > 1 )
{
*(_DWORD *)(v4 + 612) = v24;
*(_QWORD *)(v4 + 624) = *(_QWORD *)&KUSER_SHARED_DATA.InterruptTime.LowPart;
*(_BYTE *)(v4 + 608) = 1;
_InterlockedOr((volatile signed __int32 *)(v4 + 824), 0x10u);
}
++v19;
v20 *= 2;
++v21;
v22 += 384i64;
++v23;
LODWORD(v15) = 0;
}
while( v21 < (unsigned int)v2 );
}
v27 = Device[38];
v16 = UpdatedAccountingLevel;
*(_QWORD *)(Device + 39) = *((_QWORD *)Device + 18);
Device[41] = v27;
}
*(_DWORD *)(v4 + 616) = v16;
KxReleaseSpinLock((UINT64 *)(v4 + 600));
v28 = Device[42];
if( (_DWORD)v28 != 4 )
PopPepUpdateIdleStateRefCount(0i64, (unsigned int)Device[v28 + 35], UpdateTypeIncrement);
v29 = *((_BYTE *)Device + 124);
if( v29 )
{
v30 = v15;
v42 = v15;
if( Device[45] > (unsigned int)v15 )
{
while( 1 )
{
v47 = &Device[50 * v30];
v31 = *(_QWORD *)(*(_QWORD *)(v4 + 832) + 8i64 * v30);
memset(MinimumDStates, 0i64, sizeof(MinimumDStates));
v32 = v31 + 200;
KxAcquireSpinLock((UINT64 *)v32);
*(_DWORD *)(v32 + 16) = v16;
memset((VOID *)(v32 + 32), 0i64, 0xC0u);
*(_BYTE *)(v32 + 8) = 0;
if( PopPluginRequestComponentIdleConstraints(
*((_POP_FX_DEVICE **)Device + 4),
v30,
(UINT64 *)MinimumDStates,
(unsigned int)v2) )
{
v41 = PopFxEnableEnhancedAccounting(&UpdatedAccountingLevel);
v33 = MinimumDStates;
v34 = 1;
v35 = 0;
if( (_DWORD)v2 )
{
v36 = v47;
v37 = MinimumDStates;
v38 = 0i64;
do
{
if( !*(_BYTE *)(v38 + PopPepPlatformState + 57) && *v37 )
PopFxBugCheck(0x621u, v4, v30, v35);
v39 = PowerDeviceUnspecified;
if( v36[93] )
{
v40 = (_DWORD *)(*((_QWORD *)v36 + 47) + 16i64);
do
{
if( (unsigned int)v39 >= *v33 )
break;
*v40 |= v34;
++v39;
v40 += 6;
}
while( v39 < (unsigned int)v36[93] );
}
if( DeepSleepPlatformStateIndex != -1 && v35 == DeepSleepPlatformStateIndex && *v33 )
{
*(_DEVICE_POWER_STATE *)(v32 + 12) = *v33;
*(_QWORD *)(v32 + 24) = *(_QWORD *)&KUSER_SHARED_DATA.InterruptTime.LowPart;
*(_BYTE *)(v32 + 8) = 1;
v42 = 1;
_InterlockedOr((volatile signed __int32 *)(v4 + 824), 0x10u);
}
++v33;
v34 *= 2;
++v35;
v38 += 384i64;
++v37;
}
while( v35 < (unsigned int)v2 );
}
v16 = UpdatedAccountingLevel;
}
*(_DWORD *)(v32 + 16) = v16;
KxReleaseSpinLock((UINT64 *)v32);
PopPepUpdateIdleStateRefCount(
0i64,
*(unsigned int *)(*((_QWORD *)v47 + 47) + 24i64 * (unsigned int)v47[90] + 16),
UpdateTypeIncrement);
LOBYTE(v15) = 0;
if( v42 )
_InterlockedOr((volatile signed __int32 *)(v4 + 824), 0x100u);
else
_InterlockedAnd((volatile signed __int32 *)(v4 + 824), 0xFFFFFEFF);
if( ++v30 >= Device[45] )
break;
v16 = UpdatedAccountingLevel;
}
v29 = *((_BYTE *)Device + 124);
}
v14 = v43;
if( v29 )
goto LABEL_70;
}
if( *((_BYTE *)Device + 384) != (_BYTE)v15 )
LABEL_70:
Device[43] = 2;
ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)Device + 8);
__writecr8(v14);
PoFxIdleDevice(Pdo);
if( v41 != (_BYTE)v15 )
PopPepResetDeviceAccountingLevel();
}
else if( (*(_DWORD *)(v4 + 824) & 2) != 0 )
{
PopPepInitializeDebuggerMasks(Device, (unsigned int)v2);
}
}Referenced by:
PopPepDeviceStarted
PopPepPlatformStateRegistered