Поделиться через


Функция 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_SGX
0x00000001
Анклав для расширения архитектуры Intel Software Guard Extensions (SGX).
ENCLAVE_TYPE_SGX2
0x00000002
Поддерживает анклавы SGX2 и SGX1. Платформа и ОС поддерживают инструкции SGX2 с EDMM на этой платформе (в дополнение к другим конструкциям SGX2).
ENCLAVE_TYPE_VBS
0x00000010
Анклав 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

См. также раздел

Функции анклава

ENCLAVE_CREATE_INFO_SGX

ENCLAVE_CREATE_INFO_VBS

InitializeEnclave

IsEnclaveTypeSupported

LoadEnclaveData

VirtualFree

VirtualFreeEx