获取SATA驱动器位置

时间:2019-02-12 02:12:18

标签: c++ windows driver device ioctl

我有一台装有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磁盘的位置都不同。

Location information showing in Device Manager for the SATA drive

如何获取位置信息?

我有一个指向该设备的开放链接,可以获取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方法。

这两个链接onetwo很有趣,但不是很有帮助,因此,在这里将它们列为研究的一部分。我已经有了设备路径,因此没有必要。

This链接讨论了如何在C ++中实现ManagementObjectSearcher

0 个答案:

没有答案