【问题标题】:How to emulate SCSI device如何模拟 SCSI 设备
【发布时间】: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_CLASSSCSI_REQUEST_BLOCK结构中填入了特定于请求的信息。

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

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

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

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

【问题讨论】:

    标签: windows virtual scsi wdm


    【解决方案1】:

    所以看起来很简单。

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

    IRP_MN_QUERY_ID 请求(发送给子 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 控制代码文档;它清楚地表明我们可以绕过类驱动程序。

    【讨论】:

      猜你喜欢
      • 2010-12-27
      • 1970-01-01
      • 2011-01-06
      • 1970-01-01
      • 1970-01-01
      • 2012-10-20
      • 2014-12-08
      • 2010-11-21
      • 2018-07-17
      相关资源
      最近更新 更多