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 未満である必要があり、 BaseAddressNULL の場合と同様に、オペレーティング システムによってリージョンの割り当て先が決定された場合にのみ使用されます。

[in, out] RegionSize

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

[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 つの状態のいずれかになります。

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

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

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

注意

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

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

要件

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

こちらもご覧ください

Nt および Zw バージョンのネイティブ システム サービス ルーチンの使用

ZwFreeVirtualMemory