我想知道设备是通过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来区分外部和内部HDD?
您需要执行以下操作:
- 使用
CreateFile
获取设备的句柄 - 使用
DeviceIoControl
向设备发送IOCTL_STORAGE_QUERY_PROPERTY
ioctl,要求它告诉您其属性 - 生成的
STORAGE_DEVICE_DESCRIPTOR
结构包含一个BusType
枚举,该枚举告诉它所连接的总线
在这个页面的底部有一个小代码片段,您可以使用它来开始。
看起来GetDriveType
只是建立驱动器类型的工具。
如果你真的对USB与非USB感兴趣,而不是对驱动器是否可移动感兴趣,那么GetDriveType
的文档会提前声明:
"要确定驱动器是否为USB类型的驱动器,请调用
SetupDiGetDeviceRegistryProperty
并指定SPDRP_REMOVAL_POLICY
属性。