メモリ保護定数

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

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例を示します。

定数

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

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

定数/値 説明
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: このフラグは、SP1 を使用して Server 2003 Windowsするまでサポートされません。

次の定数は、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 [デスクトップ アプリのみ]
Header
WinNT.h (Windows.h を含む)

こちらもご覧ください

CreateFileMapping

メモリの保護

VirtualAlloc

VirtualAllocEx

LoadEnclaveData