释放 VM 队列

为了释放接收队列,过分的驱动程序会发出 OID_RECEIVE_FILTER_FREE_QUEUE 设置的 OID 请求。 NDIS_OID_REQUEST 结构的 InformationBuffer 成员包含指向NDIS_RECEIVE_QUEUE_FREE_PARAMETERS结构的指针,其队列标识符为 NDIS_RECEIVE_QUEUE_ID 类型。

OID_RECEIVE_FILTER_FREE_QUEUE 释放使用 OID_RECEIVE_FILTER_ALLOCATE_QUEUE OID 分配的过度驱动程序的接收队列。 有关分配接收队列的详细信息,请参阅 分配 VM 队列

注意 队列标识符为 NDIS_DEFAULT_RECEIVE_QUEUE_ID 的默认队列始终被分配,无法释放。

过度分配的驱动程序必须先释放它在队列上设置的所有筛选器,然后才能释放队列。 此外,在调用 NdisCloseAdapterEx 函数以关闭到网络适配器的绑定之前,过度分配的驱动程序必须释放它在网络适配器上分配的所有接收队列。 在调用微型端口驱动程序的 MiniportHaltEx 函数之前,NDIS 会释放网络适配器上分配的所有队列。

当微型端口驱动程序收到释放队列的请求时,它会执行以下操作:

  • 必须立即停止与队列关联的共享内存资源的 DMA。

  • 生成指示 DMA 已停止的状态指示。

  • 等待返回与队列关联的所有未完成 NET_BUFFER_LIST 结构。

  • 释放关联的共享内存和硬件资源。

当微型端口驱动程序收到 OID_RECEIVE_FILTER_FREE_QUEUE 集请求时,队列必须进入停止 DMA 状态,它会停止队列中的 DMA,微型端口驱动程序必须使用 NDIS_STATUS_RECEIVE_QUEUE_STATE 状态指示来指示状态更改。 有关队列状态的详细信息,请参阅 队列状态和操作

微型端口驱动程序发出 NDIS_STATUS_RECEIVE_QUEUE_STATE 状态指示后,它必须等待所有挂起的接收指示完成,然后才能释放关联的共享内存。 有关释放共享内存的详细信息,请参阅 共享内存资源分配