根据GUID类别获取设备信息

来源:互联网 发布:淘宝最好的零食店 编辑:程序博客网 时间:2024/04/29 03:47
BOOL EnumClassDevice( const GUID * InterfaceClassGuid, vector<string> &sDevPath)
{
HDEVINFO DeviceInfoSet;
HDEVINFO NewDeviceInfoSet;


SP_DEVICE_INTERFACE_DATA DeviceInterfaceData;
PSP_DEVICE_INTERFACE_DETAIL_DATA lpDeviceInterfaceDetailData;


DWORD dwBufferSize = 0;
DWORD i = 0;
// 创建空设备信息列表
DeviceInfoSet = SetupDiCreateDeviceInfoList(NULL, NULL);


if(DeviceInfoSet == INVALID_HANDLE_VALUE) 
{
printf("CreateDeviceInfoList failed: %d\n", GetLastError());
return 0;
}


// 根据接口类型获得新的设备信息列表


NewDeviceInfoSet = SetupDiGetClassDevsEx(
InterfaceClassGuid,
NULL,
NULL,
DIGCF_PRESENT | DIGCF_DEVICEINTERFACE,
DeviceInfoSet,// 之前创建的设备信息列表
NULL,
NULL
);
if(NewDeviceInfoSet == INVALID_HANDLE_VALUE)
{
printf( "SetupDiGetClassDevsEx failed: %d\n", GetLastError() );
return 0;
}
// 设置 SP_DEVICE_INTERFACE_DATA 大小
DeviceInterfaceData.cbSize 
= sizeof(SP_DEVICE_INTERFACE_DATA);


for (i=0; ;i++)
{
// 列举接口信息
BOOL bResult = SetupDiEnumDeviceInterfaces(
NewDeviceInfoSet,
NULL,
InterfaceClassGuid,
i,
&DeviceInterfaceData
);
if(!bResult)
{
if ( GetLastError()!=NO_ERROR &&
GetLastError()!=ERROR_NO_MORE_ITEMS )
{
printf("ERROR: (%d)",GetLastError());
return FALSE;
}
break;
}
else
{
// 为PSP_DEVICE_INTERFACE_DETAIL_DATA结构分配内存,填充
lpDeviceInterfaceDetailData = (PSP_DEVICE_INTERFACE_DETAIL_DATA)HeapAlloc(
GetProcessHeap(), 0,
sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA));
lpDeviceInterfaceDetailData->cbSize 
= sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
dwBufferSize = lpDeviceInterfaceDetailData->cbSize;
// 获得接口详细信息
while(!SetupDiGetDeviceInterfaceDetail(
NewDeviceInfoSet,
&DeviceInterfaceData,
lpDeviceInterfaceDetailData,
dwBufferSize,
&dwBufferSize,
NULL))
{
// 如果内存空间不足,再次分配,直到可以成功调用
if(ERROR_INSUFFICIENT_BUFFER==GetLastError())
{
lpDeviceInterfaceDetailData = (PSP_DEVICE_INTERFACE_DETAIL_DATA)HeapReAlloc(
GetProcessHeap(), 0, 
lpDeviceInterfaceDetailData, dwBufferSize);
lpDeviceInterfaceDetailData->cbSize 
= sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
}      
}


string devPath = lpDeviceInterfaceDetailData->DevicePath;
sDevPath.push_back(devPath);
// 显示信息
//printf("DevicePath: %s\n",lpDeviceInterfaceDetailData->DevicePath);
// lpDeviceInterfaceDetailData->DevicePath可作为CreateFile的参数,进行IO控制


// 释放内存
HeapFree(GetProcessHeap(),0,lpDeviceInterfaceDetailData);
}
}

SetupDiDestroyDeviceInfoList(DeviceInfoSet);
return TRUE;

}

此处主要得到的是设备的devicePath。 本代码在VS2010环境编译通过。主要用到的接口是SetupDiCreateDeviceInfoList,SetupDiGetClassDevsEx,SetupDiEnumDeviceInterfaces和SetupDiGetDeviceInterfaceDetail。

0 0
原创粉丝点击