我们正在开发一个应用程序来管理 Windows 10 中的设备。我们不应该使用自己的驱动程序与驱动器通信,因此为了发送大部分命令,我们必须依赖 Windows 10 中提供的任何内容。
对于像
NVME
和
Security Receive
这样的命令,我们使用它们对 Security Send
转换的支持,其中 SCSI 命令从主机发送,并由 SCSI 内核堆栈转换为 SCSI-NVME
命令,然后发送到驱动器。我们可以看到命令正在到达驱动器,但在使用
NVME
命令的情况下,转换无法将正确的命名空间标识符发送到驱动器,因此,SCSI 在感知数据中返回错误,如
Security Receive
。 SCSI-NVME 转换不允许在其 CDB 中设置命名空间标识符字段。是否有其他方法可以在我们从主机端发送的 SCSI 命令中设置此命名空间标识符?或者这是一个驱动程序错误,它向驱动器发送了错误的数据?
微软的其他API(如Storage Query Property)自己设置了这个命名空间ID,我们不需要从用户端设置它。
如果有在类似环境中工作过的人可以帮助我们,那将非常有帮助。
在我使用过的所有 Windows NVMe 驱动程序上,控制器由其适配器句柄公开,命名空间由物理驱动器句柄公开。目的是 SCSI 命令转到物理驱动器句柄,而本机 NVMe 命令转到适配器。如果将 SCSI 命令发送到物理驱动器句柄,则预期的命名空间是隐式的,因为每个句柄都直接连接到命名空间,因此应在转换期间将其设置为驱动程序。这绝对是它在 OFA(OpenFabrics Alliance)驱动程序和所有衍生产品上的工作方式。
如果您将 SCSI 命令发送到物理驱动器并且未填写命名空间,则听起来像是驱动程序错误。如果您要将 SCSI 命令发送到适配器(并且不会被操作系统/驱动程序拒绝),请尝试将其发送到与所需命名空间 ID 对应的物理驱动器。
干杯!