NdisAllocateMdl 函数 (ndis/mdlapi.h)
NdisAllocateMdl 函数分配一个 MDL,用于描述指定虚拟地址处的内存缓冲区。
语法
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,它应为该类型的内存使用适当的内核 API,例如 IoAllocateMdl 与 MmProbeAndLockPages 结合使用。
[in] Length
内存缓冲区的大小(以字节为单位)。
返回值
NdisAllocateMdl 返回指向已分配的 MDL 的指针。 如果分配失败,则返回值为 NULL。
注解
通过调用 NdisAllocateMdl 分配的所有 MDL 都必须通过调用 NdisFreeMdl 函数来释放。
NdisAllocateMdl 在一个步骤中分配内存并生成 MDL。 此过程不同于 IoAllocateMdl,后者仅为 MDL 分配内存,这意味着调用方必须通过调用 MmBuildMdlForNonPagedPool 或 MmProbeAndLockPages 来生成 MDL。
要求
要求 | 值 |
---|---|
最低受支持的客户端 | 在 NDIS 6.0 及更高版本中受支持。 |
目标平台 | 通用 |
最低 UMDF 版本 | 2.33 |
标头 | ndis/mdlapi.h (包括 ndis.h) |
Library | Ndis.lib |
IRQL | <= DISPATCH_LEVEL |
DDI 符合性规则 | Irql_NetBuffer_Function (ndis) , NdisAllocateMdl (ndis) |