存储类驱动程序的 RemoveDevice 例程

当设备即将被删除时,PnP 管理器首先使用 PnP 查询删除请求调用类驱动程序的 DispatchPnP 例程 (IRP_MJ_PNP IRP_MN_QUERY_REMOVE_DEVICE。 在以下任一情况下,存储类驱动程序应使查询删除请求失败:

  • 设备包含系统分页文件或休眠文件。

  • 驱动程序正在运行一个不应取消的长时间操作 (例如,倒带磁带或格式化) 。

  • 设备 (CREATEs) 存在未完成的句柄。

如果声明设备进行故障转储,存储类驱动程序也可能使查询删除请求失败,因为删除此类设备会禁用故障转储。

如果存储类驱动程序返回STATUS_SUCCESS以响应查询删除请求,则 PnP 管理器随后使用 PnP 删除请求调用类驱动程序的 DispatchPnP 例程, (IRP_MJ_PNP IRP_MN_REMOVE_DEVICE) 。 存储类驱动程序的 DispatchPnP 例程调用内部 RemoveDevice 例程或内联实现相同的功能。

存储类驱动程序的 RemoveDevice 例程必须执行以下操作:

  • 释放驱动程序分配的任何未完成的资源,例如内存或事件。

  • 删除驱动程序创建的符号链接(如果有)。

  • (FDO) 删除设备对象。

  • 将请求转发到下一个较低的驱动程序。

例如,如果存储类驱动程序在启动时创建了 PDO (表示分区媒体设备上的分区) ,则当 PnP 管理器向存储类驱动程序发送删除请求时,此类 PDO 已被删除。

即使在删除设备对象后,如果设备对象具有非零引用计数,则设备对象仍会保留在系统中,直到其引用计数达到零,然后以静默方式消失。 删除设备对象后,存储类驱动程序不得尝试使用设备对象指针。

有关处理删除请求的详细信息,请参阅 删除设备