ページの操作
現在のコンピューター上のページのサイズを確認するには、 GetSystemInfo 関数を使用します。
VirtualQuery 関数と VirtualQueryEx 関数は、プロセスのアドレス空間内の指定されたアドレスから始まる連続するページの領域に関する情報を返します。 VirtualQuery は 、呼び出し元プロセスのメモリに関する情報を返します。 VirtualQueryEx は、指定されたプロセス内のメモリに関する情報を返し、デバッグ中のプロセスに関する情報を必要とするデバッガーをサポートするために使用されます。 ページの領域は、最も近いページ境界に切り捨てられた指定されたアドレスで囲まれます。 これは、次の属性を共通に使用して、後続のすべてのページに拡張されます。
- すべてのページの状態は同じです。コミット済み、予約済み、または空きページのいずれかです。
- 初期ページが空きでない場合、リージョン内のすべてのページは、 VirtualAlloc の呼び出しによって予約されたページの同じ初期割り当ての一部です。
- すべてのページのアクセス保護は同じです ( つまり、PAGE_READONLY、 PAGE_READWRITE、 またはPAGE_NOACCESS)。
VirtualLock 関数を使用すると、コミットされたメモリの 1 つ以上のページを物理メモリ (RAM) にロックし、システムがページをページング ファイルにスワップするのを防ぐことができます。 これは、ディスク アクセスなしで重要なデータに確実にアクセスできるようにするために使用できます。 ページをメモリにロックすると、システムがメモリを管理する機能が制限されるため、危険です。 VirtualLock を過剰に使用すると、実行可能コードがページング ファイルにスワップされ、システム のパフォーマンスが低下する可能性があります。 VirtualUnlock 関数は、VirtualLock によってロックされているメモリのロックを解除します。
VirtualProtect 関数を使用すると、プロセスのアドレス空間内のコミットされたページのアクセス保護をプロセスで変更できます。 たとえば、プロセスは機密データを格納するために読み取り/書き込みページを割り当てることができ、誤って上書きされないようにアクセス権を読み取り専用またはアクセス権なしで変更できます。 VirtualProtect は通常、 VirtualAlloc によって割り当てられたページで使用されますが、他の割り当て関数によってコミットされたページでも機能します。 ただし、 VirtualProtect はページ全体の保護を変更します。他の関数によって返されるポインターは、必ずしもページ境界に合わせて配置されるとは限りません。 VirtualProtectEx 関数は VirtualProtect に似ていますが、指定されたプロセスでメモリの保護が変更される点が除きます。 保護の変更は、デバッグ中のプロセスのメモリにアクセスするデバッガーに役立ちます。