NdisMAllocateSharedMemoryAsyncEx 函数 (ndis.h)

谨慎

对于 ARM 和 ARM64 处理器,强烈建议 NDIS 驱动程序编写器使用 WDF DMA 或 WDM DMA 而不是 NDIS 散点/收集 DMA。

有关 WDF DMA 的详细信息,请参阅 处理 KMDF 驱动程序中的 DMA作

有关 WDM DMA 的详细信息,请参阅 管理驱动程序的输入/输出的 DMA 相关子主题。

微型端口驱动程序调用 NdisMAllocateSharedMemoryAsyncEx 函数,以分配驱动程序与其总线主 DMA NIC 之间共享的额外内存,通常当微型端口驱动程序在可用 NIC 接收缓冲区上运行较低时。

语法

NDIS_STATUS NdisMAllocateSharedMemoryAsyncEx(
  [in] NDIS_HANDLE MiniportDmaHandle,
  [in] ULONG       Length,
  [in] BOOLEAN     Cached,
  [in] PVOID       Context
);

参数

[in] MiniportDmaHandle

NDIS 用来管理 DMA 资源的上下文区域的句柄。 调用方通过调用 NdisMRegisterScatterGatherDma 函数。

[in] Length

要分配的字节数。

[in] Cached

忽略此参数(缓存内存始终用于 x86 和 x64 系统)。

[in] Context

指向要传递给 MiniportSharedMemoryAllocateComplete 函数的驱动程序确定上下文的指针。

返回值

NdisMAllocateSharedMemoryAsyncEx 可以返回以下项之一:

返回代码 描述
NDIS_STATUS_PENDING
NDIS 将调用 MiniportSharedMemoryAllocateComplete 函数,并提供描述分配的共享内存的信息。 如果尝试分配共享内存失败,NDIS 会调用 MiniportSharedMemoryAllocateComplete 并传递 NULL 指针。
NDIS_STATUS_FAILURE
目前无法分配请求的内存。 如果 NdisMAllocateSharedMemoryAsyncEx 返回此状态,则具有相同参数的后续调用可能会成功,具体取决于系统资源是否可用。

言论

注意, 微型端口驱动程序必须已调用 NdisMRegisterScatterGatherDmaNdisMRegisterDmaChannel 在调用 NdisMAllocateSharedMemoryAsyncEx之前初始化散点/收集 DMA 通道。
 
总线主 DMA NIC 的驱动程序 NdisMAllocateSharedMemoryAsyncEx 来动态分配共享内存。 此类驱动程序还会在初始化期间分配共享内存空间。 当高网络流量对现有共享内存空间过度需求时,这些驱动程序使用动态分配的共享内存进行传输作。

此类微型端口驱动程序通常维护一个或多个状态变量,以跟踪可用于传入传输的共享内存缓冲区数。 当可用缓冲区数达到驱动程序确定的低时,微型端口驱动程序会调用 NdisMAllocateSharedMemoryAsyncEx 来分配共享内存中的更多缓冲区空间。 当可用缓冲区数攀升到驱动程序确定的高点时,微型端口驱动程序调用 NdisMFreeSharedMemory 一次或多次释放其前面的动态分配。

通常,此类微型端口驱动程序会保留其 MiniportInitializeEx 函数分配的共享内存块,NdisMAllocateSharedMemory,直到删除 NIC。 删除 NIC 后,NDIS 调用微型端口驱动程序的 MiniportHaltEx 函数。 此分配足以处理通过 NIC 传输的平均需求。

微型端口驱动程序应设置其可分配的共享内存量的限制。 此限制特定于驱动程序,应足够高,以便驱动程序不会耗尽缓冲区。 请勿使用过高的限制,因为这可能会浪费共享内存,从而降低系统性能。

调用 NdisMAllocateSharedMemoryAsyncExNdisMAllocateSharedMemory 的任何微型端口驱动程序都必须在其 NIC 删除时释放一个或多个调用 NdisMFreeSharedMemory 的所有未完成分配。

要求

要求 价值
最低支持的客户端 NDIS 6.0 及更高版本中受支持。
目标平台 普遍
标头 ndis.h (包括 Ndis.h)
IRQL <= DISPATCH_LEVEL
DDI 符合性规则 Irql_Gather_DMA_Function(ndis)

另请参阅

MiniportHaltEx

MiniportInitializeEx

MiniportSharedMemoryAllocateComplete

NdisMAllocateSharedMemory

NdisMFreeSharedMemory

NdisMRegisterDmaChannel

NdisMRegisterScatterGatherDma