PfpRpControlRequestCopy

NTSTATUS __stdcall PfpRpControlRequestCopy(
        PF_ROBUSTNESS_CONTROL *UserRequest,
        UINT64 UserRequestLength,
        PF_ROBUSTNESS_CONTROL **RequestOut,
        PF_ROBUSTNESS_CONTROL *LocalBuffer,
        INT8 PreviousMode){
  char *v7; 
  __m128i v8; 
  __int64 v9; 
  unsigned __int16 epi16; 
  unsigned __int64 v11; 
  __m128i *PoolWithTag; 
  __m128i v15; 

  if( PreviousMode && (_DWORD)UserRequestLength )
  {
    if( ((unsigned __int8)UserRequest & 7) != 0 )
      ExRaiseDatatypeMisalignment();
    v7 = (char *)UserRequest + (unsigned int)UserRequestLength;
    if( (unsigned __int64)v7 > 0x7FFFFFFF0000i64 || v7 < (char *)UserRequest )
      MEMORY[0x7FFFFFFF0000] = 0;
  }
  v8 = *(__m128i *)UserRequest;
  v15 = *(__m128i *)UserRequest;
  v9 = *((_QWORD *)UserRequest + 2);
  if( (unsigned __int16)_mm_cvtsi128_si32(*(__m128i *)UserRequest) != 3 )
    return -1073741811;
  epi16 = _mm_extract_epi16(v8, 1);
  if( epi16 >= 4u )
    return -1073741811;
  if( epi16 == 1 )
  {
    v15.m128i_i32[1] = _mm_cvtsi128_si32(_mm_srli_si128(v8, 4));
    if( v15.m128i_i32[1] )
      return -1073741811;
    v15.m128i_i32[2] = _mm_cvtsi128_si32(_mm_srli_si128(v8, 8));
    if( v15.m128i_i32[2] )
      return -1073741811;
    v15.m128i_i32[3] = _mm_cvtsi128_si32(_mm_srli_si128(v8, 12));
    if( __PAIR64__(v15.m128i_u32[3], 0) != (unsigned int)v9 )
      return -1073741811;
  }
  v11 = 8 * ((unsigned int)v9 + (unsigned __int64)v15.m128i_u32[3])
      - ((8 * (v15.m128i_i8[4] + v15.m128i_i8[8]) + 23) & 7)
      + 8 * (v15.m128i_u32[1] + (unsigned __int64)v15.m128i_u32[2])
      + 31;
  if( v11 > 0xFFFFFFFF )
    return -1073741675;
  if( (unsigned int)v11 != (unsigned __int64)(unsigned int)UserRequestLength )
    return -1073741811;
  if( (unsigned int)v11 <= 0x28ui64 )
  {
    PoolWithTag = (__m128i *)LocalBuffer;
  }
  else
  {
    PoolWithTag = (__m128i *)ExAllocatePoolWithTag(1ui64, (unsigned int)v11, 1129473616i64);
    if( !PoolWithTag )
      return -1073741670;
  }
  memmove(
    PoolWithTag,
    UserRequest,
    8 * (v9 + v15.m128i_i32[3])
  - ((8 * (v15.m128i_i8[4] + v15.m128i_i8[8]) + 23) & 7)
  + 8 * (v15.m128i_i32[1] + v15.m128i_i32[2])
  + 31);
  *PoolWithTag = v8;
  PoolWithTag[1].m128i_i64[0] = v9;
  *RequestOut = (PF_ROBUSTNESS_CONTROL *)PoolWithTag;
  return 0;
}

Referenced by:

PfpRpControlRequest