NtFreeVirtualMemory 関数 (ntifs.h)

NtFreeVirtualMemory ルーチンのリリース、デコミット、またはリリースとデコミットの両方 (指定されたプロセスの仮想アドレス空間内のページ領域)。

構文

__kernel_entry NTSYSCALLAPI NTSTATUS NtFreeVirtualMemory(
  [in]      HANDLE  ProcessHandle,
  [in, out] PVOID   *BaseAddress,
  [in, out] PSIZE_T RegionSize,
  [in]      ULONG   FreeType
);

パラメーター

[in] ProcessHandle

解放されるページが存在するコンテキスト内のプロセスのハンドル。 Ntddk.h で定義されている NtCurrentProcess マクロを使用して、現在のプロセスを指定します。

[in, out] BaseAddress

解放されたページ領域のベース仮想アドレスを受け取る変数へのポインター。

freeType パラメーターに MEM_RELEASE フラグが設定されている場合、*BaseAddress は、領域が予約されたときに NtAllocateVirtualMemory によって返されるベース アドレスである必要があります。

[in, out] RegionSize

解放されたページ領域の実際のサイズ (バイト単位) を受け取る変数へのポインター。 ルーチンは、この変数の初期値を次のホスト ページ サイズ境界に切り上げ、丸められた値をこの変数に書き戻します。

MEM_RELEASE フラグが *FreeType に設定されている場合、 *RegionSize は 0 である必要があります。 NtFreeVirtualMemory は、 NtAllocateVirtualMemory への初期割り当て呼び出しで予約されていたリージョン全体を解放します。

MEM_DECOMMIT フラグが *FreeType に設定されている場合、NtFreeVirtualMemory、*BaseAddress から (*BaseAddress + *RegionSize) までの範囲の 1 つ以上のバイトを含むすべてのメモリ ページをデコミットします。 つまり、たとえば、メモリの 2 バイト領域がページ境界にまたがっている場合、両方のページがコミット解除されます。

NtFreeVirtualMemory は、 NtAllocateVirtualMemory によって予約されたリージョン全体をデコミットします。 次の 3 つの条件が満たされた場合、リージョン全体が予約状態になります。

  • MEM_DECOMMIT フラグが設定されています。
  • *BaseAddress は、リージョンが予約されたときに NtAllocateVirtualMemory によって返されるベース アドレスです。
  • *RegionSize は 0 です。

[in] FreeType

NtFreeVirtualMemory が指定したページ領域に対して実行する空き操作の種類を記述するフラグを含むビットマスク。 使用可能な値を次の表に示します。

フラグ 説明
MEM_DECOMMIT NtFreeVirtualMemory は、指定したページ領域をデコミットします。 ページは予約状態になります。 コミットされていないページのコミットを解除しようとしても、NtFreeVirtualMemory は失敗しません。 つまり、現在のコミットメント状態を最初に決定することなく、ページの範囲をコミット解除できます。
MEM_RELEASE NtFreeVirtualMemory は、指定されたページ領域を解放します。 ページは空き状態になります。 このフラグを指定する場合、 RegionSize は 0 である必要があり、 BaseAddress は、リージョンが予約されたときに NtAllocateVirtualMemory によって返されるベース アドレスを指す必要があります。 これらの条件のいずれかが満たされない場合、NtFreeVirtualMemory は失敗します。 リージョン内のページが現在コミットされている場合、 NtFreeVirtualMemory は最初にデコミットしてから解放します。 NtFreeVirtualMemory は、別の状態 (予約済みページとコミット済みページ) にあるページを解放しようとしても失敗しません。 つまり、現在のコミットメント状態を最初に決定することなく、ページの範囲を解放できます。

戻り値

NtFreeVirtualMemory は、STATUS_SUCCESSまたはエラー状態コードを返します。 考えられるエラー状態コードは次のとおりです。

リターン コード 説明
STATUS_ACCESS_DENIED プロセスはオブジェクトへのアクセスを要求しましたが、それらのアクセス権は付与されていません。
STATUS_INVALID_HANDLE 無効な ProcessHandle 値が指定されました。
STATUS_OBJECT_TYPE_MISMATCH 要求された操作で必要なオブジェクトの型と、要求で指定されたオブジェクトの型が一致しません。

注釈

プロセスの仮想アドレス空間内の各ページは、次の表で説明する 3 つの状態のいずれかになります。

