Share via


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_RELEASE フラグが FreeType パラメーターに設定されている場合、 RegionSize が指す変数は 0 である必要があります。 ZwFreeVirtualMemory は、 ZwAllocateVirtualMemory への初期割り当て呼び出しで予約されていたリージョン全体を解放します。

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

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

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

[in] FreeType

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

  • MEM_DECOMMIT

    • ZwFreeVirtualMemory は、指定されたページ領域のコミットを解除します。 ページは予約状態になります。

    • コミットされていないページをコミットしようとすると、ZwFreeVirtualMemory は失敗しません。 つまり、現在のコミットメント状態を最初に決定することなく、ページの範囲をコミット解除できます。

  • MEM_RELEASE

    ZwFreeVirtualMemory は、指定されたページ領域を解放します。 ページは空き状態になります。

    このフラグを指定する場合、 RegionSize が指す変数は 0 である必要があり、 BaseAddress は、領域が予約されたときに ZwAllocateVirtualMemory によって返されるベース アドレスを指す必要があります。 これらの条件のいずれかが満たされていない場合、ZwFreeVirtualMemory は失敗します。

    リージョン内のページが現在コミットされている場合、 ZwFreeVirtualMemory は最初にデコミットしてから解放します。

ZwFreeVirtualMemory は、別の状態(予約済みページとコミット済みページ) にあるページを解放しようとしても失敗しません。 つまり、現在のコミットメント状態を最初に決定することなく、ページの範囲を解放できます。

戻り値

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

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

注釈

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

  • 状態は無料です

    ページはコミットも予約もされません。 ページにはプロセスにアクセスできません。 空きページから読み取ったり、空きページに書き込んだりしようとすると、アクセス違反の例外が発生します。

    ZwFreeVirtualMemory を使用して、予約済みページまたはコミット済みページを空き状態にすることができます。

  • 状態は予約済み

    ページは予約されています。 アドレスの範囲は、他の割り当て関数では使用できません。 このページにはプロセスからアクセスできません。また、それに関連付けられている物理ストレージもありません。 予約ページの読み取りまたは書き込みを試みると、アクセス違反の例外が発生します。

    ZwFreeVirtualMemory を使用すると、コミットされたメモリ ページを予約状態にし、予約済みメモリ ページを空き状態にすることができます。

  • State is COMMITTED

    ページがコミットされます。 メモリまたはディスク上のページング ファイル内の物理ストレージはページに割り当てられ、アクセスは保護コードによって制御されます。

    システムは、コミットされた各ページを初期化して物理メモリに読み込みます。これは、そのページに対する最初の読み取りまたは書き込みの試行時のみです。

    プロセスが終了すると、コミットされたページのすべてのストレージが解放されます。

    ZwAllocateVirtualMemory を使用して、コミットされたメモリ ページを予約済み状態または空き状態にできます。

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

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

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

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

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

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

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

注意

ZwFreeVirtualMemory 関数の呼び出しがユーザー モードで発生した場合は、"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 コンプライアンス規則 HwStorPortProhibitedDDIs(storport), PowerIrpDDis(wdm)

こちらもご覧ください

ZwAllocateVirtualMemory