NdisAllocateMdl 函数分配一个 MDL,用于描述指定虚拟地址处的内存缓冲区。
Syntax
NDIS_EXPORTED_ROUTINE MDL * NdisAllocateMdl(
[in] NDIS_HANDLE NdisHandle,
[in] PVOID VirtualAddress,
[in] ULONG Length
);
参数
[in] NdisHandle
调用方初始化期间获取的 NDIS 句柄。 有关详细信息,请参阅 “获取池句柄”。
[in] VirtualAddress
指向 MDL 描述的缓冲区基虚拟地址的指针。
NdisAllocateMdl 的 VirtualAddress 参数仅接受来自非分页池的内存。 换句话说,它需要 ExAllocatePool*(NonPagedNx)、 NdisAllocateMemoryWithTagPriority 或 NdisMAllocateSharedMemory 中的内存。 具体而言,它 不应 与堆栈、分页池、驱动程序全局数据或其他内存区域的内存一起使用。
如果驱动程序需要为其中一个非非分页池区域生成 MDL,则应为该类型的内存(例如 IoAllocateMdl 与 MmProbeAndLockPages 结合使用)使用适当的内核 API。
[in] Length
内存缓冲区的大小(以字节为单位)。
返回值
NdisAllocateMdl 返回指向分配的 MDL 的指针。 如果分配失败,则返回值为 NULL。
注解
通过调用 NdisAllocateMdl 分配的所有 MDL 都必须通过调用 NdisFreeMdl 函数来释放。
NdisAllocateMdl 分配内存并在一个步骤中生成 MDL。 此过程不同于仅为 MDL 分配内存的 IoAllocateMdl,这意味着调用方必须通过调用 MmBuildMdlForNonPagedPool 或 MmProbeAndLockPages 来生成 MDL。
要求
| Requirement | 价值 |
|---|---|
| 最低支持的客户端 | NDIS 6.0 及更高版本中受支持。 |
| 目标平台 | 普遍 |
| 最低 UMDF 版本 | 2.33 |
| Header | ndis/mdlapi.h (include ndis.h) |
| Library | Ndis.lib |
| IRQL | <= DISPATCH_LEVEL |
| DDI 符合性规则 | Irql_NetBuffer_Function(ndis)、 NdisAllocateMdl(ndis) |