以下步骤介绍了 NDIS 如何参与 Windows Vista 和 Windows Server 2008 中意外删除 NIC:
PnP 管理器向 NIC 的设备堆栈发出 IRP_MN_SURPRISE_REMOVAL 请求。
当 NDIS 收到此 IRP 时,它会调用附加到驱动程序堆栈中 NIC 的最低筛选器驱动程序的 FilterNetPnPEvent 函数。 在此调用中,NDIS 指定 NetEventQueryRemoveDevice 的事件代码。
注意 NDIS 仅对播发 FilterNetPnPEvent 函数入口点的筛选器驱动程序执行此步骤。 筛选器驱动程序在调用 NdisFRegisterFilterDriver 函数时播发此入口点。
在调用 FilterNetPnPEvent 函数的上下文中,筛选器驱动程序必须调用 NdisFNetPnPEvent ,将 NetEventQueryRemoveDevice 事件转发到驱动程序堆栈中的下一个筛选器驱动程序。 这会导致 NDIS 使用 NetEventQueryRemoveDevice.的事件代码调用该筛选器驱动程序的 FilterNetPnPEvent 函数。
注意 NDIS 仅对驱动程序堆栈中播发 FilterNetPnPEvent 函数入口点的下一个筛选器驱动程序执行此步骤。
驱动程序堆栈中的每个筛选器驱动程序重复上一步,直到堆栈中最高的筛选器驱动程序转发 NetEventQueryRemoveDevice 事件。
发生这种情况时,NDIS 会调用绑定到 NIC 的所有协议驱动程序的 ProtocolNetPnPEvent 函数。 在此调用中,NDIS 指定 NetEventQueryRemoveDevice.的事件代码。
如果微型端口驱动程序已成功初始化,NDIS 使用事件代码 NdisDevicePnPEventSurpriseRemoved 调用 MiniportDevicePnPEventNotify 函数。 微型端口驱动程序应注意该设备已被物理删除。 如果微型端口驱动程序是 NDIS-WDM 驱动程序,它应取消发送到基础总线驱动程序的任何挂起的 IRP。 如果微型端口驱动程序未成功初始化,则继续处理。
NDIS 将IRP_MN_SURPRISE_REMOVAL请求发送到堆栈中的下一个较低设备对象。 收到来自堆栈中下一个较低设备对象的返回IRP_MN_SURPRISE_REMOVAL请求后,NDIS 将完成IRP_MN_SURPRISE_REMOVAL请求。
PnP 管理器发出 IRP_MN_REMOVE_DEVICE 请求,要求删除 (设备对象的软件表示形式,等等,) NIC。
NDIS 执行以下步骤:
它会暂停绑定到 NIC 的所有协议驱动程序。
它会暂停附加到 NIC 的所有筛选器驱动程序。
它将暂停 NIC 的微型端口驱动程序。
它调用绑定到 NIC 的所有协议驱动程序的 ProtocolUnbindAdapterEx 函数。
它调用附加到 NIC 的所有筛选器模块的 FilterDetach 函数。
在所有协议和筛选器驱动程序未绑定并从 NIC 分离后,NDIS 调用微型端口驱动程序的 MiniportHaltEx 函数。 NDIS 将 MiniportHaltEx 的 HaltAction 参数设置为 NdisHaltDeviceSurpriseRemoved。
NDIS 将IRP_MN_REMOVE_DEVICE请求发送到堆栈中的下一个较低设备对象。
当 NDIS 收到来自堆栈中下一个较低设备对象的已完成IRP_MN_REMOVE_DEVICE请求时,NDIS 会销毁它为 NIC 创建的 FDO (FDO) 的功能设备对象。