如何区分外置硬盘和内置硬盘?
How to differ between external HDD and internal ones?
我想知道设备是通过 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
to send an IOCTL_STORAGE_QUERY_PROPERTY
ioctl 要求它告诉您它的属性。
- 生成的
STORAGE_DEVICE_DESCRIPTOR
structure contains a BusType
枚举告诉您它所连接的总线。
this page 底部有一小段代码供您开始使用。
看起来 GetDriveType
只是建立驱动器类型的东西。
如果您真的对 USB 与非 USB 感兴趣,而不是驱动器是否可移动,那么 GetDriveType
的文档预先说明:
” To determine whether a drive is a USB-type drive, call SetupDiGetDeviceRegistryProperty
and specify the SPDRP_REMOVAL_POLICY
property.
我想知道设备是通过 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
to send anIOCTL_STORAGE_QUERY_PROPERTY
ioctl 要求它告诉您它的属性。 - 生成的
STORAGE_DEVICE_DESCRIPTOR
structure contains aBusType
枚举告诉您它所连接的总线。
this page 底部有一小段代码供您开始使用。
看起来 GetDriveType
只是建立驱动器类型的东西。
如果您真的对 USB 与非 USB 感兴趣,而不是驱动器是否可移动,那么 GetDriveType
的文档预先说明:
” To determine whether a drive is a USB-type drive, call
SetupDiGetDeviceRegistryProperty
and specify theSPDRP_REMOVAL_POLICY
property.