如何区分外置硬盘和内置硬盘?

时间:2015-03-03 10:36:43

标签: c++ winapi usb sata

我想知道设备是通过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 个答案:

答案 0 :(得分:3)

您需要执行以下操作:

  1. 使用CreateFile来处理设备。
  2. 使用DeviceIoControl向设备发送IOCTL_STORAGE_QUERY_PROPERTY ioctl,要求它告诉您其属性。
  3. 生成的STORAGE_DEVICE_DESCRIPTOR结构包含一个BusType枚举,告诉您它所连接的总线。
  4. this page底部有一个小代码片段供您开始使用。

答案 1 :(得分:0)

看起来GetDriveType就是建立驱动器类型的东西。


如果您真的对USB与非USB感兴趣而不是驱动器是否可移动,那么GetDriveType状态的文档会提前:

  

要确定驱动器是否为USB类型驱动器,请致电SetupDiGetDeviceRegistryProperty并指定SPDRP_REMOVAL_POLICY属性。