ZwSetInformationVirtualMemory 関数 (ntifs.h)
ZwSetInformationVirtualMemory ルーチンは、プロセスのユーザー アドレス空間内のアドレス範囲の指定されたリストに対して操作を実行します。
構文
NTSYSAPI NTSTATUS ZwSetInformationVirtualMemory(
[in] HANDLE ProcessHandle,
[in] VIRTUAL_MEMORY_INFORMATION_CLASS VmInformationClass,
[in] ULONG_PTR NumberOfEntries,
[in] PMEMORY_RANGE_ENTRY VirtualAddresses,
[in] PVOID VmInformation,
[in] ULONG VmInformationLength
);
パラメーター
[in] ProcessHandle
操作を実行するコンテキストでプロセスの開いているハンドルを指定します。 このハンドルを無効にすることはできません。 Ntddk.h で定義されている NtCurrentProcess マクロを使用して、現在のプロセスを指定します。
[in] VmInformationClass
実行する操作の種類を指定します。 VIRTUAL_MEMORY_INFORMATION_CLASS列挙で定義されている VmPrefetchInformation に設定します。ntddk.h を参照してください。
[in] NumberOfEntries
VirtualAddresses パラメーターが指す配列内のエントリの数。 このパラメーターを 0 にすることはできません。
[in] VirtualAddresses
各エントリが処理する仮想アドレス範囲を指定するMEMORY_RANGE_ENTRY構造体の配列へのポインター。 仮想アドレス範囲は、ターゲット プロセスがアクセスできるプロセス アドレス空間の任意の部分をカバーできます。
[in] VmInformation
メモリ情報を含むバッファーへのポインター。 バッファーの形式と内容は、指定された情報クラスによって異なります。
VmInformationClass が VmPrefetchInformation の場合、このパラメーターを NULL にすることはできません。また、0 に設定されている ULONG 変数を指す必要があります。
[in] VmInformationLength
VmInformation が指すバッファーのサイズ。
VmInformationClass が VmPrefetchInformation の場合、これは であるsizeof (ULONG)
必要があります。
戻り値
ZwSetInformationVirtualMemory は、成功した場合はSTATUS_SUCCESS、失敗した場合は適切な NTSTATUS エラー コードを返します。
注釈
ZwSetInformationVirtualMemory ルーチンは、アクセスするアドレスのセットを認識するドライバーによって呼び出されます。 これらのアドレスがメモリ内に存在しなくなった可能性が高い場合 (つまり、ディスクにページングされている)、アクセス前にこれらのアドレス範囲でこのルーチンを呼び出すと、可能な限り大きな同時 I/O 要求を使用してそれらのアドレス範囲をディスクから効率的に取り込むため、全体的な待機時間が短縮されます。
ZwSetInformationVirtualMemory を使用すると、ドライバーがアクセスされるプロセス アドレス範囲の一覧を提供する場合に可能な限り、大規模な同時実行 I/O を発行することで、ディスク ハードウェアを効率的に使用できます。 1 つのアドレス範囲 (ファイル マッピングなど) の場合でも、このルーチンは、ページ フォールトを介して発行される小さな I/O の数ではなく、1 つの大きな I/O を発行することでパフォーマンスを向上させることができます。
ドライバーは、パフォーマンスの最適化のために純粋にこのルーチンを呼び出します。ターゲット アドレス範囲にアクセスするためにプリフェッチは必要ありません。 プリフェッチされたメモリは、ターゲット プロセスのワーキング セットに追加されません。物理メモリにキャッシュされます。 プリフェッチされたアドレス範囲がターゲット・プロセスによってアクセスされると、それらのアドレス範囲はワーキング・セットに追加されます。
この呼び出しはドライバーの正しい操作には必要ないため、システムによって強力なヒントとして扱われ、通常の物理メモリの制約の対象となります。この制約は、メモリ不足の条件下で完全または部分的に失敗する可能性があります。 また、大きなアドレス範囲で呼び出された場合にメモリ負荷を引き出す可能性があるため、アプリケーションは実際に使用するアドレス範囲のみをプリフェッチする必要があります。
要件
要件 | 値 |
---|---|
サポートされている最小のクライアント | Windows 10バージョン 1511。 |
対象プラットフォーム | ユニバーサル |
Header | ntifs.h (Ntddk.h を含む) |
Library | NtosKrnl.lib |
[DLL] | NtosKrnl.exe |
IRQL | PASSIVE_LEVEL |
DDI コンプライアンス規則 | HwStorPortProhibitedDIs、PowerIrpDDis |