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_SGX
0x00000001
Intel Software Guard Extensions (SGX) アーキテクチャ拡張機能のエンクレーブ。
ENCLAVE_TYPE_SGX2
0x00000002
SGX2 および SGX1 エンクレーブをサポートします。 プラットフォームと OS では、(他の SGX2 コンストラクトに加えて) このプラットフォームで EDMM を使用した SGX2 命令がサポートされています。
ENCLAVE_TYPE_VBS
0x00000010
VBS エンクレーブ。

[in] lpEnclaveInformation

エンクレーブの作成に使用するアーキテクチャ固有の情報へのポインター。

ENCLAVE_TYPE_SGXENCLAVE_TYPE_SGX2エンクレーブ型の場合は、ENCLAVE_CREATE_INFO_SGX構造体へのポインターを指定する必要があります。

ENCLAVE_TYPE_VBSエンクレーブ型の場合は、ENCLAVE_CREATE_INFO_VBS構造体へのポインターを指定する必要があります。

[in] dwInfoLength

lpEnclaveInformation パラメーターが指す構造体の長さ (バイト単位)。 ENCLAVE_TYPE_SGXENCLAVE_TYPE_SGX2エンクレーブの種類の場合、この値は 4096 である必要があります。 ENCLAVE_TYPE_VBSエンクレーブ型の場合、この値は sizeof(ENCLAVE_CREATE_INFO_VBS)36 バイトである 必要があります。

[out, optional] lpEnclaveError

アーキテクチャ固有のエンクレーブ エラー コードを受け取る変数への省略可能なポインター。 ENCLAVE_TYPE_SGXENCLAVE_TYPE_SGX2ENCLAVE_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_RELEASEMEM_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

こちらもご覧ください

エンクレーブ関数

ENCLAVE_CREATE_INFO_SGX

ENCLAVE_CREATE_INFO_VBS

InitializeEnclave

IsEnclaveTypeSupported

LoadEnclaveData

VirtualFree

VirtualFreeEx