我有一台装有SATA驱动器和代码的计算机,该计算机通过Windows 7返回的位置信息为SCSI_ADDRESS。以下代码在Windows 7上运行良好。
typedef struct _SCSI_ADDRESS {
ULONG Length;
UCHAR PortNumber;
UCHAR PathId;
UCHAR TargetId;
UCHAR Lun;
}SCSI_ADDRESS, *PSCSI_ADDRESS;
char[256] FileName;
strcpy(FileName, "\\?\ide#diskcrucial_ct250mx200ssd1__________________mu02____#4&1f5e0e69&0&0.0.0#{53f56307-b6bf-11d0-94f2-00a0c91efb8b}");
m_deviceHandle = CreateFile(FileName,
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE,
0,
OPEN_EXISTING,
FILE_FLAG_OVERLAPPED | FILE_FLAG_NO_BUFFERING,
0);
SCSI_ADDRESS m_sa;
memset ((void *)&m_sa, 0, sizeof(SCSI_ADDRESS));
m_sa.Length = sizeof(SCSI_ADDRESS);
if (!DeviceIoControl(IOCTL_SCSI_GET_ADDRESS, &m_sa, sizeof(SCSI_ADDRESS), &m_sa, sizeof(SCSI_ADDRESS), &cbBytesReturned))
{
}
在Windows 10下,Intel SATA驱动程序返回成功代码(true),但将SCSI信息保留为零。我确实注意到,通过设备管理器或磁盘管理,每个SATA磁盘的位置都不同。
如何获取位置信息?
我有一个指向该设备的开放链接,可以获取IOCTL_SCSI_ *的所有信息,而不仅仅是位置ID。
硬件
磁盘连接到内部Intel SATA控制器。
控制器:Intel ICH8R/DH/DO SATA AHCI Controller
驱动程序:iaStor.sys
版本:8.9.0.1023
我可能会公开呈现SCSI信息的其他驱动程序,尽管随着英特尔驱动程序的工作,该问题仍然有效。
更新:
我发现了this个帖子,该帖子指示使用“获取磁盘|在PowerShell中选择*'。我确实看到了位置信息
Location : Integrated : Adapter 0 : Channel 0 : Device 0
信息不完全是“ 3”或“ 2”,如设备管理器中所示。这种方法在C ++中会很痛苦。我真的很希望能获得位置信息的Setupdi API或IOCTL方法。
这两个链接one和two很有趣,但不是很有帮助,因此,在这里将它们列为研究的一部分。我已经有了设备路径,因此没有必要。
This链接讨论了如何在C ++中实现ManagementObjectSearcher
。