2

让我们画图。

Windows 提供 SCSI 端口(总线)驱动程序。驱动程序FDO为总线 ( FILE_DEVICE_BUS_EXTENDER) 和PDO连接到总线 ( ) 的每个设备创建FILE_DEVICE_MASS_STORAGE。我们将大容量存储设备“连接”到 PnP 请求处理程序中的总线设备。

Windows 还提供了位于端口驱动程序之上的类驱动程序(针对每个设备类)。它在每个子设备FDO的顶部形成设备堆栈。PDO

类驱动程序将内部 ioctl 发送到端口驱动程序;主要功能码是IRP_MJ_SCSI,次要功能码是IRP_MN_SCSI_CLASSSCSI_REQUEST_BLOCK结构中填写了特定于请求的信息。

端口驱动程序处理与设备的通信(将数据从 SRB 移动到设备/将数据从设备移动到 SRB)并完成请求。

现在假设我们要模拟 scsi 设备。我们需要开发“虚拟 SCSI 端口(总线)”驱动程序。该驱动程序将为FDO总线 ( FILE_DEVICE_BUS_EXTENDER) 和PDO我们将创建的每个设备 ( FILE_DEVICE_MASS_STORAGE) 创建。我们将处理内部 ioctl、进行 irp 队列管理、将数据移入/移出 SRB 等。

我想了解必须满足哪些“条件”才能使 Windows“认为”SCSI 设备是真实的(以便它出现在资源管理器等中)。类驱动程序会在我们创建设备后立即自动发送内部 ioctl,还是我们需要模拟这些请求?

我的问题可能很愚蠢,但我需要掌握正在发生的事情才能了解更多。谢谢您的帮助。

4

1 回答 1

1

所以看起来很简单。

IRP_MN_QUERY_DEVICE_RELATIONS请求(发送到总线FDO)处理程序“连接”孩子PDO到总线FDO

IRP_MN_QUERY_IDrequest(发送给 child PDO)处理程序报告设备标识符,包括设备类型。请参阅https://docs.microsoft.com/en-us/windows-hardware/drivers/install/identifiers-for-scsi-devices

现在 Windows 可以选择适当的类驱动程序将其置于顶部。所以堆栈将如下所示:

{User App}

[File System Driver]

[Class Driver]

[Bus Driver]

{Physical/Virtual Device}

然后类驱动程序将内部 ioctl 发送到我们的总线驱动程序。我们仍然可以自己发送这个ioctl,例如绕过类驱动程序。查看IOCTL_SCSI_PASS_THROUGHIOCTL_SCSI_PASS_THROUGH_DIRECT控制代码文档;它清楚地表明我们可以绕过类驱动程序。

于 2017-07-14T18:00:57.040 回答