メモリ保護定数

メモリ保護オプションを次に示します。メモリ内のページを割り当てるか保護する場合は、次のいずれかの値を指定する必要があります。 保護属性をページの一部に割り当てることはできません。ページ全体にのみ割り当てることができます。

STDMETHODIMP CExtBuffer::FInit
    (
    ULONG cItemMax,     //@parm IN | Maximum number of items ever
    ULONG cbItem,       //@parm IN | Size of each item, in bytes
    ULONG cbPage        //@parm IN | Size of system page size (from SysInfo)
    )
{
    BYTE  *pb;

    m_cbReserved = ((cbItem *cItemMax) / cbPage + 1) *cbPage;
    m_rgItem = (BYTE *) VirtualAlloc( NULL, m_cbReserved, MEM_RESERVE, PAGE_READWRITE );

    if (m_rgItem == NULL)
        return ResultFromScode( E_OUTOFMEMORY );

    m_cbItem  = cbItem;
    m_dbAlloc = (cbItem / cbPage + 1) *cbPage;
    pb = (BYTE *) VirtualAlloc( m_rgItem, m_dbAlloc, MEM_COMMIT, PAGE_READWRITE );
    if (pb == NULL)
        {
        VirtualFree((VOID *) m_rgItem, 0, MEM_RELEASE );
        m_rgItem = NULL;
        return ResultFromScode( E_OUTOFMEMORY );
        }

    m_cbAlloc = m_dbAlloc;
    return ResultFromScode( S_OK );
}

GitHub の Windows クラシック サンプル から例を示します。

定数

定数/値 Description
PAGE_EXECUTE
0x10
コミットされたページ領域への実行アクセスを有効にします。 コミットされたリージョンに書き込もうとすると、アクセス違反が発生します。
このフラグは、 CreateFileMapping 関数ではサポートされていません。
PAGE_EXECUTE_READ
0x20
コミットされたページ領域への実行または読み取り専用アクセスを有効にします。 コミットされたリージョンに書き込もうとすると、アクセス違反が発生します。
Windows Server 2003 および Windows XP: この属性は、Windows XP と SP2、Windows Server 2003 SP1 まで CreateFileMapping 関数ではサポートされません。
PAGE_EXECUTE_READWRITE
0x40
コミットされたページ領域への実行、読み取り専用、または読み取り/書き込みアクセスを有効にします。
Windows Server 2003 および Windows XP: この属性は、Windows XP と SP2、Windows Server 2003 SP1 まで CreateFileMapping 関数ではサポートされません。
PAGE_EXECUTE_WRITECOPY
0x80
ファイル マッピング オブジェクトのマップされたビューへの実行、読み取り専用、または書き込み時のコピー アクセスを有効にします。 コミットされた書き込み時のコピー ページに書き込もうとすると、そのプロセスに対してページのプライベート コピーが作成されます。 プライベート ページは PAGE_EXECUTE_READWRITEとしてマークされ、変更が新しいページに書き込まれます。
このフラグは、VirtualAlloc 関数または VirtualAllocEx 関数ではサポートされていません。 Windows Vista、Windows Server 2003、Windows XP: この属性は、Sp1 および Windows Server 2008 を使用する Windows Vista まで 、CreateFileMapping 関数ではサポートされません。

PAGE_NOACCESS
0x01
コミットされたページ領域へのすべてのアクセスを無効にします。 コミットされたリージョンの読み取り、書き込み、または実行を試みると、アクセス違反が発生します。
このフラグは、 CreateFileMapping 関数ではサポートされていません。
PAGE_READONLY
0x02
コミットされたページ領域への読み取り専用アクセスを有効にします。 コミットされたリージョンに書き込もうとすると、アクセス違反が発生します。 データ実行防止が有効になっている場合、コミットされたリージョンでコードを実行しようとすると、アクセス違反が発生します。
PAGE_READWRITE
0x04
コミットされたページ領域への読み取り専用または読み取り/書き込みアクセスを有効にします。 データ実行防止が有効になっている場合、コミットされたリージョンでコードを実行しようとすると、アクセス違反が発生します。
PAGE_WRITECOPY
0x08
ファイル マッピング オブジェクトのマップされたビューへの読み取り専用または書き込み時コピー アクセスを有効にします。 コミットされた書き込み時のコピー ページに書き込もうとすると、そのプロセスに対してページのプライベート コピーが作成されます。 プライベート ページは PAGE_READWRITEとしてマークされ、変更が新しいページに書き込まれます。 データ実行防止が有効になっている場合、コミットされたリージョンでコードを実行しようとすると、アクセス違反が発生します。
このフラグは、VirtualAlloc 関数または VirtualAllocEx 関数ではサポートされていません。
PAGE_TARGETS_INVALID
0x40000000
ページ内のすべての場所を CFG の無効なターゲットとして設定します。 PAGE_EXECUTE、PAGE_EXECUTE_READ、PAGE_EXECUTE_READWRITEPAGE_EXECUTE_WRITECOPYなどのページの実行保護と共に使用されます。 これらのページ内の場所への間接呼び出しは CFG チェックに失敗し、プロセスは終了します。 割り当てられた実行可能ページの既定の動作は、CFG の有効な呼び出しターゲットとしてマークされます。
このフラグは、 VirtualProtect 関数または CreateFileMapping 関数ではサポートされていません。
PAGE_TARGETS_NO_UPDATE
0x40000000
VirtualProtect の保護が変更されている間、リージョン内のページの CFG 情報は更新されません。 たとえば、リージョン内のページが PAGE_TARGETS_INVALID を使用して割り当てられた場合、ページ保護が変更されている間は無効な情報が保持されます。 このフラグは、保護がPAGE_EXECUTE、PAGE_EXECUTE_READPAGE_EXECUTE_READWRITEPAGE_EXECUTE_WRITECOPYなどの実行可能ファイルの種類に変更された場合にのみ有効です。 VirtualProtect 保護の実行可能ファイルへの変更の既定の動作は、すべての場所を CFG の有効な呼び出しターゲットとしてマークすることです。

