PopPepInitializeVetoMasks
VOID __fastcall PopPepInitializeVetoMasks(INT64 a1, UINT64 a2){
__int64 v2;
UINT64 v4;
int v5;
char v6;
__int64 v7;
__int128 v8;
int *v9;
unsigned int i;
int v11;
unsigned __int64 v12;
_DWORD *v13;
KIRQL v14;
__int64 v15;
int v16;
__int64 v17;
unsigned int v18;
unsigned int *v19;
int v20;
unsigned int v21;
__int64 v22;
_DWORD *v23;
unsigned int v24;
unsigned int v25;
__int64 v26;
int v27;
__int64 v28;
char v29;
unsigned int v30;
__int64 v31;
__int64 v32;
unsigned int *v33;
int v34;
unsigned int v35;
INT64 v36;
_DWORD *v37;
__int64 v38;
unsigned int v39;
_DWORD *v40;
UINT8 v41;
char v42;
KIRQL v43;
INT64 UpdatedAccountingLevel;
int DeepSleepPlatformStateIndex;
__int128 *v46;
INT64 v47;
DEVICE_OBJECT *Pdo;
__int128 v49;
INT64 result;
__int128 v51;
int v52;
char v53;
_DWORD v54[16];
_DWORD v55[16];
v2 = (unsigned int)a2;
HIDWORD(UpdatedAccountingLevel) = 0;
v49 = 0i64;
memset((INT64)&result, 0i64);
v4 = *(_QWORD *)(a1 + 32);
v46 = 0i64;
if( *(_QWORD *)(v4 + 48) )
{
v5 = v52;
v7 = (v6 + 120) & 4;
*(_BYTE *)(a1 + 384) = 0;
v8 = *(_OWORD *)(v4 + 216);
v9 = &v52;
if( ((v6 + 120) & 4) != 0 )
v5 = 1;
v52 = v5;
if( ((v6 + 120) & 4) != 0 )
v9 = (int *)&v53;
v51 = v8;
memset64(v9, 0x100000001ui64, 16i64 - ((unsigned int)v7 != 0i64));
if( ((v6 + 120) & 4) != 0 )
*(int *)((char *)v9 + (-(__int64)(v7 != 0) & 0xFFFFFFFFFFFFFFFCui64) + 124) = 1;
for( i = 0; i < (unsigned int)v2; ++i )
{
LODWORD(result) = i;
*(_QWORD *)&v49 = &result;
DWORD2(v49) = 8;
v46 = &v49;
EmClientRuleEvaluate(
&GUID_EM_PEP_UPADTE_DEVICE_CONTRAINT,
(__int64)&v46,
1,
(_DWORD *)&UpdatedAccountingLevel + 1);
if( HIDWORD(UpdatedAccountingLevel) == 2 )
*(_BYTE *)(a1 + 384) = 1;
}
Pdo = *(DEVICE_OBJECT **)(*(_QWORD *)(v4 + 48) + 32i64);
PopFxActivateDevice(Pdo, 0);
v11 = v54[0];
v12 = (unsigned __int64)v54 & 4;
v13 = v54;
if( ((unsigned __int8)v54 & 4) != 0 )
v11 = 1;
v54[0] = v11;
if( ((unsigned __int8)v54 & 4) != 0 )
v13 = v55;
memset64(v13, 0x100000001ui64, 16i64 - ((unsigned int)v12 != 0i64));
if( ((unsigned __int8)v54 & 4) != 0 )
*(_DWORD *)((char *)v13 + (-(__int64)(v12 != 0) & 0xFFFFFFFFFFFFFFFCui64) + 124) = 1;
v14 = ExAcquireSpinLockExclusive((PEX_SPIN_LOCK)(a1 + 64));
v43 = v14;
v15 = 0i64;
DeepSleepPlatformStateIndex = PpmGetDeepSleepPlatformStateIndex();
v41 = 0;
LODWORD(UpdatedAccountingLevel) = _InterlockedCompareExchange(&PopFxDeviceAccountingLevel, 0, 0);
v16 = UpdatedAccountingLevel;
KxAcquireSpinLock((UINT64 *)(v4 + 600));
*(_DWORD *)(v4 + 616) = UpdatedAccountingLevel;
memset(v4 + 632, 0i64);
*(_BYTE *)(v4 + 608) = 0;
if( PopPluginRequestDeviceIdleConstraints(*(_QWORD *)(a1 + 32), (__int64)v54, v2) || *(_BYTE *)(a1 + 384) )
{
v41 = PopFxEnableEnhancedAccounting(&UpdatedAccountingLevel);
if( *(_BYTE *)(a1 + 384) && (_DWORD)v2 )
{
v17 = 0i64;
v15 = v2;
do
{
v18 = *(int *)((char *)&v52 + v17 * 4);
if( v54[v17] < v18 )
v54[v17] = v18;
++v17;
--v15;
}
while( v15 );
}
v19 = v54;
v20 = 1;
v21 = v15;
if( (_DWORD)v2 )
{
v22 = v15;
v23 = v54;
do
{
if( *(_BYTE *)(v22 + PopPepPlatformState + 57) == (_BYTE)v15 && *v23 != 1 )
PopFxBugCheck(0x620ui64, v4, v21, 0i64);
v24 = *v19;
v25 = 1;
do
{
if( v25 >= v24 )
break;
v26 = v25++ - 1;
*(_DWORD *)(a1 + 4 * v26 + 144) |= 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 = *(_DWORD *)(a1 + 152);
v16 = UpdatedAccountingLevel;
*(_QWORD *)(a1 + 156) = *(_QWORD *)(a1 + 144);
*(_DWORD *)(a1 + 164) = v27;
}
*(_DWORD *)(v4 + 616) = v16;
KxReleaseSpinLock((UINT64 *)(v4 + 600));
v28 = *(int *)(a1 + 168);
if( (_DWORD)v28 != 4 )
PopPepUpdateIdleStateRefCount(0i64, *(unsigned int *)(a1 + 4 * v28 + 140), 1i64);
v29 = *(_BYTE *)(a1 + 124);
if( v29 )
{
v30 = v15;
v42 = v15;
if( *(_DWORD *)(a1 + 180) > (unsigned int)v15 )
{
while( 1 )
{
v47 = a1 + 200i64 * v30;
v31 = *(_QWORD *)(*(_QWORD *)(v4 + 832) + 8i64 * v30);
memset((INT64)v54, 0i64);
v32 = v31 + 200;
KxAcquireSpinLock((UINT64 *)v32);
*(_DWORD *)(v32 + 16) = v16;
memset(v32 + 32, 0i64);
*(_BYTE *)(v32 + 8) = 0;
if( PopPluginRequestComponentIdleConstraints(*(_QWORD *)(a1 + 32), v30, (__int64)v54, v2) )
{
v41 = PopFxEnableEnhancedAccounting(&UpdatedAccountingLevel);
v33 = v54;
v34 = 1;
v35 = 0;
if( (_DWORD)v2 )
{
v36 = v47;
v37 = v54;
v38 = 0i64;
do
{
if( !*(_BYTE *)(v38 + PopPepPlatformState + 57) && *v37 )
PopFxBugCheck(0x621ui64, v4, v30, v35);
v39 = 0;
if( *(_DWORD *)(v36 + 372) )
{
v40 = (_DWORD *)(*(_QWORD *)(v36 + 376) + 16i64);
do
{
if( v39 >= *v33 )
break;
*v40 |= v34;
++v39;
v40 += 6;
}
while( v39 < *(_DWORD *)(v36 + 372) );
}
if( DeepSleepPlatformStateIndex != -1 && v35 == DeepSleepPlatformStateIndex && *v33 )
{
*(_DWORD *)(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 + 376) + 24i64 * *(unsigned int *)(v47 + 360) + 16),
1i64);
LOBYTE(v15) = 0;
if( v42 )
_InterlockedOr((volatile signed __int32 *)(v4 + 824), 0x100u);
else
_InterlockedAnd((volatile signed __int32 *)(v4 + 824), 0xFFFFFEFF);
if( ++v30 >= *(_DWORD *)(a1 + 180) )
break;
v16 = UpdatedAccountingLevel;
}
v29 = *(_BYTE *)(a1 + 124);
}
v14 = v43;
if( v29 )
goto LABEL_70;
}
if( *(_BYTE *)(a1 + 384) != (_BYTE)v15 )
LABEL_70:
*(_DWORD *)(a1 + 172) = 2;
ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)(a1 + 64));
__writecr8(v14);
PoFxIdleDevice(Pdo);
if( v41 != (_BYTE)v15 )
PopPepResetDeviceAccountingLevel();
}
else if( (*(_DWORD *)(v4 + 824) & 2) != 0 )
{
PopPepInitializeDebuggerMasks(a1, (unsigned int)v2);
}
}Referenced by:
PopPepDeviceStarted
PopPepPlatformStateRegistered