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 协议的网络传输驱动程序。对于大于一个以太网帧的消息,每个协议都支持可靠的消息传递。传输驱动程序只有在从多个以太网帧重新组装消息后,才能完成此类消息的读取请求。
  • 高级驱动程序已尝试并未能分配新的 MDL,以从不完整的 I/O 请求传输数据片段。 (如果驱动程序成功分配新的 MDL,则必须使用该 MDL 并 IoBuildPartialMdl 来执行 I/O 请求,而不是 MmAdvanceMdl。)
  • 即使在内存不足的情况下,更高级别的驱动程序也必须继续取得进展。
不满足这些条件的驱动程序必须改用 IoBuildPartialMdl 例程来完成任何部分成功的 I/O作。

要求

要求 价值
最低支持的客户端 在 Windows XP 和更高版本的 Windows 中可用。
目标平台 普遍
标头 wdm.h (包括 Wdm.h、Ntddk.h、Ntifs.h)
NtosKrnl.lib
DLL NtosKrnl.exe
IRQL <=DISPATCH_LEVEL

另请参阅

IoBuildPartialMdl