VirtualLock 関数 (memoryapi.h)
プロセスの仮想アドレス空間の指定されたリージョンを物理メモリにロックし、そのリージョンへの後続のアクセスでページ エラーが発生しないようにします。
構文
BOOL VirtualLock(
[in] LPVOID lpAddress,
[in] SIZE_T dwSize
);
パラメーター
[in] lpAddress
ロックするページの領域のベース アドレスへのポインター。
[in] dwSize
ロックする領域のサイズ (バイト単位)。 影響を受けるページの領域には、 lpAddress パラメーターから までの範囲内の 1 つ以上のバイトを含むすべてのページが (lpAddress+dwSize)
含まれます。 つまり、ページ境界にまたがる 2 バイト範囲では、両方のページがロックされます。
戻り値
関数が成功すると、戻り値は 0 以外になります。
関数が失敗した場合は、0 を返します。 詳細なエラー情報を得るには、GetLastError を呼び出します。
解説
指定したリージョン内のすべてのページをコミットする必要があります。 PAGE_NOACCESSで保護されたメモリはロックできません。
ページをメモリにロックすると、使用可能な RAM を減らし、システムが他の重要なページをページング ファイルに入れ替える必要があるため、システムのパフォーマンスが低下する可能性があります。 Windows の各バージョンでは、プロセスがロックできるページの最大数に制限があります。 この制限は、パフォーマンスの重大な低下を回避するために意図的に小さくなります。 より多くのページをロックする必要があるアプリケーションでは、まず SetProcessWorkingSetSize 関数を 呼び出して、ワーキング セットの最小サイズと最大サイズを大きくする必要があります。 プロセスがロックできるページの最大数は、最小ワーキング セット内のページ数から小さなオーバーヘッドを差し引いた数に等しくなります。
プロセスがロックされたページは、プロセスがロックを解除するか終了するまで物理メモリに残ります。 これらのページは、ロックされている間はページファイルに書き込まれないように保証されます。
ロックされたページの領域のロックを解除するには、 VirtualUnlock 関数を使用します。 ロックされたページは、プロセスが終了すると自動的にロック解除されます。
この関数は、ロックカウントをインクリメントしてハンドルをポインターに変換しないという点で、 GlobalLock 関数や LocalLock 関数とは違います。 仮想ページのロックカウントがないため、ページの領域のロックを解除するために VirtualUnlock 関数を複数回呼び出す必要はありません。
例
例については、「 保護ページの作成」を参照してください。
要件
サポートされている最小のクライアント | Windows XP [デスクトップ アプリ | UWP アプリ] |
サポートされている最小のサーバー | Windows Server 2003 [デスクトップ アプリのみ | UWP アプリ] |
対象プラットフォーム | Windows |
ヘッダー | memoryapi.h (Windows.h、Memoryapi.h を含む) |
Library | onecore.lib |
[DLL] | Kernel32.dll |