Как отличить внешний жесткий диск от внутреннего?

Я хочу знать, подключено ли устройство через USB (имеется в виду съемный жесткий диск) или SATA (имеется в виду внутренний жесткий диск). Вот так я получаю список устройств

SP_DEVINFO_DATA volumeData;
volumeData.cbSize = sizeof (SP_DEVINFO_DATA);
SP_DEVICE_INTERFACE_DATA volumeInterfaceData;
volumeInterfaceData.cbSize = sizeof (SP_DEVICE_INTERFACE_DATA);
wchar_t buffer[1024];
PSP_DEVICE_INTERFACE_DETAIL_DATA volumeInterfaceDetail;
volumeInterfaceDetail = (PSP_DEVICE_INTERFACE_DETAIL_DATA)buffer;
volumeInterfaceDetail->cbSize = sizeof (SP_DEVICE_INTERFACE_DETAIL_DATA);
for (int j = 0; SetupDiEnumDeviceInterfaces (hVolumeInfo, 0, &GUID_DEVINTERFACE_VOLUME, j, &volumeInterfaceData); j++) {
    DWORD bufferPathSize = offsetof (SP_DEVICE_INTERFACE_DETAIL_DATA, DevicePath) + sizeof(TCHAR);
    SetupDiGetDeviceInterfaceDetail (
        hVolumeInfo,
        &volumeInterfaceData,
        volumeInterfaceDetail,
        bufferPathSize,
        &bufferPathSize,
        &volumeData
        ));
    <some actions here>
}

После таких операций я получаю вид следующего результата для каждого подключенного тома:

volumeInterfaceDetail->DevicePath: "\\\\?\\storage#volume#{3ec3ba03-2789-11e4-8251-806e6f6e6963}#0000000015f00000#{53f5630d-b6bf-11d0-94f2-00a0c91efb8b}"

Как определить интерфейс (USB, SATA), к которому подключено рассматриваемое устройство? Или есть какой-то другой способ отличить внешние и внутренние жесткие диски с помощью WinAPI?

2 ответа

Решение

Вам нужно сделать следующее:

  1. использование CreateFile чтобы справиться с устройством.
  2. использование DeviceIoControl отправить IOCTL_STORAGE_QUERY_PROPERTY ioctl к устройству, чтобы попросить его рассказать вам о его свойствах.
  3. Результирующий STORAGE_DEVICE_DESCRIPTOR структура содержит BusType Перечисление, которое говорит вам автобус, к которому он подключен.

Внизу этой страницы есть небольшой фрагмент кода, который вы можете использовать для начала.

Похоже GetDriveType это просто вещь, чтобы установить тип привода.


Если вы действительно заинтересованы в использовании USB вместо USB, а не в том, является ли диск съемным, то документация GetDriveType состояния, заранее:

Чтобы определить, является ли диск USB-накопителем, позвоните SetupDiGetDeviceRegistryProperty и укажите SPDRP_REMOVAL_POLICY имущество.

Другие вопросы по тегам