处理 NIC 意外删除

当用户从正在运行的系统中删除网络接口卡 (NIC) 而不事先通过用户界面 (UI) 通知系统时,会发生意外删除。

适用于 Windows Vista 和更高版本的操作系统的微型端口驱动程序应该能够处理意外删除。 具体而言,具有 Windows 驱动程序模型 (WDM) 下边缘的 NDIS 微型端口驱动程序应能够处理此类事件。 如果 NDIS-WDM 微型端口驱动程序不处理意外删除,则在意外删除之前,微型端口驱动程序发送给基础总线驱动程序的任何挂起 IRP 都无法完成。

对于 Windows Vista 及更高版本,微型端口驱动程序 (,例如具有 WDM 下边缘) 不直接控制硬件的微型端口驱动程序,应在调用 NdisMSetMiniportAttributes 时设置NDIS_MINIPORT_ATTRIBUTES_SURPRISE_REMOVE_OK属性标志。 设置此标志可防止在用户意外删除 NIC 时显示警告。 无法处理意外删除的微型端口驱动程序不应设置此标志。

支持意外删除的微型端口驱动程序本身应尝试在正常操作期间(在 MiniportDevicePnPEventNotify 的上下文之外)检测到意外删除。 删除 NIC 后,尝试读取 NIC 的 I/O 端口通常会导致所有位都设置为 1 的返回值。 如果微型端口驱动程序读取此类值,则应检查硬件是否存在具有更决定性的测试。 例如,微型端口驱动程序可以将值写入 I/O 端口,然后尝试从该端口读取值。 微型端口驱动程序还可以检查 NIC 的 I/O 寄存器中的有效值。 以这种方式检测意外删除,可防止微型端口驱动程序在尝试读取中断 DPC 中已删除的 NIC 寄存器时在无限循环中挂起。 以这种方式停止响应的微型端口驱动程序会阻止 NDIS 调用驱动程序的 MiniportDevicePnPEventNotify 函数。