又被坑了,总算解决了,要睡了长话短说。首先,着重强调 Device Class GUID, Device Interface Class GUID, Interface GUID是有区别的,另外奉上两篇MSDN文章:

  

  http://msdn.microsoft.com/en-us/library/windows/hardware/ff553412(v=vs.85).aspx

  http://msdn.microsoft.com/en-us/library/windows/hardware/ff553428(v=vs.85).aspx

  Device Class GUID 是INF文件中Verison Section中指名的设备类GUID,他标志着此设备图标,此设备出现在哪一栏,电压电流等各种信息。

Interface GUID是指驱动程序中的GUID, 用于使用API打开此设备进行一系列读写操作,API代码如下(FINDSTR_USB_DEVICE即为我驱动程序中使用的GUID):

 1     //得到设备的句柄
 2         HDEVINFO    info=SetupDiGetClassDevs((LPGUID)&FINDSTR_USB_DEVICE,NULL,NULL,DIGCF_PRESENT|DIGCF_INTERFACEDEVICE);
 3         if(info==INVALID_HANDLE_VALUE)
 4         {
 5             AfxMessageBox("No HDEVINFO avaliable for this GUID\n");
 6             return    ;
 7         }
 8
 9         SP_INTERFACE_DEVICE_DATA ifdata;
10         ifdata.cbSize=sizeof(ifdata);
11         DWORD instance=0;
12         if(!SetupDiEnumDeviceInterfaces(info,NULL,(LPGUID)&FINDSTR_USB_DEVICE,instance,&ifdata))
13         {
14             AfxMessageBox("No SP_INTERFACE_DEVICE_DATA available for this GUID instance");
15             SetupDiDestroyDeviceInfoList(info);
16             return    ;
17         }
18
19         //得到符号链接名
20         DWORD ReqLen;
21         SetupDiGetDeviceInterfaceDetail(info,&ifdata,NULL,0,&ReqLen,NULL);
22         PSP_INTERFACE_DEVICE_DETAIL_DATA ifDetail=(PSP_INTERFACE_DEVICE_DETAIL_DATA)new char[ReqLen];
23         if(ifDetail==NULL)
24         {
25             AfxMessageBox("Error 1");
26             SetupDiDestroyDeviceInfoList(info);
27             return    ;
28         }
29         ifDetail->cbSize=sizeof(SP_INTERFACE_DEVICE_DETAIL_DATA);
30         if(!SetupDiGetDeviceInterfaceDetail(info,&ifdata,ifDetail,ReqLen,NULL,NULL))
31         {
32             AfxMessageBox("Error 2");
33             SetupDiDestroyDeviceInfoList(info);
34             delete ifDetail;
35             return    ;
36         }
37         char buff[256]={0};
38         char * format="Symbolic link is %s\n";
39         sprintf(buff,format,ifDetail->DevicePath);
40         HANDLE    rv=CreateFile(ifDetail->DevicePath,
41                         GENERIC_READ|GENERIC_WRITE,
42                         FILE_SHARE_READ|FILE_SHARE_WRITE,
43                         NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED,NULL);
44         //end of 得到设备句柄
45         delete    ifDetail;
46         SetupDiDestroyDeviceInfoList(info);
47
48         hDevice=rv;
49         DWORD ThreadId;
50         hThread=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)UpDate,this,0,&ThreadId);
51         m_EchoLed1.EnableWindow(TRUE);
52         m_EchoLed2.EnableWindow(TRUE);
53         m_OpenDevice.SetWindowText("关闭设备");

Device Interface Class GUID是Microsoft定义用来调用RegisterDeviceNotification时所使用的一类GUID,关于Microsoft所定义的所有Devcie Interface Class GUID 可以参看上面给出的网址,下面给出这类GUID的使用方法(用于动态检测某类USB设备的插入与拔出):

 1 //注册 某个USB设备接口类 事件
 2   GUID zz = {0xA5DCBF10, 0x6530, 0x11D2, 0x90, 0x1F, 0x00, 0xC0, 0x4F, 0xB9,
 3         0x51, 0xED};
 4     DEV_BROADCAST_DEVICEINTERFACE DevBroadcastDeviceInterface;
 5
 6     DevBroadcastDeviceInterface.dbcc_size = sizeof(DevBroadcastDeviceInterface);
 7     DevBroadcastDeviceInterface.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;
 8     DevBroadcastDeviceInterface.dbcc_classguid = zz;
 9     RegisterDeviceNotification(m_hWnd, &DevBroadcastDeviceInterface,
10         DEVICE_NOTIFY_WINDOW_HANDLE);

注:上述三种GUID没有任何实质上的关联,不能混为一谈。

  GUID(A5DCBF10-6530-11D2-901F-00C04FB951ED)写成代码为

  static const GUID x_guid = { 0xA5DCBF10, 0x6530, 0x11D2, 0x90, 0x1F, 0x00, 0xC0, 0x4F, 0xB9, 0x51, 0xED };

