IRP_MJ_PNP (FS 和筛选器驱动程序)
发送时
每当系统上发生即插即用活动时,即插即用管理器就会发送IRP_MJ_PNP请求。 其他操作系统组件和其他内核模式驱动程序也可以发送某些IRP_MJ_PNP请求,具体取决于次要函数代码。
有关驱动程序即插即用 IRP 处理要求的详细信息,请参阅 即插即用。
有关IRP_MJ_PNP次要函数代码的参考信息,请参阅即插即用次要 IRP。
操作:文件系统驱动程序
文件系统应检查次要函数代码来确定请求的操作。 文件系统必须处理以下次要函数代码:
代码 | 说明 |
---|---|
IRP_MN_CANCEL_REMOVE_DEVICE | 指示以前的查询删除设备请求已取消。 发送此请求以提醒文件系统,以防文件系统需要执行与取消相关的任何清理。 |
IRP_MN_QUERY_REMOVE_DEVICE | 指示要删除设备。 如果在设备上装载了文件系统,PnP 管理器会将此请求发送到文件系统和任何文件系统筛选器。 如果设备有打开的句柄,则文件系统通常会使查询删除请求失败。 如果不是,文件系统通常会锁定卷,以防止将来创建请求成功。 如果装载的文件系统不支持查询删除请求,则 PnP 管理器将失败设备的查询删除请求。 |
IRP_MN_REMOVE_DEVICE | 指示要删除设备。 如果在设备上装载了文件系统,PnP 管理器会将此 IRP 发送到文件系统和任何文件系统筛选器。 文件系统应立即将此 IRP 传递到设备的存储驱动程序,并设置一个完成例程,然后文件系统在此例程中卸载卷。 |
IRP_MN_START_DEVICE | 指示设备正在启动。 文件系统应将此 IRP 传递给设备的存储驱动程序。 |
IRP_MN_SURPRISE_REMOVAL | 指示已删除设备。 如果设备上装载了文件系统,PnP 管理器会将此 IRP 发送到文件系统和任何文件系统筛选器。 文件系统应立即将此 IRP 传递到设备的存储驱动程序,并设置一个完成例程,然后文件系统在此例程中卸载卷。 |
操作:旧版文件系统筛选器驱动程序
文件系统筛选器驱动程序应根据以下准则处理 PnP IRP:
当用户要正常删除卷时,PnP 管理器会发送IRP_MN_QUERY_REMOVE_DEVICE请求。 收到此 IRP 时,筛选器必须关闭卷上所有打开的句柄,并将 IRP 向下传递到堆栈上下一个较低的驱动程序。 此步骤非常重要, 如果驱动程序无法关闭所有打开的句柄,则阻止卸载卷,从而阻止弹出物理设备。
收到IRP_MN_QUERY_REMOVE_DEVICE请求后,FAT 文件系统会立即卸载它可以安全删除的所有卷。 因此,附加到 FAT 卷的任何筛选器都应期望在调用筛选器的完成例程之前释放其筛选器设备对象。 NTFS 文件系统不执行此操作。 因此,当调用筛选器的完成例程时,附加到 NTFS 卷的筛选器预期其设备对象仍附加到卷。
在IRP_MN_QUERY_REMOVE_DEVICE请求之后但在收到IRP_MN_CANCEL_REMOVE_DEVICE或IRP_MN_REMOVE_DEVICE请求之前收到的 IRP 可以安全地向下传递,使存储设备堆栈失败,或保留在队列中,直到收到取消删除或删除设备请求。
如果筛选器在已关闭卷的所有打开句柄以响应IRP_MN_QUERY_REMOVE_DEVICE请求后收到IRP_MN_CANCEL_REMOVE_DEVICE请求,则可以重新打开句柄。 但是,在堆栈中的 IRP 下方的驱动程序成功完成 IRP 后,筛选器只能在其完成例程中重新打开。
当筛选器收到IRP_MN_REMOVE_DEVICE请求时,它通常不需要对 IRP 执行任何处理,除非它在收到IRP_MN_QUERY_REMOVE_DEVICE请求后一直持有队列中的 IRP。 如果它在队列中保留 IRP,则筛选器必须取消卷的所有 IRP 排队并 使其失败 ,然后才能将 IRP 向下传递到堆栈上的下一个较低驱动程序。
收到IRP_MN_SURPRISE_REMOVAL请求时,筛选器应执行以下操作:
关闭卷的所有打开句柄,因为文件系统无法清理堆栈,直到没有未完成的引用。
如果筛选器在队列中保存 IRP,则它可以使它们失败,或者将它们向下传递,让存储设备堆栈失败。
参数
文件系统或筛选器驱动程序调用给定 IRP 的 IoGetCurrentIrpStackLocation ,以获取指向 IRP 中其自身堆栈位置的指针。 在以下参数中, Irp 指向 IRP , 而 IrpSp 指向 IO_STACK_LOCATION。 驱动程序可以使用在 IRP 和 IRP 堆栈位置的以下成员中设置的信息来处理即插即用请求:
DeviceObject 是指向目标设备对象的指针。
Irp->IoStatus 指向一个 IO_STATUS_BLOCK 结构,该结构接收最终完成状态和有关所请求操作的信息。
IrpSp->对于 PnP IRP,FileObject 应指向 NULL 。
IrpSp->MajorFunction 设置为 IRP_MJ_PNP。
IrpSp->MinorFunction 设置为以下值之一:
- IRP_MN_CANCEL_REMOVE_DEVICE
- IRP_MN_QUERY_REMOVE_DEVICE
- IRP_MN_REMOVE_DEVICE
- IRP_MN_START_DEVICE
- IRP_MN_SURPRISE_REMOVAL