当设备即将被移除时,PnP 管理器首先通过 PnP 查询删除请求(IRP_MJ_PNP 和 IRP_MN_QUERY_REMOVE_DEVICE)调用类驱动程序的 DispatchPnP 例程。 在以下任一情况下,存储类驱动程序应失败查询删除请求:
设备包含系统的分页文件和休眠文件。
驱动程序正在运行不应取消的长时间操作(例如,倒带或格式化磁带)。
设备有未完成的句柄(CREATE)。
如果设备被指定用于故障转储,存储类驱动程序可能也会拒绝查询移除请求,因为移除此类设备会禁用故障转储。
如果存储类驱动程序返回 STATUS_SUCCESS 作为对查询删除请求的响应,PnP 管理器随后使用 PnP 删除请求(带有 IRP_MJ_PNP 和 IRP_MN_REMOVE_DEVICE)调用类驱动程序的 DispatchPnP 例程。 存储类驱动程序的 DispatchPnP 例程要么调用内部 RemoveDevice 例程,要么内联实现相同的功能。
存储类驱动程序的 RemoveDevice 例程必须执行以下作:
释放驱动程序分配的任何未完成的资源,例如内存或事件。
删除驱动程序创建的符号链接(如果有)。
删除设备对象(FDO)。
将请求转发到下层驱动程序。
如果存储类驱动程序在启动时创建了 PDO(例如,表示分区媒体设备上的分区),则在 PnP 管理器将删除请求发送到存储类驱动程序时,已删除此类 PDO。
即使在删除设备对象后,如果设备对象具有非零引用计数,则设备对象将保留在系统中,直到其引用计数达到零,然后以无提示方式消失。 删除设备对象后,存储类驱动程序不得尝试使用设备对象指针。
有关处理删除请求的详细信息,请参阅 “删除设备”。