让我们来画一张草图。
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端口(总线)”驱动程序。此驱动程序将为总线创建FDO (FILE_DEVICE_BUS_EXTENDER),并为我们将创建的每个设备创建PDO (FILE_DEVICE_MASS_STORAGE)。我们将处理内部ioctls,执行irp队列管理,将数据移入/移出SRB,等等。
我想知道必须满足什么“条件”才能让Windows“认为”SCSI设备是真实的(这样它就会出现在资源管理器中,等等)。类驱动是否会在我们创建设备时自动发送内部ioctls,或者我们也需要模拟这些请求?
我的问题可能很愚蠢,但我需要掌握正在发生的事情,以了解更多。谢谢你的帮助。
发布于 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可以选择合适的类驱动程序将其放在最上面。因此,堆栈将如下所示:
{User App}
[File System Driver]
[Class Driver]
[Bus Driver]
{Physical/Virtual Device}然后类驱动程序将向我们的总线驱动程序发送内部ioctls。我们仍然可以自己发送此ioctl,例如旁路类驱动程序。参见IOCTL_SCSI_PASS_THROUGH和IOCTL_SCSI_PASS_THROUGH_DIRECT控制代码文档;它清楚地表明我们可以绕过类驱动程序。
https://stackoverflow.com/questions/45016769
复制相似问题