ZwFreeVirtualMemory 関数 (ntifs.h)
ZwFreeVirtualMemory ルーチンのリリース、デコミット、またはその両方、指定されたプロセスの仮想アドレス空間内のページの領域です。
構文
NTSYSAPI NTSTATUS ZwFreeVirtualMemory(
[in] HANDLE ProcessHandle,
[in, out] PVOID *BaseAddress,
[in, out] PSIZE_T RegionSize,
[in] ULONG FreeType
);
パラメーター
[in] ProcessHandle
解放されるページが存在するコンテキスト内のプロセスのハンドル。 Ntddk.h で定義されている NtCurrentProcess マクロを使用して、現在のプロセスを指定します。
[in, out] BaseAddress
解放されたページ領域の仮想アドレスを受け取る変数へのポインター。
MEM_RELEASE フラグが FreeType パラメーターに設定されている場合、BaseAddress は、リージョンが予約されたときに ZwAllocateVirtualMemory によって返されるベース アドレスである必要があります。
[in, out] RegionSize
解放されたページ領域の実際のサイズ (バイト単位) を受け取る変数へのポインター。 このルーチンは、この変数の初期値を次のホスト・ページ・サイズ境界に切り上げ、丸められた値をこの変数に書き戻します。
MEM_DECOMMIT フラグが FreeType パラメーターに設定されている場合、ZwFreeVirtualMemory は、BaseAddress パラメーターから (BaseAddress + RegionSize) までの範囲内の 1 つ以上のバイトを含むすべてのメモリ ページをデコミットします。 つまり、たとえば、メモリの 2 バイト領域がページ境界にまたがっている場合、両方のページがデコミットされます。
ZwFreeVirtualMemoryZwAllocateVirtualMemoryによって予約されたリージョン全体をデコミットします。 次の 3 つの条件が満たされると、リージョン全体が予約状態になります。
- MEM_DECOMMIT フラグが設定されています。
- BaseAddress は、リージョンが予約されたときに ZwAllocateVirtualMemory によって返されるベース アドレスです。
- RegionSize< は 0 です。
[in] FreeType
指定したページ領域に対して ZwFreeVirtualMemory
MEM_DECOMMIT
ZwFreeVirtualMemory
は、指定したページ領域をデコミットします。 ページは予約済みの状態になります。 ZwFreeVirtualMemory
、コミットされていないページをコミットしようとすると失敗しません。 つまり、現在のコミットメント状態を最初に決定することなく、ページの範囲をデコミットできます。
MEM_RELEASE
ZwFreeVirtualMemory
は、指定したページ領域を解放します。 ページは空き状態になります。 このフラグを指定する場合、RegionSize
ポイントする変数は 0 である必要があり、BaseAddress は、リージョンが予約されたときに によって返されるベース アドレスを指す必要があります。 これらの条件のいずれかが満たされていない場合、ZwFreeVirtualMemoryZwAllocateVirtualMemory は失敗します。 リージョン内のページが現在コミットされている場合は、ZwFreeVirtualMemory 最初にコミットを解除してから解放。
ZwFreeVirtualMemory は、別の状態(予約済みおよびコミット済み) のページを解放しようとしても失敗しません。 つまり、現在のコミットメント状態を最初に判断しなくても、ページの範囲を解放できます。
戻り値
ZwFreeVirtualMemory は、STATUS_SUCCESSまたはエラー状態コードを返します。 考えられるエラー状態コードは次のとおりです。
リターン コード | 形容 |
---|---|
STATUS_ACCESS_DENIED | プロセスはオブジェクトへのアクセスを要求しましたが、それらのアクセス権は付与されていません。 |
STATUS_INVALID_HANDLE | 無効な ProcessHandle 値が指定されました。 |
STATUS_OBJECT_TYPE_MISMATCH | 要求された操作で必要なオブジェクトの型と、要求で指定されたオブジェクトの型が一致しません。 |
備考
プロセスの仮想アドレス空間内の各ページは、次に示す 3 つの状態のいずれかになります。
状態は無料です
ページはコミットも予約もされません。 このページにはプロセスにアクセスできません。 空きページの読み取りまたは書き込みを試みると、アクセス違反の例外が発生します。
ZwFreeVirtualMemory
使用して、予約済みまたはコミット済みページを空き状態にすることができます。 状態は予約済み
ページは予約されています。 アドレスの範囲は、他の割り当て関数では使用できません。 このページにはプロセスからアクセスできないので、物理ストレージは関連付けされていません。 予約ページの読み取りまたは書き込みを試みると、アクセス違反の例外が発生します。
ZwFreeVirtualMemory
を使用して、コミットされたメモリ ページを予約済み状態にし、予約済みメモリ ページを空き状態にすることができます。 状態がコミット済み
ページがコミットされます。 メモリ内またはディスク上のページング ファイル内の物理ストレージはページに割り当てられ、アクセスは保護コードによって制御されます。
システムは、コミットされた各ページを初期化して物理メモリに読み込みますが、そのページの読み取りまたは書き込みが最初に試行されたときにのみ行われます。
プロセスが終了すると、コミットされたページのすべてのストレージが解放されます。
ZwAllocateVirtualMemory を使用して、コミットされたメモリ ページを予約済みまたは空き状態にすることができます。
ZwFreeVirtualMemory は、次の操作を実行できます。
- コミットされたページまたはコミットされていないページの領域をデコミットします。 この操作の後、ページは予約状態になります。
- 予約ページのリージョンを解放します。 この操作の後、ページは空き状態になります。
- コミットされたページまたはコミットされていないページのリージョンをデコミットして解放します。 この操作の後、ページは空き状態になります。
ZwFreeVirtualMemory は、コミットされたページとコミットされていないページなど、さまざまな状態のページをデコミットできます。 つまり、各ページの現在のコミットメント状態を最初に判断することなく、ページの範囲をデコミットできます。 ページをデコミットすると、メモリ内またはディスク上のページング ファイル内の物理ストレージが解放されます。
ページがコミットされていないが解放されていない場合、その状態は予約済みに変わります。 その後、
ZwFreeVirtualMemory は、予約済みおよびコミット済みのページなど、さまざまな状態のページの範囲を解放できます。 つまり、各ページの現在のコミットメント状態を最初に決定することなく、ページの範囲を解放できます。 ZwAllocateVirtualMemory によって最初に予約されたページの範囲全体を同時に解放する必要があります。
ページが解放されると、その状態は空きページに変わり、後続の割り当て操作で使用できます。 メモリが解放またはデコミットされた後は、メモリを再度参照することはできません。 そのメモリに含まれる可能性のある情報は、永遠に失われます。 空きページの読み取りまたは書き込みを試みると、アクセス違反の例外が発生します。 情報が必要な場合は、その情報を含むメモリをデコミットまたは解放しないでください。
カーネル モード ドライバーのメモリ管理のサポートの詳細については、「Windows ドライバーのメモリ管理」を参照してください。
手記
ZwFreeVirtualMemory 関数の呼び出しがユーザー モードで発生する場合は、"ZwFreeVirtualMemory" の代わりに"NtFreeVirtualMemory" という名前を使用する必要があります。
カーネル モード ドライバーからの呼び出しの場合、Windows ネイティブ システム サービス ルーチンの NtXxx および ZwXxx バージョンは、入力パラメーターを処理および解釈する方法で動作が異なる場合があります。 ルーチンの NtXxx と ZwXxx バージョンの間の関係の詳細については、「ネイティブ システム サービス ルーチンの Nt および Zw バージョンの使用 を参照してください。
必要条件
要件 | 価値 |
---|---|
サポートされる最小クライアント | Windows 2000 |
ターゲット プラットフォーム の |
万国 |
ヘッダー | ntifs.h (Ntifs.h、Fltkernel.h を含む) |
ライブラリ | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | PASSIVE_LEVEL |
DDI コンプライアンス規則 を |
HwStorPortProhibitedDDIs(storport), PowerIrpDDis(wdm) |