RtlCreateEnclaveReturnFrame
INT64 __fastcall RtlCreateEnclaveReturnFrame(
INT64 a1,
INT64 a2,
INT64 a3,
INT64 a4,
INT64 a5,
UINT64 a6,
INT64 a7,
INT64 a8,
INT64 a9,
CHAR a10){
__int64 v11;
unsigned __int64 v12;
void *v13;
__int64 v14;
_QWORD *v16;
v11 = PspEnclaveDispatch;
if( *(_WORD *)(a1 + 368) != 51 || *(_QWORD *)(a1 + 360) != PspEnclaveDispatchReturn )
{
v12 = *(_QWORD *)(a1 + 384) - 80i64;
v16 = (_QWORD *)v12;
if( (v12 & 3) != 0 )
ExRaiseDatatypeMisalignment();
if( v12 >= 0x7FFFFFFF0000i64 )
v12 = 0x7FFFFFFF0000i64;
*(_BYTE *)v12 = *(_BYTE *)v12;
*(_BYTE *)(v12 + 7) = *(_BYTE *)(v12 + 7);
v16[5] = *(_QWORD *)(a1 + 80);
v16[7] = *(_QWORD *)(a1 + 360);
v16[8] = *(_QWORD *)(a1 + 344);
*(_QWORD *)(a1 + 384) = v16;
if( a10 )
{
v13 = (void *)(__readmsr(0x6A7u) - 8);
__wrussq(v13, *(_QWORD *)(a1 + 360));
__writemsr(0x6A7u, (unsigned __int64)v13);
}
}
if( a7 )
{
v14 = *(_QWORD *)(a1 + 384);
*(_QWORD *)(v14 + 64) = a8;
*(_QWORD *)(v14 + 72) = a7;
}
*(_QWORD *)(a1 + 56) = a4;
*(_QWORD *)(a1 + 64) = a5;
*(_QWORD *)(a1 + 72) = (unsigned int)a6;
*(_QWORD *)(a1 + 80) = a9;
*(_QWORD *)(a1 + 360) = v11;
*(_WORD *)(a1 + 368) = 51;
return 0i64;
}Referenced by:
PsCallEnclave