PpmUpdateIdleVeto
INT64 __fastcall PpmUpdateIdleVeto(CHAR a1, UINT64 a2, INT64 a3, BYTE *a4){
unsigned int v4;
unsigned int v7;
__int64 v8;
_QWORD *v9;
_DWORD *v10;
__int64 v12;
_QWORD *v13;
__int64 v14;
__int64 v15;
__int64 v16;
_QWORD *PoolWithTag;
_QWORD *v18;
int v19;
__int64 v20;
_QWORD *v21;
INT64 CurrentQpc;
v4 = 0;
*a4 = 0;
v7 = a2;
if( !(_DWORD)a2 )
return(unsigned int)-1073741811;
v8 = *(_QWORD *)(a3 + 32);
v9 = (_QWORD *)(a3 + 8);
v10 = *(_DWORD **)(a3 + 8);
if( a1 )
{
while( v10 != (_DWORD *)v9 )
{
if( v10[4] == v7 )
{
v19 = v10[5];
if( v19 == -1 )
return(unsigned int)-1073741675;
else
v10[5] = v19 + 1;
return v4;
}
v10 = *(_DWORD **)v10;
}
if( v8 )
{
if( v7 > *(_DWORD *)(a3 + 28) )
return(unsigned int)-1073741811;
v18 = (_QWORD *)(v8 + ((unsigned __int64)(v7 - 1) << 6));
LODWORD(v20) = RtlGetInterruptTimePrecise(&CurrentQpc);
v18[4] = v20;
if( !*(_BYTE *)(a3 + 24) )
v18[6] = v20;
if( *(_BYTE *)(a3 + 25) )
PopUpdateNonAttributedCpuTimeReference(1u);
}
else
{
PoolWithTag = ExAllocatePoolWithTag(NonPagedPoolNx, 0x40ui64, 0x694D5050ui64);
v18 = PoolWithTag;
if( !PoolWithTag )
return(unsigned int)-1073741670;
memset((INT64)PoolWithTag, 0i64);
}
*((_DWORD *)v18 + 4) = v7;
*((_DWORD *)v18 + 5) = 1;
if( (_QWORD *)*v9 == v9 )
{
_InterlockedOr((volatile signed __int32 *)a3, 1u);
*a4 = 1;
}
v21 = (_QWORD *)v9[1];
if( (_QWORD *)*v21 == v9 )
{
*v18 = v9;
v18[1] = v21;
*v21 = v18;
v9[1] = v18;
return v4;
}
goto LABEL_38;
}
while( 1 )
{
if( v10 == (_DWORD *)v9 )
return(unsigned int)-1073741811;
if( v10[4] == v7 )
break;
v10 = *(_DWORD **)v10;
}
if( v10[5]-- == 1 )
{
v12 = *(_QWORD *)v10;
if( *(_DWORD **)(*(_QWORD *)v10 + 8i64) == v10 )
{
v13 = (_QWORD *)*((_QWORD *)v10 + 1);
if( (_DWORD *)*v13 == v10 )
{
*v13 = v12;
*(_QWORD *)(v12 + 8) = v13;
if( v8 )
{
*(_OWORD *)v10 = 0i64;
LODWORD(v14) = RtlGetInterruptTimePrecise(&CurrentQpc);
v15 = v14;
*((_QWORD *)v10 + 5) += v14 - *((_QWORD *)v10 + 4);
v16 = *((_QWORD *)v10 + 6);
*((_QWORD *)v10 + 4) = 0i64;
if( v16 )
{
*((_QWORD *)v10 + 6) = 0i64;
*((_QWORD *)v10 + 7) += v15 - v16;
}
if( *(_BYTE *)(a3 + 25) )
PopUpdateNonAttributedCpuTimeReference(0);
}
else
{
ExFreePoolWithTag(v10, 0x694D5050u);
}
if( (_QWORD *)*v9 == v9 )
{
_InterlockedAnd((volatile signed __int32 *)a3, 0xFFFFFFFE);
*a4 = 1;
}
return v4;
}
}
LABEL_38:
__fastfail(3u);
}
return v4;
}Referenced by:
PpmUpdatePlatformIdleVeto
PpmUpdateProcessorIdleVeto