C++ 获取USB设备C+的父级信息+;
我正在使用一个MFC工具来检查连接的USB设备的一些驱动程序信息,如位置信息、父设备、硬件id等。我已经获得了所有其他我想要的信息,但我一直在获取设备父设备信息 我使用Setupapi.dll在代码中获取设备信息。 使用SetupDiGetClassDevs函数获取USB设备信息句柄。 使用SetupDiEnumDeviceInfo函数获取特定的设备信息数据。 使用SetupDiGetDeviceRegistryProperty功能获取设备描述和硬件idC++ 获取USB设备C+的父级信息+;,c++,windows,winapi,device-instance-id,C++,Windows,Winapi,Device Instance Id,我正在使用一个MFC工具来检查连接的USB设备的一些驱动程序信息,如位置信息、父设备、硬件id等。我已经获得了所有其他我想要的信息,但我一直在获取设备父设备信息 我使用Setupapi.dll在代码中获取设备信息。 使用SetupDiGetClassDevs函数获取USB设备信息句柄。 使用SetupDiEnumDeviceInfo函数获取特定的设备信息数据。 使用SetupDiGetDeviceRegistryProperty功能获取设备描述和硬件id // List all connecte
// List all connected USB devices
hDevInfo = SetupDiGetClassDevs(pClassGuid, pszEnumerator,
NULL, pClassGuid != NULL ? DIGCF_PRESENT : DIGCF_ALLCLASSES |
DIGCF_PRESENT);
// Get device info data
SetupDiEnumDeviceInfo(hDevInfo, i, &DeviceInfoData);
// Get device instance id
CM_Get_Device_ID(DeviceInfoData.DevInst, szDeviceInstanceID, MAX_PATH,
0);
// Get device description
SetupDiGetDeviceRegistryProperty(hDevInfo, &DeviceInfoData,
SPDRP_DEVICEDESC,
&dwPropertyRegDataType, (BYTE*)szDesc, sizeof(szDesc), &dwSize);
#define DEFINE_DEVPROPKEY(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7,
b8, pid) EXTERN_C const DEVPROPKEY DECLSPEC_SELECTANY
name = { { l, w1, w2, { b1, b2, b3, b4, b5, b6, b7, b8 } }, pid
}
// DEVPROP_TYPE_STRING
DEFINE_DEVPROPKEY(DEVPKEY_Device_Manufacturer, 0xa45c254e, 0xdf1c,
0x4efd, 0x80, 0x20, 0x67, 0xd1, 0x46, 0xa8, 0x50, 0xe0, 13);
// DEVPROP_TYPE_GUID
DEFINE_DEVPROPKEY(DEVPKEY_Device_ContainerId, 0x8c7ed206, 0x3f8a, 0x4827,
0xb3, 0xab, 0xae, 0x9e, 0x1f, 0xae, 0xfc, 0x6c, 2);
typedef BOOL(WINAPI *FN_SetupDiGetDevicePropertyW)(
__in HDEVINFO DeviceInfoSet,
__in PSP_DEVINFO_DATA DeviceInfoData,
__in const DEVPROPKEY *PropertyKey,
__out DEVPROPTYPE *PropertyType,
__out_opt PBYTE PropertyBuffer,
__in DWORD PropertyBufferSize,
__out_opt PDWORD RequiredSize,
__in DWORD Flags
);
FN_SetupDiGetDevicePropertyW fn_SetupDiGetDevicePropertyW =
(FN_SetupDiGetDevicePropertyW)
GetProcAddress(GetModuleHandle(TEXT("Setupapi.dll")),
"SetupDiGetDevicePropertyW");
if (fn_SetupDiGetDevicePropertyW(hDevInfo, &DeviceInfoData,
&DEVPKEY_Device_Manufacturer, &ulPropertyType, (BYTE*)szBuffer,
sizeof(szBuffer), &dwSize, 0))
{
_tprintf(TEXT(" Device Manufacturer: \"%ls\"\n"), szBuffer);
}
if (fn_SetupDiGetDevicePropertyW(hDevInfo, &DeviceInfoData,
&DEVPKEY_Device_ContainerId, &ulPropertyType, (BYTE*)szDesc,
sizeof(szDesc), &dwSize, 0))
{
StringFromGUID2((REFGUID)szDesc, szBuffer, ARRAY_SIZE(szBuffer));
_tprintf(TEXT(" ContainerId: \"%ls\"\n"), szBuffer);
}
对我来说,获取USB设备的家长信息非常有用。请提供一些线索
CM\u Locate\u DevNode
在给定设备ID的情况下打开设备句柄
CM\u Get\u Parent
查找父设备
CM\u-Get\u-Device\u-ID\u-Size
和CM\u-Get\u-Device\u-ID
取下设备手柄并返回设备ID
样本:
#include <Windows.h>
#include <setupapi.h>
#include <cfgmgr32.h>
#include <tchar.h>
#include <stdio.h>
#define ARRAY_SIZE(arr) (sizeof(arr)/sizeof(arr[0]))
#pragma comment (lib, "setupapi.lib")
int main()
{
HDEVINFO hDevInfo;
GUID guid;
BYTE buffer[1024];
DWORD dwRequiredSize;
DEVINST devInstParent;
SP_DEVICE_INTERFACE_DATA devInterfaceData;
SP_DEVINFO_DATA devInfoData;
PSP_DEVICE_INTERFACE_DETAIL_DATA pDevDetail;
CONFIGRET status;
TCHAR szDeviceInstanceID[MAX_DEVICE_ID_LEN];
BOOL bSuccess;
guid = GUID_DEVINTERFACE_VOLUME;
hDevInfo = SetupDiGetClassDevs(&guid, NULL, NULL, DIGCF_DEVICEINTERFACE | DIGCF_PRESENT);
if (hDevInfo == INVALID_HANDLE_VALUE) {
return 1;
}
for (DWORD dwIndex = 0;; dwIndex++)
{
ZeroMemory(&devInterfaceData, sizeof(devInterfaceData));
devInterfaceData.cbSize = sizeof(devInterfaceData);
if (!SetupDiEnumDeviceInterfaces(hDevInfo, NULL, &guid, dwIndex, &devInterfaceData)) {
DWORD dwErrorCode = GetLastError();
if (dwErrorCode == ERROR_NO_MORE_ITEMS)
break;
else
return 1;
}
ZeroMemory(&devInfoData, sizeof(devInfoData));
devInfoData.cbSize = sizeof(devInfoData);
pDevDetail = (PSP_DEVICE_INTERFACE_DETAIL_DATA)buffer;
pDevDetail->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
// Get device interface detail data to get Device Instance from
// SP_DEVINFO_DATA and Device Path from SP_DEVICE_INTERFACE_DETAIL_DATA
bSuccess = SetupDiGetDeviceInterfaceDetail(hDevInfo, &devInterfaceData,
pDevDetail,// SP_DEVICE_INTERFACE_DETAIL_DATA
sizeof(buffer), &dwRequiredSize, &devInfoData); // SP_DEVINFO_DATA
status = CM_Get_Parent(&devInstParent, devInfoData.DevInst, 0);
if (status == CR_SUCCESS)
{
status = CM_Get_Device_ID(devInstParent, szDeviceInstanceID, ARRAY_SIZE(szDeviceInstanceID), 0);
if (status == CR_SUCCESS)
_tprintf(TEXT(" %s\n"), szDeviceInstanceID);
}
else
{
continue;
}
}
return 0;
}
#包括
#包括
#包括
#包括
#包括
#定义数组大小(arr)(sizeof(arr)/sizeof(arr[0]))
#pragma注释(lib,“setupapi.lib”)
int main()
{
HDEVINFO HDEVINFO;
GUID;
字节缓冲区[1024];
DWORD DWORD所需尺寸;
Devist DevistParent;
SP_设备_接口_数据设备接口数据;
SP_DEVINFO_数据DEVINFO数据;
PSP\设备\接口\详细信息\数据pDevDetail;
配置状态;
TCHAR szDeviceInstanceID[最大设备ID长度];
成功;
guid=guid\u设备接口\u卷;
hDevInfo=SetupDiGetClassDevs(&guid,NULL,NULL,DIGCF_设备接口| DIGCF_PRESENT);
if(hDevInfo==无效的句柄值){
返回1;
}
for(DWORD-dwIndex=0;dwIndex++)
{
零内存(&DeviceInterfaceData,sizeof(DeviceInterfaceData));
DeviceInterfaceData.cbSize=sizeof(DeviceInterfaceData);
if(!setupDienumDeviceInterface(hDevInfo、NULL和guid、dwIndex和DeviceInterfaceData)){
DWORD dwErrorCode=GetLastError();
if(dwErrorCode==错误\u无\u更多\u项)
打破
其他的
返回1;
}
零内存(&devinfo数据,sizeof(devinfo数据));
devinfo.cbSize=sizeof(devinfo数据);
pDevDetail=(PSP_设备_接口_细节_数据)缓冲区;
pDevDetail->cbSize=sizeof(SP_设备_接口_细节_数据);
//获取要从中获取设备实例的设备接口详细信息数据
//SP_设备接口_详细信息_数据中的SP_设备信息_数据和设备路径
bSuccess=SetupDiGetDeviceInterfaceDetail(hDevInfo和DeviceInterfaceData,
pDevDetail,//SP\u设备\u接口\u详细信息\u数据
sizeof(缓冲区),&dwRequiredSize,&DEVINFO数据);//SP\u DEVINFO\u数据
status=CM\u Get\u Parent(&devinstpresent,devinfo.DevInst,0);
如果(状态==CR\U成功)
{
status=CM_Get_Device_ID(devinstpresent,szDeviceInstanceID,数组大小(szDeviceInstanceID),0);
如果(状态==CR\U成功)
_tprintf(文本(“%s\n”),szDeviceInstanceID);
}
其他的
{
继续;
}
}
返回0;
}
调试结果:
< /P>你是否尝试过DepKig?DeVice?父???是C++的,并且有链接,所以请用具体的参数更新你的答案。为了清楚起见,我添加了一个示例。我知道它是一个C和C++ API。我只是希望得到一个更充实的答案,而不是一个简单的C#问题答案链接。(您的答案仍然感觉像是一个代码转储,因此更多地评论您所做的事情仍然会改进答案)从-1到+1least@TarickWelling谢谢你的提醒。我只是希望能更快地找到解决方案。代码样本已经过验证,能够满足OP:)的要求