次の方法で共有


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

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

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

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 は、リージョンが予約されたときに ZwAllocateVirtualMemory によって返されるベース アドレスを指す必要があります。 これらの条件のいずれかが満たされていない場合、ZwFreeVirtualMemory は失敗します。

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

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

戻り値

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

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

備考

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

  • 状態は無料です

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

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

  • 状態は予約済み

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

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

  • 状態がコミット済み

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

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

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

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

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

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

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

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

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

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

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

手記

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

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

必要条件

要件 価値
サポートされる最小クライアント Windows 2000
ターゲット プラットフォーム の 万国
ヘッダー ntifs.h (Ntifs.h、Fltkernel.h を含む)
ライブラリ NtosKrnl.lib
DLL NtosKrnl.exe
IRQL PASSIVE_LEVEL
DDI コンプライアンス規則 を する HwStorPortProhibitedDDIs(storport), PowerIrpDDis(wdm)

関連項目

ZwAllocateVirtualMemory