RtlpCopyXStateChunk

INT64 __fastcall RtlpCopyXStateChunk(CHAR a1, INT64 a2, INT64 a3, INT64 a4, INT64 a5){
  unsigned int v6; 
  unsigned int v7; 
  unsigned int v8; 
  unsigned __int64 *v9; 
  UINT8 *v10; 
  unsigned int v11; 
  UINT8 *v12; 
  unsigned __int64 v13; 
  char v14; 
  unsigned __int64 v15; 
  unsigned __int64 AlignedFeatures; 
  _DWORD *v17; 
  _DWORD *v18; 
  __int64 v20; 
  int v21; 
  UINT8 *v22; 
  unsigned __int64 v23; 
  unsigned __int64 *v24; 
  unsigned int v25; 
  char v26; 
  v25 = *(_DWORD *)(a3 + 20);
  v6 = 64;
  v7 = 64;
  if( v25 < 0x40 )
    return 2147483653i64;
  v8 = *(_DWORD *)(a5 + 20);
  if( v8 < 0x40 )
    return 2147483653i64;
  v9 = (unsigned __int64 *)(a2 + *(int *)(a3 + 16));
  v10 = (UINT8 *)(a4 + *(int *)(a5 + 16));
  v24 = v9;
  v22 = v10;
  memset((INT64)v9, 0i64);
  v11 = 2;
  v12 = v10;
  v13 = *(_QWORD *)v10 & (KUSER_SHARED_DATA.XState.EnabledUserVisibleSupervisorFeatures | KUSER_SHARED_DATA.XState.EnabledFeatures) & 0xFFFFFFFFFFFFFFFCui64;
  *v9 = v13;
  if( (KUSER_SHARED_DATA.XState.ControlFlags & 2) != 0 )
  {
    v14 = 1;
    v15 = *((_QWORD *)v10 + 1) & (KUSER_SHARED_DATA.XState.EnabledUserVisibleSupervisorFeatures | KUSER_SHARED_DATA.XState.EnabledFeatures | 3) | 0x8000000000000000ui64;
    AlignedFeatures = KUSER_SHARED_DATA.XState.AlignedFeatures;
  }
  else
  {
    v14 = 0;
    v15 = 0i64;
    AlignedFeatures = 0i64;
  }
  v23 = AlignedFeatures;
  v26 = v14;
  v9[1] = v15;
  if( a1 == 1 )
  {
    v17 = (_DWORD *)(&KUSER_SHARED_DATA + 1028);
    v18 = (_DWORD *)(&KUSER_SHARED_DATA + 1548);
    while( v13 )
    {
      v20 = 1i64 << v11;
      if( v14 )
      {
        if( (v20 & v15) != 0 )
        {
          v7 = v6;
          if( (v20 & AlignedFeatures) != 0 )
            v7 = (v6 + 63) & 0xFFFFFFC0;
          v6 = v7 + *v18;
        }
      }
      else
      {
        v21 = *(v17 - 1);
        v6 = v21 + *v17 - 512;
        v7 = v21 - 512;
      }
      if( (v20 & v13) != 0 )
      {
        if( v6 > v25 || v6 > v8 )
          return 2147483653i64;
        memmove((UINT8 *)v24 + v7, &v12[v7], v6 - v7);
        v14 = v26;
        _bittestandreset64((__int64 *)&v13, v11);
      }
      AlignedFeatures = v23;
      ++v11;
      v12 = v22;
      ++v18;
      v17 += 2;
      if( v11 >= 0x40 )
        return 0i64;
    }
  }
  return 0i64;
}

Referenced by:

RtlCopyContext
RtlpCopyExtendedContext