状態 意味
FREE ページはコミットも予約もされません。 ページにはプロセスにアクセスできません。 空きページから読み取ったり、空きページに書き込んだりしようとすると、アクセス違反の例外が発生します。 NtFreeVirtualMemory を使用して、予約済みページまたはコミット済みページを空き状態にすることができます。
RESERVED ページは予約されています。 アドレスの範囲は、他の割り当て関数では使用できません。 このページにはプロセスからアクセスできません。また、それに関連付けられている物理ストレージもありません。 予約ページの読み取りまたは書き込みを試みると、アクセス違反の例外が発生します。 NtFreeVirtualMemory を使用すると、コミットされたメモリ ページを予約状態にし、予約済みメモリ ページを空き状態にすることができます。
コミット ページがコミットされます。 メモリまたはディスク上のページング ファイル内の物理ストレージはページに割り当てられ、アクセスは保護コードによって制御されます。 システムは、コミットされた各ページを初期化して物理メモリに読み込みます。これは、そのページに対する最初の読み取りまたは書き込みの試行時のみです。 プロセスが終了すると、コミットされたページのすべてのストレージが解放されます。 NtAllocateVirtualMemory を使用して、コミットされたメモリ ページを予約済み状態または空き状態にすることができます。

NtFreeVirtualMemory では、次の操作を実行できます。

  • コミットされたページまたはコミットされていないページのリージョンをデコミットします。 この操作の後、ページは予約状態になります。
  • 予約ページのリージョンを解放します。 この操作の後、ページは空き状態になります。
  • コミットされたページまたはコミットされていないページのリージョンをデコミットして解放します。 この操作の後、ページは空き状態になります。

NtFreeVirtualMemory では、さまざまな状態にあるページの範囲をコミット解除できます。一部はコミット済みで、コミットされていないページもあります。 つまり、各ページの現在のコミットメント状態を最初に決定することなく、ページの範囲をコミット解除できます。 ページのコミットを解除すると、メモリまたはディスク上のページング ファイル内の物理ストレージが解放されます。

ページがコミット解除されていても解放されていない場合、その状態は予約済みに変わります。 その後、 NtAllocateVirtualMemory を呼び出してコミットするか、 NtFreeVirtualMemory を呼び出して解放できます。 予約ページの読み取りまたは書き込みを試みると、アクセス違反の例外が発生します。

NtFreeVirtualMemory は、予約済みページとコミット済みページなど、さまざまな状態にあるページの範囲を解放できます。 つまり、各ページの現在のコミットメント状態を最初に決定することなく、ページの範囲を解放できます。 最初に NtAllocateVirtualMemory によって予約されたページの範囲全体を同時に解放する必要があります。

ページが解放されると、その状態は free に変わり、後続の割り当て操作で使用できます。 メモリが解放またはコミット解除された後、メモリを再度参照することはできません。 そのメモリに含まれている可能性のある情報は、永遠に失われます。 空きページから読み取ったり、空きページに書き込んだりしようとすると、アクセス違反の例外が発生します。 情報が必要な場合は、その情報を含むメモリのコミットを解除したり、メモリを解放したりしないでください。

カーネル モード ドライバーのメモリ管理のサポートの詳細については、「 Windows ドライバーのメモリ管理」を参照してください。

注意

NtFreeVirtualMemory 関数の呼び出しがユーザー モードで発生する場合は、"ZwFreeVirtualMemory" ではなく"NtFreeVirtualMemory" という名前を使用する必要があります。

カーネル モード ドライバーからの呼び出しの場合、Windows ネイティブ システム サービス ルーチンの NtXxx および ZwXxx バージョンは、入力パラメーターを処理および解釈する方法で動作が異なります。 ルーチンの NtXxx バージョンと ZwXxx バージョン間の関係の詳細については、「Using Nt and Zw Versions of the Native System Services Routines」を参照してください。

要件

要件
サポートされている最小のクライアント Windows 2000
対象プラットフォーム ユニバーサル
Header ntifs.h (Ntifs.h、Fltkernel.h を含む)
Library NtosKrnl.lib
[DLL] NtosKrnl.exe
IRQL PASSIVE_LEVEL
DDI コンプライアンス規則 HwStorPortProhibitedDIs、PowerIrpDDis

こちらもご覧ください

NtAllocateVirtualMemory