c++ - 如何区分外置硬盘和内置硬盘?

标签 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}"

如何检测所考虑的设备所连接的接口(interface)(USB、SATA)?或者有没有其他方法使用 WinAPI 来区分外部和内部 HDD?

最佳答案

您需要执行以下操作:

  1. 使用CreateFile获取设备的句柄。
  2. 使用DeviceIoControl发送 IOCTL_STORAGE_QUERY_PROPERTY ioctl 到设备,要求它告诉您它的属性。
  3. 结果 STORAGE_DEVICE_DESCRIPTOR结构包含 BusType枚举告诉您它所连接的总线。

this page底部有一个小代码片段您可以用它来开始。

关于c++ - 如何区分外置硬盘和内置硬盘?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28829606/

相关文章:

windows - 以编程方式启用 Powershell 是否可以接受?

c++ - Linux上raylib安装的问题

windows - 如何让 MSXML IXMLHTTPRequest 处理 HTTP 重定向?

c++ - 如何使用 glTranslatef 缩小对象?

C-WinAPI : Why does UTF-8 encoded characters show as Chinese in Listview?

c# - C/C++/C# 设置窗口位置 : Window on top of others

python - 用 Python 听 USB 键盘

android - Eclipse 从一天到另一天都看不到我的设备(三星 galaxy s3 mini)

C++多线程成员变量

c++ - 初学者 C++、指针和继承错误