void CGetUDiskDriverDlg::SearchUDISK()
{
int nCount, len;//标记同一设备个数
HDEVINFO hDevInfoSet;
BOOL bResult;
char * devicename;
char volume[MAX_PATH];
char ch[100];
memset(volume, 0, MAX_PATH);
PSP_DEVICE_INTERFACE_DETAIL_DATA pDetail =NULL;
// 取得一个该GUID相关的设备信息集句柄
hDevInfoSet = ::SetupDiGetClassDevs((LPGUID)&HARDDISK_GUID,//GUID_CLASS_USB_DEVICE, // class GUID
NULL, // 无关键字
NULL, // 不指定父窗口句柄
DIGCF_PRESENT ¦ DIGCF_DEVICEINTERFACE); // 目前存在的设备
// 失败...
if (hDevInfoSet == INVALID_HANDLE_VALUE)
{
return;
}
// 申请设备接口数据空间
nCount = 0;
bResult = TRUE;
SP_DEVICE_INTERFACE_DATA ifdata;
// 设备序号=0,1,2... 逐一测试设备接口,到失败为止
while (bResult)
{
ifdata.cbSize = sizeof(ifdata);
// 枚举符合该GUID的设备接口
bResult = ::SetupDiEnumDeviceInterfaces(
hDevInfoSet, // 设备信息集句柄
NULL, // 不需额外的设备描述
(LPGUID)&HARDDISK_GUID,//GUID_CLASS_USB_DEVICE, // GUID
(ULONG)nCount, // 设备信息集里的设备序号
&ifdata); // 设备接口信息
if (bResult)
{
ULONG predictedLength = 0;
ULONG requiredLength = 0;
// 取得该设备接口的细节(设备路径)
bResult = SetupDiGetInterfaceDeviceDetail(
hDevInfoSet, // 设备信息集句柄
&ifdata, // 设备接口信息
NULL, // 设备接口细节(设备路径)
0, // 输出缓冲区大小
&requiredLength, // 不需计算输出缓冲区大小(直接用设定值)
NULL); // 不需额外的设备描述
// 取得该设备接口的细节(设备路径)
predictedLength=requiredLength;
// if(pDetail)
// {
// pDetail =NULL;
// }
pDetail = (PSP_INTERFACE_DEVICE_DETAIL_DATA)::GlobalAlloc(LMEM_ZEROINIT, predictedLength);
pDetail- >cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
bResult = SetupDiGetInterfaceDeviceDetail(
hDevInfoSet, // 设备信息集句柄
&ifdata, // 设备接口信息
pDetail, // 设备接口细节(设备路径)
predictedLength, // 输出缓冲区大小
&requiredLength, // 不需计算输出缓冲区大小(直接用设定值)
NULL); // 不需额外的设备描述
if (bResult)
{
// 复制设备路径到输出缓冲区
for(int i=0;i <17;i++){
ch[i]=*(pDetail- >DevicePath+8+i);
}
ch[17]= "/0 ";
if (strcmp(ch,"vid_11dd&pid_0101")==0 ¦ ¦
strcmp(ch,"vid_11dd&pid_11dd")==0 ¦ ¦
strcmp(ch,"vid_0101&pid_0101")==0 ¦ ¦
strcmp(ch,"vid_0101&pid_11dd")==0) //比较版本号,防止意外出错
{
len = strlen(pDetail- >DevicePath);
devicename = new char[len];
memset(devicename, 0, len);
for(int i=0;i <(len-38);i++)
{
ch[i]=*(pDetail- >DevicePath+i);
}
ch[len-38]= "/0 ";
memset(volume, 0, MAX_PATH);
}
}
}
nCount++;
}
// 释放设备接口数据空间
::GlobalFree(pDetail);
// 关闭设备信息集句柄
::SetupDiDestroyDeviceInfoList(hDevInfoSet);
}
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/bengold1979/archive/2007/09/29/1805975.aspx