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