次の方法で共有


ZwAllocateVirtualMemory 関数 (ntifs.h)

ZwAllocateVirtualMemory ルーチンは、指定されたプロセスのユーザー モード仮想アドレス空間内のページの領域を予約、コミット、またはその両方します。

構文

NTSYSAPI NTSTATUS ZwAllocateVirtualMemory(
  [in]      HANDLE    ProcessHandle,
  [in, out] PVOID     *BaseAddress,
  [in]      ULONG_PTR ZeroBits,
  [in, out] PSIZE_T   RegionSize,
  [in]      ULONG     AllocationType,
  [in]      ULONG     Protect
);

パラメーター

[in] ProcessHandle

マッピングを実行する必要があるプロセスのハンドル。 Ntddk.h で定義されている NtCurrentProcess マクロを使用して、現在のプロセスを指定します。

[in, out] BaseAddress

割り当てられたページ領域のベース アドレスを受け取る変数へのポインター。 このパラメーターの初期値が NULLでない場合、リージョンは、指定された仮想アドレスから次のホスト ページ サイズ のアドレス境界に切り捨てられた位置から割り当てられます。 このパラメーターの初期値が NULL場合、オペレーティング システムはリージョンを割り当てる場所を決定します。

[in] ZeroBits

セクション ビューのベース アドレスに 0 を指定する必要がある上位アドレス ビットの数。 この値は 21 未満にする必要があり、BaseAddress が NULL場合と同様に、オペレーティング システムがリージョンを割り当てる場所を決定する場合にのみ使用されます。

[in, out] RegionSize

割り当てられたページ領域の実際のサイズ (バイト単位) を受け取る変数へのポインター。 このパラメーターの初期値は、領域のサイズをバイト単位で指定し、次のホスト ページ サイズ境界に切り上げられます。 * RegionSize は、入力時にゼロにすることはできません。

[in] AllocationType

実行する割り当ての種類を指定するフラグを含むビットマスク。 次の表では、これらのフラグについて説明します。

意味
MEM_COMMIT 指定したページ領域がコミットされます。 MEM_COMMIT、MEM_RESET、またはMEM_RESERVEのいずれかを設定する必要があります。
MEM_PHYSICAL 物理メモリを割り当てます。 このフラグは、アドレス ウィンドウ拡張 (AWE) メモリでのみ使用されます。 MEM_PHYSICALが設定されている場合は、MEM_RESERVEも設定する必要があり、他のフラグを設定することはできません。また、Protect を PAGE_READWRITE に設定する必要があります。
MEM_RESERVE 指定したページ領域が予約されます。 MEM_COMMIT、MEM_RESET、またはMEM_RESERVEのいずれかを設定する必要があります。
MEM_RESET ページがページング ファイル内にある場合は破棄され、0 のページが取り込まれるように、指定した領域の状態をリセットします。 ページがメモリ内にあり、変更されている場合は、ページング ファイルに書き込まれないように、変更されていないとマークされます。 内容はゼロ されません。 Protect パラメーターは使用されませんが、有効な値に設定する必要があります。 MEM_COMMIT、MEM_RESET、またはMEM_RESERVEのいずれかを設定する必要があります。MEM_RESETが設定されている場合は、他のフラグを設定できません。
MEM_TOP_DOWN 指定したリージョンは、ZeroBitsに基づいて、可能な限り高い仮想アドレス 作成する必要があります。

[in] Protect

コミットされたページ領域に必要な保護を指定するページ保護フラグを含むビットマスク。 次の表では、これらのフラグについて説明します。

