【发布时间】:2017-12-14 11:12:10
【问题描述】:
让我们画图吧。
Windows 提供 SCSI 端口(总线)驱动程序。驱动程序为总线(FILE_DEVICE_BUS_EXTENDER)创建FDO,为每个连接到总线的设备(FILE_DEVICE_MASS_STORAGE)创建PDO。我们将大容量存储设备“连接”到 PnP 请求处理程序中的总线设备。
Windows 还提供了位于端口驱动程序之上的类驱动程序(针对每个设备类)。它为每个子设备在PDO 之上形成带有FDO 的设备堆栈。
类驱动向端口驱动发送内部ioctl;主功能码为IRP_MJ_SCSI,次功能码为IRP_MN_SCSI_CLASS,SCSI_REQUEST_BLOCK结构中填入了特定于请求的信息。
端口驱动处理与设备的通信(将数据从 SRB 移动到设备/将数据从设备移动到 SRB)并完成请求。
现在假设我们要模拟 scsi 设备。我们需要开发“虚拟 SCSI 端口(总线)”驱动程序。此驱动程序将为总线 (FILE_DEVICE_BUS_EXTENDER) 创建 FDO,并为我们将创建的每个设备 (FILE_DEVICE_MASS_STORAGE) 创建 PDO。我们将处理内部 ioctl、进行 irp 队列管理、将数据移入/移出 SRB 等。
我想了解必须满足什么“条件”才能让 Windows“认为”SCSI 设备是真实的(以便它出现在资源管理器中等)。类驱动程序会在我们创建设备后立即自动发送内部 ioctl,还是我们需要模拟这些请求?
我的问题可能很愚蠢,但我需要掌握正在发生的事情才能了解更多。感谢您的帮助。
【问题讨论】: