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

メモリ情報を含むバッファーへのポインター。 バッファーの形式と内容は、指定された情報クラスによって異なります。

VmInformationClassVmPrefetchInformation の場合、このパラメーターを NULL にすることはできません。また、0 に設定されている ULONG 変数を指す必要があります。

[in] VmInformationLength

VmInformation が指すバッファーのサイズ。

VmInformationClassVmPrefetchInformation の場合、これは である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