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)
Library NtosKrnl.lib
DLL NtosKrnl.exe
IRQL <=DISPATCH_LEVEL

另请参阅

IoBuildPartialMdl