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