VirtualProtectFromApp 関数 (memoryapi.h)
呼び出し元プロセスの仮想アドレス空間内のコミット済みページのリージョンの保護を変更します。
構文
BOOL VirtualProtectFromApp(
[in] PVOID Address,
[in] SIZE_T Size,
[in] ULONG NewProtection,
[out] PULONG OldProtection
);
パラメーター
[in] Address
アクセス保護属性を変更するページの領域の開始ページを記述するアドレスを指すポインター。
指定したリージョン内のすべてのページは、MEM_RESERVEを使用して VirtualAlloc、VirtualAllocFromApp、または VirtualAllocEx 関数を呼び出すときに割り当てられた同じ予約リージョン内に存在する必要があります。 ページは、MEM_RESERVEを使用して VirtualAlloc、VirtualAllocFromApp、または VirtualAllocEx への個別の呼び出しによって割り当てられた隣接する予約リージョンにまたがることはできません。
[in] Size
アクセス保護属性を変更するリージョンのサイズ (バイト単位)。 影響を受けるページの領域には、 Address パラメーターから までの範囲内の 1 つ以上のバイトを含むすべてのページが (Address+Size)
含まれます。 つまり、ページ境界にまたがる 2 バイト範囲では、両方のページの保護属性が変更されます。
[in] NewProtection
メモリ保護オプション。 このパラメーターには、 メモリ保護定数のいずれかを指定できます。
マップされたビューの場合、この値は、ビューがマップされたときに指定されたアクセス保護と互換性がある必要があります ( 「MapViewOfFile、 MapViewOfFileEx、および MapViewOfFileExNuma」を参照してください)。
次の定数を指定すると、エラーが発生します。
- PAGE_EXECUTE_READWRITE
- PAGE_EXECUTE_WRITECOPY
- PAGE_EXECUTE
- PAGE_EXECUTE_READ
[out] OldProtection
指定したページ領域の最初のページの以前のアクセス保護値を受け取る変数へのポインター。 このパラメーターが NULL であるか、有効な変数を指していない場合、関数は失敗します。
戻り値
関数が成功すると、戻り値は 0 以外になります。
関数が失敗した場合は、0 を返します。 詳細なエラー情報を得るには、GetLastError を呼び出します。
解説
Just-In-Time (JIT) 機能を備えた Windows ストア アプリから VirtualProtectFromApp を呼び出して、JIT 機能を使用できます。 JIT 機能を使用するには、アプリマニフェスト ファイルに codeGeneration 機能を含める必要があります。
アクセス保護の値は、コミットされたページでのみ設定できます。 指定したリージョン内のページの状態がコミットされていない場合、関数は失敗し、指定したリージョン内のページのアクセス保護を変更せずに を返します。
PAGE_GUARD保護修飾子は、保護ページを確立します。 ガード ページは、ワンショット アクセス アラームとして機能します。 詳細については、「Creating Guard Pages」 (ガード ページの作成) をご覧ください。
VirtualProtectFromApp を使用して、GlobalAlloc、HeapAlloc、または LocalAlloc によって割り当てられたメモリ ブロックのページ保護を変更しないようにすることをお勧めします。これは、1 つのページに複数のメモリ ブロックが存在する可能性があるためです。 ヒープ マネージャーは、ヒープ内のすべてのページが少なくとも読み取りおよび書き込みアクセス権を付与することを前提としています。
VirtualProtectFromApp を使用すると、ページを実行可能としてマークできますが、書き込みアクセス許可と実行アクセス許可の両方を同時に設定することはできません。
実行可能なリージョンを保護する場合、呼び出し元のプログラムは、コードが設定されたら 、FlushInstructionCache への適切な呼び出しを介してキャッシュの一貫性を確保する責任を負います。 そうしないと、新しく実行可能なリージョンからコードを実行しようとすると、予期しない結果が発生する可能性があります。
要件
要件 | 値 |
---|---|
サポートされている最小のクライアント | Windows 10 [デスクトップ アプリ |UWP アプリ] |
サポートされている最小のサーバー | Windows Server 2016 [デスクトップ アプリ |UWP アプリ] |
対象プラットフォーム | Windows |
ヘッダー | memoryapi.h (Windows.h を含む) |
Library | WindowsApp.lib |
[DLL] | Kernel32.dll |