У меня есть компьютер с дисками 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](https://i.stack.imgur.com/f6MdU.png)
Как получить местоположениеинформация?
У меня есть открытая ссылка на устройство, и я могу получить IOCTL_SCSI_ * все, только не идентификатор местоположения.
Оборудование
Диск подключен к внутреннему контроллеру Intel SATA.
Контроллер: Intel ICH8R/DH/DO SATA AHCI Controller
Драйвер: iaStor.sys
Версия: 8.9.0.1023
Я открыт для, возможно, другого драйвера, который отображает информацию SCSI, хотя вопрос все равно будет действительным, поскольку драйвер Intel работает.
ОБНОВЛЕНИЕ:
Я нашел этот пост, который указывает на использование 'get-disk |выберите * 'в PowerShell.Я вижу информацию о местоположении
Location : Integrated : Adapter 0 : Channel 0 : Device 0
Информация не совсем "3" или "2", как показано в диспетчере устройств.Этот метод будет боль в C ++.Я действительно надеюсь на API-интерфейс Setupdi или метод IOCTL, который получает информацию о местоположении.
Эти две ссылки, one и two , интересны, но не очень полезны, поэтомуЯ перечисляю их здесь как часть моего исследования.У меня уже есть путь к устройству, поэтому он не нужен.
Эта ссылка говорит о реализации ManagementObjectSearcher
в C ++.