NtAllocateVirtualMemory 関数 (ntifs.h)

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

構文

__kernel_entry NTSYSCALLAPI NTSTATUS NtAllocateVirtualMemory(
  [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

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

[in] ZeroBits

セクション ビューのベース アドレスに 0 を指定する必要がある上位アドレス ビットの数。 BaseAddress* が NULL の場合と同様に、オペレーティング システムによってリージョンの割り当て先が決定された場合にのみ使用されます。 ZeroBits が 32 より大きい場合、ビットマスクになることに注意してください。

[in, out] RegionSize

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

[in] AllocationType

指定したページ領域に対して実行する割り当ての種類を指定するフラグを含むビットマスク。 次の表では、最も一般的なフラグについて説明します。 使用可能なフラグと説明の完全な一覧については、「 VirtualAlloc 」を参照してください。

注意

MEM_COMMIT、MEM_RESET、またはMEM_RESERVEのいずれかを設定する必要があります。

フラグ 説明
MEM_COMMIT 指定したページ領域がコミットされます。
MEM_RESERVE 指定したページ領域を予約します。
MEM_RESET ページがページング ファイル内にある場合は破棄され、ゼロのページが取り込まれるように、指定したリージョンの状態をリセットします。 ページがメモリ内にあり、変更されている場合は、ページング ファイルに書き込まれないように、変更されていないとマークされます。 内容はゼロ ではありませんProtect パラメーターは使用されませんが、有効な値に設定する必要があります。 MEM_RESETが設定されている場合は、他のフラグを設定できません。
その他のMEM_XXX フラグ 「VirtualAlloc」を参照してください。

[in] Protect

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

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

戻り値

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

  • STATUS_ACCESS_DENIED
  • STATUS_ALREADY_COMMITTED
  • STATUS_COMMITMENT_LIMIT
  • STATUS_CONFLICTING_ADDRESSES
  • STATUS_INSUFFICIENT_RESOURCES
  • STATUS_INVALID_HANDLE
  • STATUS_INVALID_PAGE_PROTECTION
  • STATUS_NO_MEMORY
  • STATUS_OBJECT_TYPE_MISMATCH
  • STATUS_PROCESS_IS_TERMINATING

注釈

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

  • NtAllocateVirtualMemory の以前の呼び出しによって予約されたページの領域をコミットします。
  • 無料ページのリージョンを予約します。
  • 無料ページの領域を予約してコミットします。

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

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

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

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

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

メモNtAllocateVirtualMemory 関数の呼び出しがユーザー モードで発生する場合は、"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、PowerIrpDDis、SpNoWait、StorPortStartIo

こちらもご覧ください

NtFreeVirtualMemory