MmAdvanceMdl 関数 (wdm.h)

MmAdvanceMdl ルーチンは、指定したバイト数だけ MDL の仮想メモリ範囲の先頭を進めます。

構文

NTSTATUS MmAdvanceMdl(
  [in, out] PMDL  Mdl,
  [in]      ULONG NumberOfBytes
);

パラメーター

[in, out] Mdl

進める MDL を指定します。

[in] NumberOfBytes

MDL の先頭を進めるバイト数を指定します。

戻り値

MmAdvanceMdl は NTSTATUS コードを返します。 可能な戻り値は次のとおりです。

リターン コード 説明
STATUS_SUCCESS
ルーチンは、MDL の先頭を正常に拡張しました。
STATUS_INVALID_PARAMETER_2
呼び出し元は、MDL の先頭を最後まで進めようとしました。

注釈

MmAdvanceMdl は、仮想メモリ アドレス範囲の先頭のみを進めます。 終了アドレスは変わらず、範囲の長さはそれに応じて縮小されます。

下位レベルのドライバーが読み取り/書き込み要求を部分的にしか完了できない場合、上位レベルのドライバーはメモリ不足の条件下で MmAdvanceMdl を使用できます。 上位レベルのドライバーは 、MmAdvanceMdl を使用して、既に読み取りまたは書き込まれたバッファーの一部を進め、IRP を再発行して要求を完了できます。 (ドライバーは、もちろん、このプロセスを必要な回数だけ繰り返すことができます)。

MmAdvanceMdl が最初のページを超えて進んだ場合、MmAdvanceMdl が渡されたページはすぐにロック解除され、MDL とユーザー アドレスをマップするシステム仮想アドレスも調整されます。

MmAdvanceMdl を使用すると、システムのパフォーマンスが低下する可能性があります。 これは、次のすべての条件が保持されている場合にのみ使用する必要があります。

  • 上位レベルのドライバーは、それ自体の I/O 処理で、一定の量のデータを転送した後にのみ特定の I/O 要求を完了できますが、下位レベルのドライバーは、より少量のデータのみを転送します。 (たとえば、SPX または NBT プロトコルのネットワーク トランスポート ドライバーです。各プロトコルは、1 つのイーサネット フレームより大きいメッセージに対して、信頼性の高いメッセージ パッシングをサポートします。トランスポート ドライバーは、複数のイーサネット フレームからメッセージを再構成した後にのみ、このようなメッセージの読み取り要求を完了できます。
  • 上位レベルのドライバーは、不完全な I/O 要求からデータ フラグメントを転送するために、新しい MDL の割り当てを既に試行し、失敗しました。 (ドライバーが新しい MDL の割り当てに成功した場合は、その MDL と IoBuildPartialMdl を使用して 、MmAdvanceMdl ではなく I/O 要求を実行する必要があります)。
  • メモリ不足の状況でも、上位レベルのドライバーは引き続き進行する必要があります。
これらの条件を満たさないドライバーは、代わりに IoBuildPartialMdl ルーチンを使用して、部分的に成功した I/O 操作を完了する必要があります。

要件

要件
サポートされている最小のクライアント Windows XP 以降のバージョンの Windows で使用できます。
対象プラットフォーム ユニバーサル
Header wdm.h (Wdm.h、Ntddk.h、Ntifs.h を含む)
Library NtosKrnl.lib
[DLL] NtosKrnl.exe
IRQL <=DISPATCH_LEVEL

こちらもご覧ください

IoBuildPartialMdl