PfpRpControlRequestUpdate

INT64 __fastcall PfpRpControlRequestUpdate(INT64 a1, _DWORD *a2){
  __int64 *v3; 
  unsigned int v5; 
  __int64 *v6; 
  __int64 *v7; 
  unsigned int v8; 
  __int64 v9; 
  void *v10; 
  __int64 v11; 
  _EPROCESS *v12; 
  INT64 result; 
  UINT64 v14; 
  UINT64 v15; 
  _EPROCESS *Process; 
  Process = 0i64;
  v3 = (__int64 *)(a2 + 6);
  v5 = 0;
  v6 = v3;
  v7 = v3;
  v8 = a2[1];
  v9 = v8 + a2[2];
  if( (_DWORD)v9 )
  {
    do
    {
      v10 = (void *)*((unsigned int *)v7 + 1);
      v11 = *(unsigned int *)v7;
      *v6++ = v11;
      if( (_DWORD)v10 && PsLookupProcessByProcessId(v10, (PEPROCESS *)&Process) >= 0 )
      {
        v12 = Process;
        if( *((_DWORD *)Process + 381) == (_DWORD)v11 )
        {
          if( v5 < a2[1] )
            _InterlockedOr((volatile signed __int32 *)Process + 281, 0x4000u);
          else
            _InterlockedAnd((volatile signed __int32 *)Process + 281, 0xFFFFBFFF);
          v12 = Process;
        }
        ObfDereferenceObjectWithTag(v12, 0x746C6644ui64);
      }
      ++v5;
      ++v7;
    }
    while( v5 < (unsigned int)v9 );
    v8 = a2[1];
    v3 = (__int64 *)(a2 + 6);
  }
  result = PfpRpCHashAddEntries(a1, (__m128i *)(a1 + 96), (volatile signed __int64 *)(a1 + 120), v3, v8);
  if( (int)result >= 0 )
  {
    v14 = (unsigned int)a2[2];
    if( !(_DWORD)v14
      || !*(_DWORD *)(a1 + 112)
      || (result = PfpRpCHashDeleteEntries(a1, a1 + 96, (INT64 *)(a1 + 120), v14, (INT64)&a2[2 * a2[1] + 6]),
          (int)result >= 0) )
    {
      PfpRpCHashAddEntries(
        a1,
        (__m128i *)(a1 + 56),
        (volatile signed __int64 *)(a1 + 88),
        (__int64 *)((((unsigned __int64)&a2[2 * v9 + 7] + 3) & 0xFFFFFFFFFFFFFFF8ui64) + 8i64 * (unsigned int)a2[3]),
        a2[4]);
      v15 = (unsigned int)a2[3];
      if( (_DWORD)v15 && *(_DWORD *)(a1 + 72) )
      {
        result = PfpRpCHashDeleteEntries(
                   a1,
                   a1 + 56,
                   (INT64 *)(a1 + 88),
                   v15,
                   ((unsigned __int64)&a2[2 * v9 + 7] + 3) & 0xFFFFFFFFFFFFFFF8ui64);
        if( (int)result < 0 )
          return result;
        *(_QWORD *)(a1 + 80) = 0i64;
      }
      return 0i64;
    }
  }
  return result;
}

Referenced by:

PfpRpControlRequestPerform