KiCopyUchToStagingArea
NTSTATUS __stdcall KiCopyUchToStagingArea(INT64 a1, INT64 *a2){
__int64 v2;
unsigned __int64 v5;
__int64 v6;
__int64 v7;
_QWORD *v8;
_OWORD *v9;
_OWORD *v10;
__int64 v11;
__int128 v12;
INT64 v13;
v2 = *(_QWORD *)(a1 + 504);
v5 = ((unsigned __int64)a2 + 2791) & 0xFFFFFFFFFFFFFFF0ui64;
v6 = *(_QWORD *)(v2 + 32);
v7 = v5 - v6;
memmove((VOID *)(v5 - *(_QWORD *)(v2 + 40)), (const VOID *)(v6 - *(_QWORD *)(v2 + 40)), *(_QWORD *)(v2 + 40));
v8 = (_QWORD *)(v7 + v2);
*(_QWORD *)(a1 + 504) = v8;
v8[11] += v7;
v8[10] += v7;
v9 = (_OWORD *)v8[8];
v8[4] = v5;
v10 = (_OWORD *)*a2;
if( KUSER_SHARED_DATA.XState.EnabledFeatures )
{
v10[32] = v9[32];
v10[33] = v9[33];
v10[34] = v9[34];
v10[35] = v9[35];
KiCopyXStateArea(*a2, KUSER_SHARED_DATA.XState.EnabledFeatures & 0xFFFFFFFFFFFFFFFDui64, v8[8]);
}
else
{
v11 = 4i64;
do
{
*v10 = *v9;
v10[1] = v9[1];
v10[2] = v9[2];
v10[3] = v9[3];
v10[4] = v9[4];
v10[5] = v9[5];
v10[6] = v9[6];
v10 += 8;
v12 = v9[7];
v9 += 8;
*(v10 - 1) = v12;
--v11;
}
while( v11 );
}
v13 = *a2;
v8[8] = *a2;
return v13;
}Referenced by:
KeSynchronizeUmsThread