意味
PAGE_NOACCESS コミットされたページのリージョンへのアクセスは許可されません。 コミットされたリージョンを読み取り、書き込み、または実行しようとすると、一般的な保護 (GP) エラーと呼ばれるアクセス違反の例外が発生します。
PAGE_READONLY ページのコミット済みリージョンへの読み取り専用および実行アクセスが許可されます。 コミットされたリージョンを書き込もうとすると、アクセス違反が発生します。
PAGE_READWRITE コミットされたページ領域への読み取り、書き込み、実行アクセスが許可されます。 基になるセクションへの書き込みアクセスが許可されている場合、ページの 1 つのコピーが共有されます。 それ以外の場合、ページは書き込み時に共有読み取り専用/コピーになります。
PAGE_EXECUTE コミットされたページ領域へのアクセスを実行できます。 コミットされたリージョンに対して読み取りまたは書き込みを試みると、アクセス違反が発生します。
PAGE_EXECUTE_READ コミットされたページ領域への実行および読み取りアクセスが許可されます。 コミットされたリージョンに書き込もうとすると、アクセス違反が発生します。
PAGE_EXECUTE_READWRITE コミットされたページ領域への実行、読み取り、書き込みアクセスが許可されます。
PAGE_GUARD リージョン内のページが保護ページになります。 ガード ページからの読み取りまたはガード ページへの書き込みを試みると、システムはSTATUS_GUARD_PAGE例外を発生させます。 したがって、ガード ページはワンショット アクセス アラームとして機能します。 このフラグはページ保護修飾子であり、PAGE_NOACCESS以外のページ保護フラグのいずれかで使用する場合にのみ有効です。 アクセス試行によってシステムがガード ページの状態をオフにすると、基になるページ保護が引き継ぎます。 システム サービス中にガード ページの例外が発生した場合、通常、サービスはエラー状態インジケーターを返します。
PAGE_NOCACHE ページの領域は、キャッシュ不可として割り当てる必要があります。 セクションのPAGE_NOCACHEは許可されません。
PAGE_WRITECOMBINE 書き込みの組み合わせ、つまり、ハードウェアがサポートするメイン メモリへの書き込みを結合できるようにします。 このフラグは、デバイスに書き込まれる前に、可能な限り同じキャッシュ ラインへの書き込みが結合されるように、主にフレーム バッファー メモリに使用されます。 これにより、バス全体の (たとえば) ビデオ メモリへの書き込みを大幅に削減できます。 ハードウェアが書き込み結合をサポートしていない場合、フラグは無視されます。 このフラグはページ保護修飾子であり、PAGE_NOACCESS以外のページ保護フラグのいずれかで使用する場合にのみ有効です。

戻り値

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

備考

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

  • ZwAllocateVirtualMemoryを する前の呼び出しによって予約されたページの領域をコミットします。

  • 無料ページのリージョンを予約します。

  • 空きページのリージョンを予約してコミットします。

カーネル モード ドライバーは、ZwAllocateVirtualMemory を使用して、指定されたプロセスでアプリケーションからアクセス可能な仮想アドレスの範囲を予約し、ZwAllocateVirtualMemory を して予約範囲から個々のページをコミットする追加の呼び出しを行うことができます。 これにより、プロセスは、必要になるまで物理ストレージを消費することなく、その仮想アドレス空間の範囲を予約できます。

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

状態 意味
無料 ページはコミットも予約もされておらず、プロセスからアクセスできません。 ZwAllocateVirtualMemory は、無料ページを予約または同時に予約およびコミットできます。
引っ込み思案 アドレスの範囲は他の割り当て関数では使用できませんが、ページにはプロセスからアクセスできず、物理ストレージは関連付けられません。 ZwAllocateVirtualMemory は予約済みページをコミットできますが、2 回目は予約できません。 ZwFreeVirtualMemory 予約ページを解放して、無料のページにすることができます。
コミット 物理ストレージはページに割り当てられ、アクセスは保護コードによって制御されます。 システムは、コミットされた各ページを初期化し、そのページへの読み取りまたは書き込みを最初に試行したときにのみ物理メモリに読み込みます。 プロセスが終了すると、システムはコミット済みページのストレージを解放します。 ZwAllocateVirtualMemory は、既にコミットされたページをコミットできます。 つまり、既にコミットされているかどうかに関係なく、ページの範囲をコミットでき、関数は失敗しません。 ZwFreeVirtualMemory 、コミットされたページのコミットを解除したり、ページのストレージを解放したり、コミットされたページを同時にデコミットして解放したりできます。

ZwAllocateVirtualMemory 呼び出して割り当てられたメモリは、ZwFreeVirtualMemory呼び出すことによって解放する必要があります。

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

手記

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

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

必要条件

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

関連項目

ネイティブ システム サービス ルーチンの Nt バージョンと Zw バージョンを使用した

ZwFreeVirtualMemory