转载于:https://www.cnblogs.com/findstr/p/3518197.html

USB设备的插入检测相关推荐

  1. Intel Realsense USB设备的插入检测机制

    参考文章1:USB入门系列之五 -- USB设备的插入检测机制[图] 参考文章2:已弹出未拔下的USB设备能否重新连接? 关键点:devcon rescan 问题结果:未解决,尝试从 Intel Re ...

  2. USB设备的插入和弹出的监听以及软弹出可移动媒体(如Windows的移除USB设备) ....

    一.监听USB设备的插入和弹出 当USB设备插入或者弹出时,Windows会产生一条全局消息:WM_DEVICECHANGE 我们需要做的是,获得这条消息的wParam参数,如果为DBT_DEVICE ...

  3. USB 设备热插拔的检测

    系统检测USB 设备往往分为两个过程: 1. USB 设备已经插入, 打开软件. 此时需要枚举当前设备列表中所有的设备,并过滤指定的USB 设备. 2. 打开软件后, USB 热插拔 . 此时用WM_ ...

  4. USB主机是如何检测到设备的插入的呢?

    USB设备的插入检测机制 首先,在USB集线器的每个下游端口的D+和D-上,分别接了一个15K欧姆的下拉电阻到地.这样,在集线器的端口悬空时,就被这两个下拉电阻拉到了低电平.而在USB设备端,在D+或 ...

  5. 检测到USB设备插入写法1

    afx_msg LRESULT OnDeviceChange(WPARAM wParam, LPARAM lParam); ```cpp执行文件 LRESULT CResetBootDlg::OnDe ...

  6. usb插入检测系统、支持实时日志记录、邮箱报警

    usbsacn实现了监控设备是否有非法接入,如果有usb设备非法接入,则会报警,向目标账户发送邮件,并且在log中记录日志. 利用usb设备的一些固定信息,比如PID,VID检测指定USB设备或者所有 ...

  7. 一文入门USB设备的驱动编写方法

    摘要:本文介绍了USB设备驱动相关的基本知识结构,和编写驱动的基本步骤和流程.最后通过编写一个USB鼠标的驱动实力,讲述了简单字符型USB输入设备驱动的具体编写步骤,并给予了测试方法.文末附有完整程序 ...

  8. Android 监听USB设备插拔事件

    通过注册广播的方式监听USB设备 . 广播Action UsbManager.ACTION_USB_DEVICE_ATTACHED Usb设备插入或者挂载事件通知 UsbManager.ACTION_ ...

  9. linux判断usb进程命令,一种在Linux系统下审计USB设备历史使用情况的方法与流程...

    本发明涉及计算机审计技术领域,具体涉及一种在Linux系统下审计USB设备历史使用情况的方法. 背景技术: 如今,在linux系统中,对于USB设备的插入拔出事件,系统自身是不带有审计功能的,这使得普 ...

最新文章

  1. Nature子刊:宏基因组中挖掘原核基因组的分析流程
  2. altium designer 不自动清除回路 清除功能打开失效
  3. Honor7x能用鸿蒙系统吗,家庭无缝覆盖:Honor 荣耀 发布 分布式路由 和 路由2
  4. VC++的应用程序框架中各类之间的访问方法
  5. django学习之Model(四)MakingQuery
  6. git 与github 命令行操作与控制
  7. php编程 第一节,PHP第一节php简介_PHP
  8. 2016中国信息通信大数据大会召开在即,精彩看点提前揭晓
  9. JAVA451铝刀轮组怎么样,关于碳刀和铝刀轮组的区别
  10. python使用webdriver处理上传文件(使用AutoIt)
  11. 利用清华镜像、阿里云镜像与豆瓣镜像pip资源
  12. python2048游戏实训报告_Python 实现 2048 游戏
  13. 数字一阶低通滤波器立体解析
  14. Web—信息收集(非常全)
  15. linux学习日志,linux学习日记范文
  16. Win10设置每天定时运行某程序
  17. 用药安全,从娃娃抓起
  18. 电子邮件营销新趋势-自动化
  19. 极限与连续知识点总结_大一上学期《高等数学》知识整理-第一章 极限与连续...
  20. android iphone 记事本,手机上用什么记事本软件好?iPhone求推荐一款便签记事本app...

热门文章

  1. 20210325:力扣递归,回溯类型题目合集
  2. 20200504:力扣187周赛下
  3. kafka实现组内广播
  4. 物联网核心安全系列——智能监控安全问题
  5. 你已经是台成熟的vivo手机了,要自己学会打王者
  6. 是时候了!网易首谈AI加持的AR
  7. 如何让手机快速运行AI应用?这有份TVM优化教程
  8. 说说如何做oracle的SQL审核呢
  9. 在route-map中使用verify-availability确保路由可用性
  10. 小白该如何学习Linux操作系统(1)