首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何模拟SCSI设备

如何模拟SCSI设备
EN

Stack Overflow用户
提问于 2017-07-11 00:03:31
回答 1查看 373关注 0票数 2

让我们来画一张草图。

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端口(总线)”驱动程序。此驱动程序将为总线创建FDO (FILE_DEVICE_BUS_EXTENDER),并为我们将创建的每个设备创建PDO (FILE_DEVICE_MASS_STORAGE)。我们将处理内部ioctls,执行irp队列管理,将数据移入/移出SRB,等等。

我想知道必须满足什么“条件”才能让Windows“认为”SCSI设备是真实的(这样它就会出现在资源管理器中,等等)。类驱动是否会在我们创建设备时自动发送内部ioctls,或者我们也需要模拟这些请求?

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

EN

回答 1

Stack Overflow用户

发布于 2017-07-15 02:00:57

所以看起来很简单。

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可以选择合适的类驱动程序将其放在最上面。因此,堆栈将如下所示:

代码语言:javascript
复制
{User App}

[File System Driver]

[Class Driver]

[Bus Driver]

{Physical/Virtual Device}

然后类驱动程序将向我们的总线驱动程序发送内部ioctls。我们仍然可以自己发送此ioctl,例如旁路类驱动程序。参见IOCTL_SCSI_PASS_THROUGHIOCTL_SCSI_PASS_THROUGH_DIRECT控制代码文档;它清楚地表明我们可以绕过类驱动程序。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45016769

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档