以下代码有没有问题:
// 功能:通过U盘盘符得到U盘的ID 包含pid, vid
// 入口参数:
// [out] csDeviceID:设备ID信息, 如 USB\VID_17EF&PID_3801\907117000F7F
// [in] csDiskSymbol:可移动设备的盘符 单个字母 如 H
// 返回值:
// 成功返回true
// 失败返回false
BOOL GetDiskDeviceIDBySymbol(PCHAR csDiskSymbol, PCHAR csDeviceID) {
//判断该盘符对应的磁盘类型
//WriteLog("csDiskSymbol1", FALSE);
//WriteLog(csDiskSymbol, TRUE);
HANDLE hVolume = CreateFile(csDiskSymbol, 0, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, NULL, NULL);
if (hVolume == INVALID_HANDLE_VALUE)
{
return FALSE;
}
//WriteLog("csDiskSymbol2", FALSE);
//WriteLog(csDiskSymbol, TRUE);
//通过DeviceIoControl获取设备的STORAGE_DEVICE_NUMBER
STORAGE_DEVICE_NUMBER sdnDiskDeviceNum; //包含有关设备的信息。
DWORD dwBytesReturned = 0;
if (!DeviceIoControl(hVolume, IOCTL_STORAGE_GET_DEVICE_NUMBER, NULL, 0, &sdnDiskDeviceNum, sizeof(sdnDiskDeviceNum), &dwBytesReturned, NULL))
{
//m_csErrorMsg.Format(_T("DeviceIoControl fail, error code:%d"), GetLastError());
return FALSE;
}
CloseHandle(hVolume);
if (sdnDiskDeviceNum.DeviceNumber == -1)
{
return FALSE;
}
//WriteLog("csDiskSymbol3", FALSE);
//WriteLog(csDiskSymbol, TRUE);
//
//已根据盘符得到设备的STORAGE_DEVICE_NUMBER,然后枚举USB设备,找到相同的STORAGE_DEVICE_NUMBER的设备, (只需比较DeviceNumber和DeviceType)
const GUID* pGuid = &GUID_DEVINTERFACE_DISK; //GUID_DEVINTERFACE_DISK GUID_DEVINTERFACE_USB_DEVICE
HDEVINFO hDevInfo = SetupDiGetClassDevs(pGuid, NULL, NULL, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);
if (hDevInfo == INVALID_HANDLE_VALUE)
{
//m_csErrorMsg.Format(_T("SetupDiGetClassDevs, error code:%d"), GetLastError());
return FALSE;
}
SP_DEVINFO_DATA DevInfoData;
DevInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
SP_DEVICE_INTERFACE_DATA DevInterfaceData;
DevInterfaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);
PSP_DEVICE_INTERFACE_DETAIL_DATA pDevInterfaceDetailData = NULL; //SetupDiGetDeviceInterfaceDetail用于存放信息,需要根据实际大小动态分配
DWORD dwRequiredSize = 0; //保存SetupDiGetDeviceInterfaceDetail返回的实际需要的缓存区大小
DWORD dwInstance = 0; //设备Instance
//WriteLog("csDiskSymbol4", FALSE);
//WriteLog(csDiskSymbol, TRUE);
//枚举所有设备
DWORD index = 0;
while (SetupDiEnumDeviceInterfaces(hDevInfo, NULL, pGuid, index, &DevInterfaceData))
{
//先直接调用函数,目的是获取第一个设备所需要的缓存区大小dwRequiredSize;
SetupDiGetDeviceInterfaceDetail(hDevInfo, &DevInterfaceData, NULL, 0, &dwRequiredSize, &DevInfoData);
//得到大小后分配内存
pDevInterfaceDetailData = (PSP_DEVICE_INTERFACE_DETAIL_DATA)malloc(dwRequiredSize);
pDevInterfaceDetailData->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
//再次调用获取信息
if (!SetupDiGetDeviceInterfaceDetail(hDevInfo, &DevInterfaceData, pDevInterfaceDetailData, dwRequiredSize, &dwRequiredSize, &DevInfoData))
{
//m_csErrorMsg.Format(_T("SetupDiGetDeviceInterfaceDetail, error code:%d"), GetLastError());
free(pDevInterfaceDetailData);
SetupDiDestroyDeviceInfoList(hDevInfo);
return FALSE;
}
HANDLE hDrive = CreateFile(pDevInterfaceDetailData->DevicePath, 0, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
if (hDrive == INVALID_HANDLE_VALUE)
{
//m_csErrorMsg.Format(_T("CreateFile INVALID_HANDLE_VALUE, error code:%d"), GetLastError());
free(pDevInterfaceDetailData);
SetupDiDestroyDeviceInfoList(hDevInfo);
return FALSE;
}
STORAGE_DEVICE_NUMBER sdnDeviceInfoByEnumDevice; //每次枚举时获取的设备信息
DWORD dwBytesReturned2 = 0;
if (DeviceIoControl(hDrive,
IOCTL_STORAGE_GET_DEVICE_NUMBER,
NULL,
0,
&sdnDeviceInfoByEnumDevice,
sizeof(sdnDeviceInfoByEnumDevice),
&dwBytesReturned2,
NULL
))
{
// 比较由盘符获取的DeviceNumber,DeviceType与枚举时获取的DeviceNumber,DeviceType,相同则说明盘符对应此USB设备
if (sdnDiskDeviceNum.DeviceNumber == sdnDeviceInfoByEnumDevice.DeviceNumber &&
sdnDiskDeviceNum.DeviceType == sdnDeviceInfoByEnumDevice.DeviceType)
{
dwInstance = DevInfoData.DevInst;
}
}
free(pDevInterfaceDetailData);
CloseHandle(hDrive);
++index;
}
//WriteLog("csDiskSymbol5", FALSE);
//WriteLog(csDiskSymbol, TRUE);
if (index == 0)
{
//m_csErrorMsg.Format(_T("SetupDiEnumDeviceInterfaces, error code:%d"), GetLastError());
SetupDiDestroyDeviceInfoList(hDevInfo);
return FALSE;
}
//m_csErrorMsg.Format(_T("SetupDiEnumDeviceInterfaces, error code:%d"), GetLastError());
//获取InstanceParent
DWORD dwInstanceParent = 0;
CM_Get_Parent(&dwInstanceParent, dwInstance, 0);
WCHAR buffer[256] = { 0 };
CM_Get_Device_ID(dwInstanceParent, buffer, sizeof(buffer), 0); // 得到设备ID,如 USB\VID_17EF&PID_3801\907117000F7F
SetupDiDestroyDeviceInfoList(hDevInfo);
sprintf(csDeviceID, "%s", buffer);
//csDeviceID.Format(_T("%s"), buffer); //找到的设备的ID, 我也不知道有没有可能两个设备这个ID是相同的
//csDeviceID.MakeUpper();
//WriteLog("csDiskSymbol6", FALSE);
//WriteLog(csDiskSymbol, TRUE);
return TRUE;
}
最新发布