メモリ保護定数
メモリ保護オプションを次に示します。メモリ内のページを割り当てるか保護する場合は、次のいずれかの値を指定する必要があります。 保護属性をページの一部に割り当てることはできません。ページ全体にのみ割り当てることができます。
例
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 |
---|---|
|
コミットされたページ領域への実行アクセスを有効にします。 コミットされたリージョンに書き込もうとすると、アクセス違反が発生します。 このフラグは、 CreateFileMapping 関数ではサポートされていません。 |
|
コミットされたページ領域への実行または読み取り専用アクセスを有効にします。 コミットされたリージョンに書き込もうとすると、アクセス違反が発生します。 Windows Server 2003 および Windows XP: この属性は、Windows XP と SP2、Windows Server 2003 SP1 まで CreateFileMapping 関数ではサポートされません。 |
|
コミットされたページ領域への実行、読み取り専用、または読み取り/書き込みアクセスを有効にします。 Windows Server 2003 および Windows XP: この属性は、Windows XP と SP2、Windows Server 2003 SP1 まで CreateFileMapping 関数ではサポートされません。 |
|
ファイル マッピング オブジェクトのマップされたビューへの実行、読み取り専用、または書き込み時のコピー アクセスを有効にします。 コミットされた書き込み時のコピー ページに書き込もうとすると、そのプロセスに対してページのプライベート コピーが作成されます。 プライベート ページは PAGE_EXECUTE_READWRITEとしてマークされ、変更が新しいページに書き込まれます。 このフラグは、VirtualAlloc 関数または VirtualAllocEx 関数ではサポートされていません。 Windows Vista、Windows Server 2003、Windows XP: この属性は、Sp1 および Windows Server 2008 を使用する Windows Vista まで 、CreateFileMapping 関数ではサポートされません。 |
|
コミットされたページ領域へのすべてのアクセスを無効にします。 コミットされたリージョンの読み取り、書き込み、または実行を試みると、アクセス違反が発生します。 このフラグは、 CreateFileMapping 関数ではサポートされていません。 |
|
コミットされたページ領域への読み取り専用アクセスを有効にします。 コミットされたリージョンに書き込もうとすると、アクセス違反が発生します。
データ実行防止が有効になっている場合、コミットされたリージョンでコードを実行しようとすると、アクセス違反が発生します。 |
|
コミットされたページ領域への読み取り専用または読み取り/書き込みアクセスを有効にします。
データ実行防止が有効になっている場合、コミットされたリージョンでコードを実行しようとすると、アクセス違反が発生します。 |
|
ファイル マッピング オブジェクトのマップされたビューへの読み取り専用または書き込み時コピー アクセスを有効にします。 コミットされた書き込み時のコピー ページに書き込もうとすると、そのプロセスに対してページのプライベート コピーが作成されます。 プライベート ページは PAGE_READWRITEとしてマークされ、変更が新しいページに書き込まれます。
データ実行防止が有効になっている場合、コミットされたリージョンでコードを実行しようとすると、アクセス違反が発生します。 このフラグは、VirtualAlloc 関数または VirtualAllocEx 関数ではサポートされていません。 |
|
ページ内のすべての場所を CFG の無効なターゲットとして設定します。
PAGE_EXECUTE、PAGE_EXECUTE_READ、PAGE_EXECUTE_READWRITE、PAGE_EXECUTE_WRITECOPYなどのページの実行保護と共に使用されます。 これらのページ内の場所への間接呼び出しは CFG チェックに失敗し、プロセスは終了します。 割り当てられた実行可能ページの既定の動作は、CFG の有効な呼び出しターゲットとしてマークされます。 このフラグは、 VirtualProtect 関数または CreateFileMapping 関数ではサポートされていません。 |
|
VirtualProtect の保護が変更されている間、リージョン内のページの CFG 情報は更新されません。 たとえば、リージョン内のページが PAGE_TARGETS_INVALID を使用して割り当てられた場合、ページ保護が変更されている間は無効な情報が保持されます。 このフラグは、保護がPAGE_EXECUTE、PAGE_EXECUTE_READ、PAGE_EXECUTE_READWRITE、PAGE_EXECUTE_WRITECOPYなどの実行可能ファイルの種類に変更された場合にのみ有効です。
VirtualProtect 保護の実行可能ファイルへの変更の既定の動作は、すべての場所を CFG の有効な呼び出しターゲットとしてマークすることです。 |
前の表に示したオプションに加えて使用できる修飾子を次に示します (ただし、特に記載されている場合を除く)。
定数/値 | Description |
---|---|
|
リージョン内のページは保護ページになります。 ガード ページにアクセスしようとすると、システムは STATUS_GUARD_PAGE_VIOLATION 例外を発生させ、保護ページの状態をオフにします。 したがって、ガード ページは 1 回限りのアクセス アラームとして機能します。 詳細については、「Creating Guard Pages」 (ガード ページの作成) をご覧ください。 アクセス試行によってシステムが保護ページの状態をオフにすると、基になるページ保護が引き継がれます。 システム サービス中にガード ページの例外が発生した場合、通常、サービスはエラー状態インジケーターを返します。 この値は 、PAGE_NOACCESSでは使用できません。 このフラグは、 CreateFileMapping 関数ではサポートされていません。 |
|
すべてのページをキャッシュ不可に設定します。 アプリケーションでは、デバイスに明示的に必要な場合を除き、この属性を使用しないでください。 SEC_NOCACHEにマップされたメモリでインターロックされた関数 を 使用すると、 EXCEPTION_ILLEGAL_INSTRUCTION 例外が発生する可能性があります。 PAGE_NOCACHE フラグは、PAGE_GUARD、PAGE_NOACCESS、または PAGE_WRITECOMBINE フラグでは使用できません。 PAGE_NOCACHE フラグは、VirtualAlloc、VirtualAllocEx、またはVirtualAllocExNuma 関数を使用してプライベート メモリを割り当てる場合にのみ使用できます。 共有メモリに対してキャッシュされていないメモリ アクセスを有効にするには、CreateFileMapping 関数を呼び出すときに SEC_NOCACHE フラグを指定します。 |
|
すべてのページを書き込み結合するように設定します。 アプリケーションでは、デバイスに明示的に必要な場合を除き、この属性を使用しないでください。 インターロックされた関数を、書き込み結合としてマップされたメモリと共に使用すると、 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) アーキテクチャを持つエンクレーブを指定する場合にのみ、サポートされている関数と共に使用できます。
定数 | 説明 | サポートされている関数 |
---|---|---|
|
エンクレーブでそれ以上使用されないようにページが保護されることを示します。 このフラグを他のフラグと組み合わせてはいけません。 このフラグは、SGX2 エンクレーブに対してのみ有効です。 |
VirtualProtect |
|
このページには、スレッド制御構造体 (TCS) が含まれています。 |
LoadEnclaveData VirtualProtect |
|
指定したページ コンテンツは、Intel SGX プログラミング モデルの EEXTEND 命令を使用した測定から除外されます。 |
LoadEnclaveData |
要件
要件 | 値 |
---|---|
サポートされている最小のクライアント |
Windows XP [デスクトップ アプリのみ] |
サポートされている最小のサーバー |
Windows Server 2003 [デスクトップ アプリのみ] |
ヘッダー |
|