次の方法で共有


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 の割り当てに成功した場合は、MmAdvanceMdl ではなく、その MDL と IoBuildPartialMdl を使用して I/O 要求実行する必要があります)。
  • 上位レベルのドライバーは、メモリ不足の条件下でも、引き続き進行する必要があります。
これらの条件を満たさないドライバーは、代わりに IoBuildPartialMdl ルーチンを使用して、部分的に成功した I/O 操作を完了する必要があります。

必要条件

要件 価値
サポートされる最小クライアント Windows XP 以降のバージョンの Windows で使用できます。
ターゲット プラットフォーム 万国
ヘッダー wdm.h (Wdm.h、Ntddk.h、Ntifs.h を含む)
ライブラリ NtosKrnl.lib
DLL NtosKrnl.exe
IRQL <=DISPATCH_LEVEL

関連項目

IoBuildPartialMdl