如何通过系统API函数读取USB设备消息,获得设备加载及移除的消息.doc

如何通过系统API函数读取USB设备消息,获得设备加载及移除的消息.doc

ID:27873735

大小:51.00 KB

页数:6页

时间:2018-12-06

如何通过系统API函数读取USB设备消息,获得设备加载及移除的消息.doc_第1页
如何通过系统API函数读取USB设备消息,获得设备加载及移除的消息.doc_第2页
如何通过系统API函数读取USB设备消息,获得设备加载及移除的消息.doc_第3页
如何通过系统API函数读取USB设备消息,获得设备加载及移除的消息.doc_第4页
如何通过系统API函数读取USB设备消息,获得设备加载及移除的消息.doc_第5页
资源描述:

《如何通过系统API函数读取USB设备消息,获得设备加载及移除的消息.doc》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库

1、如何通过系统API函数读取USB设备消息,获得设备加载及移除的消息  有时应用需要检查USB设备的加载与卸除消息,如U盘的插上与拔出。一种办法是以轮询的方式调用设备接口尝试访问设备,但这样的做法效率很低,并且实时性不高。本文将介绍更为通用的方法,通过系统API函数RequestDeviceNotificaTIons,读取设备消息,获得设备加载及移除的消息。查找设备IClass值  每个USB设备都有一个IClass值,相当于在系统里的编号,IClass值可以通过查询板子注册表获得。以U盘为例:    如图,[HKEY

2、_LOCAL_MACHINEDriversUSBClientDrivers]下存有所有USB设备类型的信息。Mass_Storage_Class即U盘的IClass值为{A4E7EDDA-E575-4252-9D6B-4195D48BB865}  用代码表示即  GUIDguid={0xA4E7EDDA,0xE575,0x4252,{0x9D,0x6B, 0x41,0x95,0xD4,0x8B,0xB8,0x65}};  调用API监听设备消息  监听流程如下:  创建消息队列->绑定设备和消息队列->读取消息

3、队列  以U盘为例,代码如下  MSGQUEUEOPTIONSmsgopts;  //{A4E7EDDA-E575-4252-9D6B-4195D48BB865}    这个是USBstorage的  GUIDguid={0xA4E7EDDA,0xE575,0x4252,{0x9D,0x6B,0x41,0x95,0xD4,0x8B,0xB8,0x65}};  msgopts.dwSize    =sizeof(MSGQUEUEOPTIONS);  msgopts.dwFlags   =0;  msgopts.dwMa

4、xMessages=10;//?  msgopts.cbMaxMessage=sizeof(MYDEV);  msgopts.bReadAccess =TRUE;  HANDLEm_hReadMsgQ=CreateMsgQueue(NULL,&msgopts);  HANDLEhNoTIfy;  DWORDret;  hNotify=RequestDeviceNotifications(&guid,m_hReadMsgQ,TRUE);  flags=0;  size=0;  //while(true){  ret=W

5、aitForSingleObject(m_hReadMsgQ,INFINITE);  if(ret==WAIT_OBJECT_0)  {   while(ReadMsgQueue(m_hReadMsgQ,&detail,sizeof(detail),&size,1,&flags)==TRUE)    //参数“1”表示1ms超时  {  if(detail.d.fAttached)  {  wprintf(L”%s%s,f=0x%xr”,detail.d.szName,detail.d.fAttached?L”

6、appeared”:L”wasremoved”,flags);  }  Else  {  wprintf(L”%s%s,f=0x%xr”,detail.d.szName,detail.d.fAttached?L”appeared”:L”wasremoved”,flags);  }//if(detail.d.fAttached)  }//while  }//if(ret==WAIT_OBJECT_0)  //}while(true)  CloseMsgQueue(m_hReadMsgQ);  注意:如果是U盘,这

7、里读到的detail.d.szName是U盘在驱动中的名称,如“DSK1”,并非U盘盘符。  消息队列里读到的消息包括已加载设备的加载消息。  根据设备加载消息获得准确的设备信息  以U盘为例,它的设备类型为“DSK”,而SD卡,NANDFLASH的设备类型也是DSK,所以从设备消息里读出设备名如“DSK1”、“DSK2”后并不能直观确定哪个是U盘的设备名。  这时可以调用存储器相关API函数OpenStore根据设备名,查询U盘盘符等信息。  必要的头文件及lib库  #include“Storemgr.h”  #

8、pragmacomment(lib,”Storeapi.lib”)  封装OpenStore函数  增加超时是有必要的,因为设备加载消息来得更快,可能存储设备还没完全加载好。最长可能慢1ms,所以稍加延时即可。  HANDLEWINAPIOpenStoreEx(LPCTSTRszDeviceName,DWORDtimeout=3)  {  HA

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。