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