停用 NDIS 端口

若要停用 NDIS 端口,微型端口驱动程序会将端口停用即插即用 (PnP) 事件发送到 NDIS。 微型端口驱动程序成功激活端口后,该驱动程序必须先停用该端口,然后才能释放该端口。 此外,驱动程序可能出于特定于应用程序的原因停用端口。 端口在停用后可以重新激活,但如果已释放端口,则无法重新激活该端口。

若要发送端口停用 PnP 事件,微型端口驱动程序在调用 NdisMNetPnPEvent 函数时使用 NetEventPortDeactivation PnP 事件代码。 若要停用端口,微型端口驱动程序必须设置 NdisMNetPnPEvent 参数指向的 NET_PNP_EVENT_NOTIFICATION 结构的成员,如下所示:

PortNumber
事件通知的源端口。 将此成员设置为零,因为端口号是在 NetPnPEvent 成员指定的结构的 Buffer 成员中提供的。

NetPnPEvent
描述端口停用事件的 NET_PNP_EVENT 结构。 按如下所示设置此结构的成员:

NetEvent
描述事件的事件代码。 将此成员设置为 NetEventPortDeactivation

缓冲区
指向NDIS_PORT_NUMBER类型元素数组的指针。 数组包含微型端口驱动程序正在停用的所有端口的端口号。

BufferLength
缓冲区 中指定的字节数。 将 BufferLength 设置为 Buffer 指向的数组的大小。 若要获取数组中的元素数,请将 BufferLength 中的值除以NDIS_PORT_NUMBER数据类型的大小。

其他成员
将NET_PNP_EVENT的其余成员设置为 NULL

微型端口驱动程序可以提供包含要停用的端口列表的数组。 但是,如果微型端口适配器的默认端口是 NetEventPortDeactivation PnP 事件的目标,则默认端口必须是数组中指定的唯一端口。

微型端口驱动程序可以随时停用活动端口。 但是,在微型端口驱动程序停用端口之前,它必须确保没有未完成的状态指示或接收与该端口关联的指示。 微型端口驱动程序发送端口停用 PnP 事件后,不得启动任何状态或接收与已停用端口关联的指示。

微型端口驱动程序还可以重新激活端口。 有关激活 NDIS 端口的详细信息,请参阅 激活 NDIS 端口

当微型端口驱动程序停用端口时,NDIS 使用 NetEventPortDeactivation PnP 事件通知绑定到微型端口驱动程序的所有协议驱动程序。 此 PnP 事件列出已更改为已分配状态的端口,不包括任何已停用的端口。 有关在协议驱动程序中处理端口停用事件的详细信息,请参阅 处理端口停用 PnP 事件

在微型端口驱动程序分配 NDIS 端口之前,驱动程序必须调用 NdisMSetMiniportAttributes 函数以在 NDIS_MINIPORT_ADAPTER_REGISTRATION_ATTRIBUTES 结构中设置注册属性。 微型端口驱动程序可以通过在调用 NdisMSetMiniportAttributes 时设置 NDIS_MINIPORT_CONTROLS_DEFAULT_PORT 属性标志来控制默认端口的激活。 如果微型端口驱动程序承担激活默认端口的责任,并且微型端口驱动程序激活了默认端口,则必须先停用默认端口,然后才能从 MiniportHaltEx 函数返回。

由NDIS_PORT_NUMBER元素数组指定的所有端口都必须处于激活状态。 微型端口驱动程序不应尝试停用已停用的端口。

如果 NDIS 无法停用端口数组中的任何端口,则端口数组中的任何端口都不会更改状态。 如果由于某些指定的端口不存在而停用失败, 则 NdisMNetPnPEvent 函数将返回NDIS_STATUS_INVALID_PORT返回值。 如果由于某些端口未处于激活状态而停用失败, 则 NdisMNetPnPEvent 将返回NDIS_STATUS_INVALID_PORT_STATE返回值。

在调用 NdisMNetPnPEvent 返回之前,端口不会停用,微型端口驱动程序必须能够处理 OID 请求并发送与该端口关联的请求。

当微型端口驱动程序停用默认端口时,NDIS 将关闭覆盖协议驱动程序和微型端口适配器之间的所有绑定。 如果微型端口驱动程序尝试停用默认端口且默认端口已停用, 则 NdisMNetPnPEvent 会失败并返回NDIS_STATUS_INVALID_PORT_STATE返回值。 如果微型端口驱动程序尝试停用默认端口,并且默认端口不是NDIS_PORT_NUMBER元素数组中指定的唯一端口, 则 NdisMNetPnPEvent 会失败并返回NDIS_STATUS_INVALID_PORT返回值。 如果微型端口驱动程序将 Buffer 成员设置为 NULLBufferLength 成员设置为零,则 NDIS 将失败 NdisMNetPnPEvent 调用并返回NDIS_STATUS_INVALID_PARAMETER返回值。

成功停用端口后,端口将处于已分配状态。 微型端口驱动程序不能指示已接收的数据或端口处于已分配状态的状态。