根据GUID类别获取设备信息

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情
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。

【PCIe】PCIe Guid相关 通过理解 GUID 驱动的绑定机制,可以更高效地开发或调试 PCIe 设备驱动。完全相同,并且使用相同的驱动程序,上位机需要通过其他硬件或系统提供的唯一标识符来区分它们。由驱动开发者定义,标识设备的特定功能接口(如自定义 PCIe 卡的通信接口)。驱动的关系密切,主要用于设备识别、驱动匹配和系统管理。避免使用微软保留的 GUID(如标准设备类),否则可能导致驱动无法加载。,并用户指定的物理插槽位置绑定(如 "插槽1对应设备A")。由微软定义,标识设备的大类(如存储、网络、显卡等)。 阅读详情

相关推荐

设备接口列举(备忘)常用手法

一般列举设备驱动都是安装程序需要完成的工作 HDEVINFO SetupDiCreateDeviceInfoList(     IN LPGUID ClassGuid, OPTIONAL     IN HWND hwndParent OPTIONAL     ); 作用:创建一个空的设备信息列表. ClassGuid参数指定一个设备类型GUID,hwndParent参数表示需要显示设备

rocispeng的专栏 1427

如何安装一个设备驱动程序[转]

本质上,安装驱动需要依靠UpdateDriverForPlugAndPlayDevices这个函数。它需要的参数其实不多,主要是INF文件路径等。BOOL WINAPIUpdateDriverForPlugAndPlayDevices(HWND  hwndParent,LPCTSTR  HardwareId,LPCTSTR  FullInfPath,DWORD  InstallFlags,

immcss的专栏 5380

驱动安装小试

因为公司要做一个驱动程序的安装程序,因为那个视频卡驱动在某个时候会丢失,这个时候要求重新安装,所以也就出现了这样的一个要求 ,后来在网上找答案,发现这个问题在很多网络上都有提问,有点是好几年前提的,我不知道他们有没有解决这个问题,至少我没有从他们中找到一个很完整的答案。像驱动开发网上,提问的人也很多,回答的不少。在网上我还是收集到了对我写这个程序有益处的东西,一个是MgrSrc[Written

海纳百川 3033

c++ 安装usb驱动

#include #include #include #include #include #pragma comment(lib,"Setupapi.lib") #pragma comment(lib,"newdev.lib") #include // Make all functions UNICODE safe. #include // for the API UpdateDr

d2262272d的博客 2863

VC++ USB接口程序函数

在应用程序一个文档内引用头文件如下,并将hidsdi,hidpi.h,hidusage.h,hidsdi.lib,setupapi.lib拷贝进工程文件夹下  extern "C" { // Declare the C libraries used #include "hidsdi.h" // Must link in hid.lib #include

luckywang1103的专栏 1万+

根据GUID获取设备信息

<br />#include <windows.h> #include <setupapi.h> #include <objbase.h> #include <initguid.h> GUID CdRomClassGuid = {0x53f56307L, 0xb6bf, 0x11d0, {0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b}}; //DEFINE_GUID(DiskClassGuid, 0x53f56307L,

Tody Guo的专栏 5817

USB设备GUID

<br />  DEFINE_GUID(DiskClassGuid,                               0x53f56307L,   0xb6bf,   0x11d0,   0x94,   0xf2,   0x00,   0xa0,   0xc9,   0x1e,   0xfb,   0x8b);   <br />   DEFINE_GUID(CdRomClassGuid,                             0x53f56308L,   0xb6

smartcos的专栏 1774

USB设备GUID

  DEFINE_GUID(DiskClassGuid,                               0x53f56307L,   0xb6bf,   0x11d0,   0x94,   0xf2,   0x00,   0xa0,   0xc9,   0x1e,   0xfb,   0x8b);     DEFINE_GUID(CdRomClassGuid,      

小虫 6113

inf文件中Class类型及GUID

14. 鼠标和其他指针设备 (Mice and other pointing devices)4. 相机和影像设备 (Cameras and Imaging Devices)19. HID设备 (Human Interface Devices)17. 视频捕获设备 (Video Capture Devices)15. 便携式设备 (Portable Devices)11. 系统设备 (System Devices)18. 其他设备 (Other Devices)12. 监视器 (Monitors)

SimpleForest的博客 1627

MFC\Windows常用设备接口类GUID

常用设备接口类GUID Identifier Class GUID Header GUID_DEVINTERFACE_USB_DEVICE {A5DCBF10-6530-11D2-901F-00C04FB951ED} Usbiodef.h GUID_DEVINTERFACE_USB_HOST_CONTROLLER {3ABF6F2D-71C4-462A-8A...

weixin_38886498的博客 422

Device Interface GUID

MSDN中的内容位置: DEVICE I/O下的 Device ManagementMSDN的Windows Multimedia#include       #include       #include       #include       #include       #include       #pragma       comment(lib,"setupapi

tomorrowsprogress的专栏 3199

枚举pc硬件设备获取相关信息

#include &lt;windows.h&gt; #include &lt;setupapi.h&gt; #include &lt;devguid.h&gt; #pragma comment(lib, "setupapi") void GetDeviceInfo() { //得到设备信息集 HDEVINFO hDevInfo = SetupDiGetClassDevs( (LP...

宏的博客 1432

常用设备接口类GUID

常用设备接口类GUID Identifier Class GUID Header GUID_DEVINTERFACE_USB_DEVICE {A5DCBF10-6530-11D2-901F-00C04FB951ED} Usbiodef.h GUID_DEVINTERFACE_USB_HOST_CONTROLLER {3ABF6F2D-71C4-462

大白爱小花的博客 1470

获取显示卡的信息

<br />利用SetupDiGetClassDevs和SetupDiGetDeviceRegistryPropertyA获取显示卡驱动信息。<br />#include "stdafx.h"<br />#include <setupapi.h><br />#pragma comment(lib,"setupapi.lib")<br />GUID pGUID= { 0x4D36E968 , 0xE325 , 0x11CE , 0xBF , 0xC1 , 0x08 , 0x00 , 0x2B , 0xE1 ,

wang19870102的专栏 2572

枚举系统设备

#include #include #include #include #include #include #pragma comment(lib, "setupapi.lib")#define BUFSIZE    1024#define SM_SERVERR    289int main(){    HDEVINFO hDevInfo;    SP_DEVINFO_DATA De

4154

常见硬件的设备GUID

Class GUID Device Description CDROM 4D36E965-E325-11CE-BFC1-08002BE10318 CD/DVD/Blu-ray drives DiskDrive 4D36E967-E325-11CE-BFC1-08002BE10318 Hard drives Display 4D36E968-E325-11

oldmtn的专栏 1411

可以真正实现免驱的WinUSB设备

可以真正实现免驱的WinUSB设备为什么要使用WinUSB设备?USB设备的枚举过程如何让一个USB设备被识别为WinUSB设备?WinUSB设备枚举成功后如何挂载驱动如何确定WinUSB设备驱动挂载成功说到最后 为什么要使用WinUSB设备? 如果您现在需要开发一款设备需要PC通信,用USB接口是个不错的选择。每个USB设备在PC主机上都有对应的一个驱动程序,Windows操作系统为常用标准USB设备类型(如HID设备类、USB接口打印机、优盘等)提供了对应的驱动程序,但如果您开发的USB设备不是标准

weixin_46753805的博客 1万+
上一篇: VC列举当前电脑存在的设备
下一篇: Win32串口编程
枫★曦
博客等级 码龄19年 251粉丝 153原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值