Получить расположение диска SATA - PullRequest
0 голосов
/ 12 февраля 2019

У меня есть компьютер с дисками 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_ * все, только не идентификатор местоположения.

Оборудование

Диск подключен к внутреннему контроллеру 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 ++.

...