KeAddEnclavePage

NTSTATUS __stdcall KeAddEnclavePage(
        PVOID EnclaveControlAddress,
        PVOID SourceAddress,
        PVOID DestinationAddress,
        PVOID EnclaveAddress,
        UINT64 PageType,
        UINT64 *ReturnedError){
  _DWORD *v6; 
  ULONG_PTR v11; 
  unsigned int v12; 
  int v13; 
  int v14; 
  int v15; 
  int v17; 
  bool v18; 
  int v19; 
  v6 = (_DWORD *)((unsigned __int64)&v19 & 0xFFFFFFFFFFFFFFC0ui64);
  memset(((unsigned __int64)&v19 & 0xFFFFFFFFFFFFFFC0ui64) + 64, 0i64);
  v11 = KeFeatureBits;
  *(_DWORD *)ReturnedError = 0;
  if( (v11 & 0x10000000000i64) == 0 )
    return -1073741637;
  if( (PageType & 0x40) != 0 )
  {
    if( (KeFeatureBits & 0x80000000000i64) == 0 )
      return -1073741800;
    v12 = 13;
    if( (PageType & 0xF) != 3 )
      return -1073741755;
    *(_QWORD *)(((unsigned __int64)&v19 & 0xFFFFFFFFFFFFFFC0ui64) + 0x28) = 0i64;
    *(_QWORD *)(((unsigned __int64)&v19 & 0xFFFFFFFFFFFFFFC0ui64) + 0x30) = 0i64;
  }
  else
  {
    v12 = 1;
    v13 = PageType & 1 | 2;
    if( (PageType & 2) == 0 )
      v13 = PageType & 1;
    v14 = v13 | 4;
    if( (PageType & 4) == 0 )
      v14 = v13;
    if( (PageType & 8) != 0 )
      v15 = v14 | 0x100;
    else
      v15 = v14 | 0x200;
    *(_DWORD *)(((unsigned __int64)&v19 & 0xFFFFFFFFFFFFFFC0ui64) + 0x40) = v15;
    *(_QWORD *)(((unsigned __int64)&v19 & 0xFFFFFFFFFFFFFFC0ui64) + 0x28) = SourceAddress;
    *(_QWORD *)(((unsigned __int64)&v19 & 0xFFFFFFFFFFFFFFC0ui64) + 0x30) = ((unsigned __int64)&v19 & 0xFFFFFFFFFFFFFFC0ui64)
                                                                          + 64;
  }
  *(_QWORD *)(((unsigned __int64)&v19 & 0xFFFFFFFFFFFFFFC0ui64) + 0x20) = EnclaveAddress;
  *(_QWORD *)(((unsigned __int64)&v19 & 0xFFFFFFFFFFFFFFC0ui64) + 0x38) = EnclaveControlAddress;
  KiEncls(v12);
  if( (PageType & 0x50) == 0 )
  {
    v17 = 4096;
    *v6 = 4096;
    do
    {
      KiEncls(6ui64);
      DestinationAddress = (char *)DestinationAddress + 256;
      *(_QWORD *)(((unsigned __int64)&v19 & 0xFFFFFFFFFFFFFFC0ui64) + 8) = DestinationAddress;
      v18 = v17 == 256;
      v17 -= 256;
      *v6 = v17;
    }
    while( !v18 );
  }
  return 0;
}

Referenced by:

MiAddPagesToEnclave
MiCopyPagesIntoEnclave