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