MmAdvanceMdl 函数 (wdm.h)
mmAdvanceMdl 例程按指定的字节数推进 MDL 虚拟内存范围的开头。
语法
NTSTATUS MmAdvanceMdl(
[in, out] PMDL Mdl,
[in] ULONG NumberOfBytes
);
参数
[in, out] Mdl
指定要前进的 MDL。
[in] NumberOfBytes
指定要推进 MDL 开头的字节数。
返回值
mmAdvanceMdl 返回 NTSTATUS 代码。 可能的返回值包括:
返回代码 | 描述 |
---|---|
|
例程已成功推进 MDL 的开头。 |
|
调用方尝试将 MDL 的开头提前到末尾。 |
言论
mmAdvanceMdl 仅推进虚拟内存地址范围的开头。 结束地址保持不变,范围长度相应地缩小。
当较低级别的驱动程序只能部分完成读/写请求时,在低内存条件下,高级驱动程序可以使用 MmAdvanceMdl。 高级驱动程序可以使用 MmAdvanceMdl,提前超过已读取或写入的缓冲区部分,然后重新发出 IRP 以完成请求。 (当然,驱动程序可以根据需要多次重复此过程。
如果 MmAdvanceMdl 超过初始页面,则传递 MmAdvanceMdl 的任何页面都会立即解锁,并且还会调整映射 MDL 和用户地址的系统虚拟地址。
使用 mmAdvanceMdl 可能会降低系统性能。 仅当以下所有条件都保留时,才可使用它:
- 较高级别的驱动程序在其自己的 I/O 处理中,只能在传输固定的数据量后完成某些 I/O 请求,但较低级别的驱动程序仅传输较小量的数据。 (例如 SPX 或 NBT 协议的网络传输驱动程序。对于大于一个以太网帧的消息,每个协议都支持可靠的消息传递。传输驱动程序只有在从多个以太网帧重新组装消息后,才能完成此类消息的读取请求。
- 高级驱动程序已尝试并未能分配新的 MDL,以从不完整的 I/O 请求传输数据片段。 (如果驱动程序成功分配新的 MDL,则必须使用该 MDL 并 IoBuildPartialMdl 来执行 I/O 请求,而不是 MmAdvanceMdl。)
- 即使在内存不足的情况下,更高级别的驱动程序也必须继续取得进展。
要求
要求 | 价值 |
---|---|
最低支持的客户端 | 在 Windows XP 和更高版本的 Windows 中可用。 |
目标平台 | 普遍 |
标头 | wdm.h (包括 Wdm.h、Ntddk.h、Ntifs.h) |
库 | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | <=DISPATCH_LEVEL |