前の表に示したオプションに加えて使用できる修飾子を次に示します (ただし、特に記載されている場合を除く)。

定数/値 Description
PAGE_GUARD
0x100
リージョン内のページは保護ページになります。 ガード ページにアクセスしようとすると、システムは STATUS_GUARD_PAGE_VIOLATION 例外を発生させ、保護ページの状態をオフにします。 したがって、ガード ページは 1 回限りのアクセス アラームとして機能します。 詳細については、「Creating Guard Pages」 (ガード ページの作成) をご覧ください。
アクセス試行によってシステムが保護ページの状態をオフにすると、基になるページ保護が引き継がれます。
システム サービス中にガード ページの例外が発生した場合、通常、サービスはエラー状態インジケーターを返します。
この値は 、PAGE_NOACCESSでは使用できません。
このフラグは、 CreateFileMapping 関数ではサポートされていません。
PAGE_NOCACHE
0x200
すべてのページをキャッシュ不可に設定します。 アプリケーションでは、デバイスに明示的に必要な場合を除き、この属性を使用しないでください。 SEC_NOCACHEにマップされたメモリでインターロックされた関数 使用すると、 EXCEPTION_ILLEGAL_INSTRUCTION 例外が発生する可能性があります。
PAGE_NOCACHE フラグは、PAGE_GUARD、PAGE_NOACCESS、または PAGE_WRITECOMBINE フラグでは使用できません。
PAGE_NOCACHE フラグは、VirtualAlloc、VirtualAllocEx、またはVirtualAllocExNuma 関数を使用してプライベート メモリを割り当てる場合にのみ使用できます。 共有メモリに対してキャッシュされていないメモリ アクセスを有効にするには、CreateFileMapping 関数を呼び出すときに SEC_NOCACHE フラグを指定します。
PAGE_WRITECOMBINE
0x400
すべてのページを書き込み結合するように設定します。
アプリケーションでは、デバイスに明示的に必要な場合を除き、この属性を使用しないでください。 インターロックされた関数を、書き込み結合としてマップされたメモリと共に使用すると、 EXCEPTION_ILLEGAL_INSTRUCTION 例外が発生する可能性があります。
PAGE_WRITECOMBINE フラグは、PAGE_NOACCESS、PAGE_GUARDおよび PAGE_NOCACHE フラグでは指定できません。
PAGE_WRITECOMBINE フラグは、VirtualAlloc、VirtualAllocEx、またはVirtualAllocExNuma 関数を使用してプライベート メモリを割り当てる場合にのみ使用できます。 共有メモリに対して書き込み結合メモリ アクセスを有効にするには、CreateFileMapping 関数を呼び出すときに SEC_WRITECOMBINE フラグを指定します。
Windows Server 2003 および Windows XP: このフラグは、Windows Server 2003 SP1 までサポートされていません。

次の定数は、Intel Software Guard Extensions (SGX) アーキテクチャを持つエンクレーブを指定する場合にのみ、サポートされている関数と共に使用できます。

定数 説明 サポートされている関数
PAGE_ENCLAVE_DECOMMIT
エンクレーブでそれ以上使用されないようにページが保護されることを示します。
このフラグを他のフラグと組み合わせてはいけません。
このフラグは、SGX2 エンクレーブに対してのみ有効です。
VirtualProtect
PAGE_ENCLAVE_THREAD_CONTROL
このページには、スレッド制御構造体 (TCS) が含まれています。
LoadEnclaveData
VirtualProtect
PAGE_ENCLAVE_UNVALIDATED
指定したページ コンテンツは、Intel SGX プログラミング モデルの EEXTEND 命令を使用した測定から除外されます。
LoadEnclaveData

要件

要件
サポートされている最小のクライアント
Windows XP [デスクトップ アプリのみ]
サポートされている最小のサーバー
Windows Server 2003 [デスクトップ アプリのみ]
ヘッダー
WinNT.h (Windows.h を含む)

関連項目

CreateFileMapping

メモリの保護

VirtualAlloc

VirtualAllocEx

LoadEnclaveData