VslCallEnclave

__int64 __fastcall VslCallEnclave(
        __int64 a1,
        int *a2,
        __int64 *a3,
        int a4,
        __int64 *a5,
        __int64 *a6,
        __int64 *a7,
        _DWORD *a8,
        _BYTE *a9){
  unsigned __int64 CurrentThread; 
  INT64 v12; 
  NTSTATUS v13; 
  INT64 v14; 
  char MemoryDescriptorList[56]; 
  INT64 v19[14]; 

  memset(v19, 0i64, 0x68u);
  *(_DWORD *)&MemoryDescriptorList[52] = 0;
  CurrentThread = (unsigned __int64)KeGetCurrentThread();
  *(_QWORD *)MemoryDescriptorList = 0i64;
  *(_WORD *)&MemoryDescriptorList[8] = 8 * (((unsigned __int16)((CurrentThread & 0xFFF) + 6295) >> 12) + 6);
  memset(&MemoryDescriptorList[10], 0, 22);
  *(_QWORD *)&MemoryDescriptorList[32] = CurrentThread & 0xFFFFFFFFFFFFF000ui64;
  *(_QWORD *)&MemoryDescriptorList[44] = CurrentThread & 0xFFF;
  *(_DWORD *)&MemoryDescriptorList[40] = 2200;
  MmProbeAndLockPages((PMDL)MemoryDescriptorList, 0, IoWriteAccess);
  LODWORD(v19[1]) = a4;
  HIDWORD(v19[1]) = *(_DWORD *)(a1 + 40);
  v19[2] = *a3;
  v19[3] = *a5;
  v19[4] = *(_QWORD *)&MemoryDescriptorList[48];
  BYTE4(v19[7]) = 0;
  v19[5] = *a6;
  v19[6] = *a7;
  v13 = VslpEnterIumSecureMode(1u, 0, (unsigned int)*a2, (INT64)v19);
  if( v13 < 0 )
  {
    *a9 = 0;
  }
  else
  {
    *a2 = HIDWORD(v19[0]);
    *a3 = v19[2];
    *a5 = v19[3];
    *a8 = v19[7];
    *a6 = v19[5];
    *a7 = v19[6];
    *a9 = BYTE5(v19[7]);
  }
  MmUnlockPages((INT64)MemoryDescriptorList, v12, v14);
  if( BYTE4(v19[7]) )
    KeAlertThreadByThreadId((_KTHREAD *)CurrentThread);
  return(unsigned int)v13;
}

Referenced by:

PsCallEnclave