Функция CreateEnclave (enclaveapi.h)
Создает неинициализированный анклав. Анклав — это изолированная область кода и данных в адресном пространстве приложения. Только код, который выполняется в анклаве, может получить доступ к данным в том же анклаве.
Синтаксис
LPVOID CreateEnclave(
[in] HANDLE hProcess,
[in, optional] LPVOID lpAddress,
[in] SIZE_T dwSize,
[in] SIZE_T dwInitialCommitment,
[in] DWORD flEnclaveType,
[in] LPCVOID lpEnclaveInformation,
[in] DWORD dwInfoLength,
[out, optional] LPDWORD lpEnclaveError
);
Параметры
[in] hProcess
Дескриптор процесса, для которого требуется создать анклав.
[in, optional] lpAddress
Предпочтительный базовый адрес анклава. Укажите ЗНАЧЕНИЕ NULL , чтобы операционная система назначила базовый адрес.
[in] dwSize
Размер создаваемого анклава, включая размер кода, который будет загружен в анклав, в байтах.
Размер анклавов VBS должен быть кратным 2 МБ.
Анклавы SGX должны иметь размер 2, а их основание должно выровняться с той же мощностью 2, что и размер, с минимальным выравниванием в 2 МБ. Например, если анклав составляет 128 МБ, его основание должно быть выровнено по границе 128 МБ.
[in] dwInitialCommitment
Объем памяти для фиксации для анклава в байтах.
Если доступной памяти анклава недостаточно для фиксации этого количества байтов, создание анклава завершится ошибкой. Любая память, которая остается неиспользуемой при инициализации анклава путем вызова InitializeEnclave , возвращается в список свободных страниц.
Значение параметра dwInitialCommittment не должно превышать значение параметра dwSize .
Этот параметр не используется для анклавов безопасности на основе виртуализации (VBS).
[in] flEnclaveType
Тип архитектуры анклава, который требуется создать. Чтобы убедиться, что тип анклава поддерживается, вызовите IsEnclaveTypeSupported.
Значение | Значение |
---|---|
ENCLAVE_TYPE_SGX0x00000001 |
Анклав для расширения архитектуры Intel Software Guard Extensions (SGX). |
ENCLAVE_TYPE_SGX20x00000002 |
Поддерживает анклавы SGX2 и SGX1. Платформа и ОС поддерживают инструкции SGX2 с EDMM на этой платформе (в дополнение к другим конструкциям SGX2). |
ENCLAVE_TYPE_VBS0x00000010 |
Анклав VBS. |
[in] lpEnclaveInformation
Указатель на сведения об архитектуре, используемые для создания анклава.
Для типов анклавов ENCLAVE_TYPE_SGX и ENCLAVE_TYPE_SGX2 необходимо указать указатель на структуру ENCLAVE_CREATE_INFO_SGX .
Для типа анклава ENCLAVE_TYPE_VBS необходимо указать указатель на структуру ENCLAVE_CREATE_INFO_VBS .
[in] dwInfoLength
Длина структуры, на которую указывает параметр lpEnclaveInformation , в байтах. Для типов анклавов ENCLAVE_TYPE_SGX и ENCLAVE_TYPE_SGX2 это значение должно быть равно 4096. Для типа анклава ENCLAVE_TYPE_VBS это значение должно быть sizeof(ENCLAVE_CREATE_INFO_VBS)
равным 36 байтам.
[out, optional] lpEnclaveError
Необязательный указатель на переменную, получающую код ошибки анклава, зависящий от архитектуры. Для типов анклавов ENCLAVE_TYPE_SGX, ENCLAVE_TYPE_SGX2 и ENCLAVE_TYPE_VBS параметр lpEnclaveError не используется.
Возвращаемое значение
Если функция выполнена успешно, возвращаемым значением будет базовый адрес созданного анклава.
Если функция завершается сбоем, возвращается значение NULL. Дополнительные сведения об ошибке можно получить, вызвав GetLastError.
Список распространенных кодов ошибок см. в разделе Системные коды ошибок. Для этой функции также применяются следующие коды ошибок.
Код возврата | Описание |
---|---|
ERROR_NOT_SUPPORTED | Указан неподдерживаемый тип анклава. |
ERROR_BAD_LENGTH | Значение параметра dwInfoLength не соответствует ожидаемому значению на основе значения, указанного для параметра lpEnclaveInformation . |
Комментарии
Чтобы загрузить данные в анклав после его создания, вызовите LoadEnclaveData. Чтобы инициализировать анклав после загрузки данных, вызовите Метод InitializeEnclave.
Windows 10 версии 1709: чтобы удалить анклав после его использования, вызовите Метод DeleteEnclave. Вы не можете удалить анклав VBS, вызвав функцию VirtualFree или VirtualFreeEx . Вы по-прежнему можете удалить анклав SGX, вызвав VirtualFree или VirtualFreeEx.
Windows 10 версии 1507, Windows 10, версии 1511, Windows 10, версии 1607 и Windows 10 версии 1703. Чтобы удалить анклав после его использования, вызовите функцию VirtualFree или VirtualFreeEx и укажите следующие значения:
- Базовый адрес анклава для параметра lpAddress .
- 0 для параметра dwSize .
- MEM_RELEASE для параметра dwFreeType . Значение MEM_DECOMMIT не поддерживается для анклавов.
Сведения об архитектуре расширения Intel Software Guard Extensions (SGX) см. в разделе Расширения Intel Software Guard.
Требования
Требование | Значение |
---|---|
Минимальная версия клиента | Windows 10 [классические приложения | Приложения UWP] |
Минимальная версия сервера | Windows Server 2016 [классические приложения | Приложения UWP] |
Целевая платформа | Windows |
Header | enclaveapi.h (включая Winbase.h) |
Библиотека | Kernel32.lib |
DLL | Api-ms-win-core-enclave-l1-1-0.dll; Kernel32.dll; KernelBase.dll |