一 起因:
获取硬盘信息和SMART数据的时候,发现固定的硬盘和透过USB转接的硬盘方法是不一样的,因此需要提前判断硬盘是哪种总线类型。
二 过程:
1.Deviceiocontrol函数 配合控制码 IOCTL_STORAGE_QUERY_PROPERTY 获取BusType 类型。BusTypeUSB则为USB类型。另外也可判断是否为Scsi硬盘等类型。
2.Deviceiocontrol函数 配合控制码 IOCTL_DISK_GET_DRIVE_GEOMETRY 判断MediaType 是否为FixedMedia. 本地硬盘和移动硬盘都是FixedMedia,U盘会被过滤。
三 详述:
摘自CrystalDiskInfo 代码片段:
判断是硬盘还是U盘:
for(int i = 0; i < MAX_SEARCH_PHYSICAL_DRIVE; i++) { BOOL bRet; HANDLE hIoCtrl; DWORD dwReturned; DISK_GEOMETRY dg = {0}; CAtaSmart::INTERFACE_TYPE interfaceType = INTERFACE_TYPE_UNKNOWN; CAtaSmart::VENDOR_ID vendor = VENDOR_UNKNOWN; hIoCtrl = GetIoCtrlHandle(i); if(hIoCtrl == INVALID_HANDLE_VALUE) { /// DebugPrint(_T("INVALID_HANDLE_VALUE - continue")); continue; } /// DebugPrint(_T("DeviceIoControl")); bRet = ::DeviceIoControl(hIoCtrl, IOCTL_DISK_GET_DRIVE_GEOMETRY, NULL, 0, &dg, sizeof(DISK_GEOMETRY), &dwReturned, NULL); if(dg.MediaType == FixedMedia) { CString cstr; cstr.Format(_T("WakeUp(%d)"), i); DebugPrint(cstr); WakeUp(i); } ::CloseHandle(hIoCtrl);
}
判断总线类型:(USB HDD or Fixed HDD)
BYTE cbData[4096];
ZeroMemory(cbData, 4096);
STORAGE_DEVICE_DESCRIPTOR* pDescriptor;
STORAGE_PROPERTY_QUERY sQuery;
DWORD dwRet;
sQuery.PropertyId = StorageDeviceProperty;
sQuery.QueryType = PropertyStandardQuery;
sQuery.AdditionalParameters[0] = NULL;
bRet = ::DeviceIoControl(hIoCtrl, IOCTL_STORAGE_QUERY_PROPERTY, &sQuery,
sizeof(STORAGE_PROPERTY_QUERY), &cbData, 4096, &dwRet, NULL);
if(bRet != FALSE)
{
DebugPrint(_T("Check Bus Type"));
pDescriptor = (STORAGE_DEVICE_DESCRIPTOR*)&cbData;
if(pDescriptor->BusType == BusTypeUsb)
{
DebugPrint(_T("Bus Type = USB"));
interfaceType = INTERFACE_TYPE_USB;
vendor = USB_VENDOR_ALL;
}
}
}

浙公网安备 33010602011771号