当前位置:诺佳网 > 电子/半导体 > 便携设备 >

如何通过系统API函数读取USB设备消息,获得设备

时间:2018-08-31 | 栏目:便携设备 | 点击:

有时应用需要检查USB设备的加载与卸除消息,如U盘的插上与拔出。一种办法是以轮询的方式调用设备接口尝试访问设备,但这样的做法效率很低,并且实时性不高。本文将介绍更为通用的方法,通过系统API函数RequestDeviceNotifications,读取设备消息,获得设备加载及移除的消息。

查找设备IClass值

每个USB设备都有一个IClass值,相当于在系统里的编号,IClass值可以通过查询板子注册表获得。以U盘为例:

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

如图,[HKEY_LOCAL_MACHINE\Drivers\USB\ClientDrivers]下存有所有USB设备类型的信息。Mass_Storage_Class即U盘的IClass值为{A4E7EDDA-E575-4252-9D6B-4195D48BB865}

用代码表示即

GUID guid = { 0xA4E7EDDA, 0xE575, 0x4252, { 0x9D, 0x6B,  0x41, 0x95, 0xD4, 0x8B, 0xB8, 0x65 } };

调用API监听设备消息

监听流程如下:

创建消息队列->绑定设备和消息队列->读取消息队列

以U盘为例,代码如下

MSGQUEUEOPTIONS msgopts;

//{A4E7EDDA-E575-4252-9D6B-4195D48BB865}        这个是USB storage的

GUID guid = { 0xA4E7EDDA, 0xE575, 0x4252, { 0x9D, 0x6B, 0x41, 0x95, 0xD4, 0x8B, 0xB8, 0x65 } };

msgopts.dwSize        = sizeof(MSGQUEUEOPTIONS);

msgopts.dwFlags       = 0;

msgopts.dwMaxMessages = 10; //?

msgopts.cbMaxMessage = sizeof(MYDEV);

msgopts.bReadAccess   = TRUE;

HANDLE m_hReadMsgQ = CreateMsgQueue(NULL, &msgopts);

HANDLE hNotify;

DWORD ret;

hNotify = RequestDeviceNotifications(&guid, m_hReadMsgQ, TRUE);

flags = 0;

size = 0;

//while(true){

ret = WaitForSingleObject(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%x\r\n", detail.d.szName, detail.d.fAttached ? L"appeared" : L"was removed", flags);

}

Else

{

wprintf(L"%s %s,f=0x%x\r\n", detail.d.szName, detail.d.fAttached ? L"appeared" : L"was removed", flags);

}// if (detail.d.fAttached)

}//while

}//if(ret == WAIT_OBJECT_0)

/

您可能感兴趣的文章:

相关文章