AllenGG

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

一 起因:

获取硬盘信息和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; } } }

 

 

posted on 2019-07-26 14:42  AllenGG  阅读(1160)  评论(0)    收藏  举报