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