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
[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 のページが取り込まれるように、指定した領域の状態をリセットします。 ページがメモリ内にあり、変更されている場合は、ページング ファイルに書き込まれないように、変更されていないとマークされます。 内容はゼロ |
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を
する前の呼び出しによって予約されたページの領域をコミットします。 無料ページのリージョンを予約します。
空きページのリージョンを予約してコミットします。
カーネル モード ドライバーは、
プロセスの仮想アドレス空間内の各ページは、次の表で説明する 3 つの状態のいずれかになります。
状態 | 意味 |
---|---|
無料 | ページはコミットも予約もされておらず、プロセスからアクセスできません。 ZwAllocateVirtualMemory は、無料ページを予約または同時に予約およびコミットできます。 |
引っ込み思案 | アドレスの範囲は他の割り当て関数では使用できませんが、ページにはプロセスからアクセスできず、物理ストレージは関連付けられません。
ZwAllocateVirtualMemory は予約済みページをコミットできますが、2 回目は予約できません。 ZwFreeVirtualMemory |
コミット | 物理ストレージはページに割り当てられ、アクセスは保護コードによって制御されます。 システムは、コミットされた各ページを初期化し、そのページへの読み取りまたは書き込みを最初に試行したときにのみ物理メモリに読み込みます。 プロセスが終了すると、システムはコミット済みページのストレージを解放します。
ZwAllocateVirtualMemory は、既にコミットされたページをコミットできます。 つまり、既にコミットされているかどうかに関係なく、ページの範囲をコミットでき、関数は失敗しません。 ZwFreeVirtualMemory |
ZwAllocateVirtualMemory
メモリ管理の詳細については、「Windows ドライバーのメモリ管理」を参照してください。
手記
カーネル モード ドライバーからの呼び出しの場合、Windows ネイティブ システム サービス ルーチンの NtXxx および ZwXxx バージョンは、入力パラメーターを処理および解釈する方法で動作が異なる場合があります。 ルーチンの NtXxx と ZwXxx バージョンの間の関係の詳細については、「ネイティブ システム サービス ルーチンの 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) |