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 MB の倍数である必要があります。
SGX エンクレーブは、サイズが 2 の累乗である必要があり、そのベースはサイズと同じ 2 の累乗に揃え、最小アラインメントは 2 MB である必要があります。 たとえば、エンクレーブが 128 MB の場合、そのベースは 128 MB の境界に配置する必要があります。
[in] dwInitialCommitment
エンクレーブに対してコミットするメモリの量 (バイト単位)。
使用可能なエンクレーブ メモリの量が、このバイト数をコミットするのに十分でない場合、エンクレーブの作成は失敗します。 InitializeEnclave を呼び出してエンクレーブを初期化するときに未使用のままのメモリは、空きページの一覧に返されます。
dwInitialCommittment パラメーターの値は、dwSize パラメーターの値を超えることはできません。
このパラメーターは、仮想化ベースのセキュリティ (VBS) エンクレーブには使用されません。
[in] flEnclaveType
作成するエンクレーブのアーキテクチャの種類。 エンクレーブの種類がサポートされていることを確認するには、 IsEnclaveTypeSupported を呼び出します。
値 | 意味 |
---|---|
ENCLAVE_TYPE_SGX0x00000001 |
Intel Software Guard Extensions (SGX) アーキテクチャ拡張機能のエンクレーブ。 |
ENCLAVE_TYPE_SGX20x00000002 |
SGX2 および SGX1 エンクレーブをサポートします。 プラットフォームと OS では、(他の 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 を呼び出します。 VirtualFree または VirtualFreeEx 関数を呼び出して VBS エンクレーブを削除することはできません。 引き続き VirtualFree または VirtualFreeEx を呼び出して、SGX エンクレーブ を削除できます。
Windows 10、バージョン 1507、Windows 10、バージョン 1511、Windows 10、バージョン 1607、Windows 10、バージョン 1703: 使用が完了したときにエンクレーブを削除するには、VirtualFree または VirtualFreeEx 関数を呼び出し、次の値を指定します。
- lpAddress パラメーターのエンクレーブのベース アドレス。
- dwSize パラメーターの場合は 0。
- dwFreeType パラメーターのMEM_RELEASE。 MEM_DECOMMIT値はエンクレーブではサポートされていません。
Intel Software Guard Extensions (SGX) アーキテクチャ拡張機能の詳細については、「 Intel Software Guard Extensions」を参照してください。
要件
要件 | 値 |
---|---|
サポートされている最小のクライアント | Windows 10 [デスクトップ アプリ |UWP アプリ] |
サポートされている最小のサーバー | Windows Server 2016 [デスクトップ アプリ |UWP アプリ] |
対象プラットフォーム | Windows |
ヘッダー | enclaveapi.h (Winbase.h を含む) |
Library | Kernel32.lib |
[DLL] | Api-ms-win-core-enclave-l1-1-0.dll;Kernel32.dll;KernelBase.dll |