您的位置:首页 > 其它

UKEY通信各个应用的流程介绍--枚举设备

2015-03-24 09:48 260 查看
1 枚举设备:因为微软已经提供USB驱动程序开发API接口,所以使用此API接口,进行设备枚举。

标准函数接口:ULONG DEVAPI SKF_EnumDev(BOOL bPresent, LPSTR szNameList, ULONG *pulSize)

输入参数:bPresent  [IN]  为 TRUE 表示取当前设备状态为存在的设备列表。为 FALSE 表示取当前驱动支持的设备列表。

                    szNameList  [OUT]  设备名称列表。如果该参数为 NULL,将由 pulSize 返回所需要的内存空间大小。每个设备的名称以单个‘\0’结束,以双‘\0’表示列表的结束。

                    pulSize  [IN ,OUT]  输入时表示设备名称列表的缓冲区长度,输出时表示szNameList 所占用的空间大小。

实现:分为HID通信,USB Mass Storage,SCSI

1:HID通信,SCSI:两者区别在于设备类别不一样 ,也就是GUID值不同,例子中为HID通信

HidD_GetHidGuid(&HID_Guid);获得HID的GUID值;

然后通过hDevInfo=SetupDiGetClassDevs(&HID_Guid,NULL,NULL,DIGCF_PRESENT|DIGCF_DEVICEINTERFACE);函数获得满足该GUID值的设备列表

或者通过hDevInfo=SetupDiGetClassDevs(&GUID_DEVINTERFACE_CDROM,NULL,NULL,DIGCF_PRESENT|DIGCF_DEVICEINTERFACE);函数获得满足SCSI通信协议的GUID值的设备列表。

死循环遍历列表查找满足我们的设备,HID设备通过PID,VID比对查找,SCSI也通过这两个值,只不过写法不同而已

遍历过程:SetupDiEnumDeviceInterfaces枚举设备列表中第n个设备,并获得该设备的设备信息

                    SetupDiGetDeviceInterfaceDetail第一次调用,通过获得的设备信息,获取该设备在PC端的路径信息的字节大小

                    SetupDiGetDeviceInterfaceDetail第二次调用之前,要给该存储路径的数据结构分配内存,然后获取路径信息

                    CreateFile使用该函数创建设备句柄(上面得到的设备路径)

    HidD_GetAttributes获得HID设备的HID属性数据结构

    最后进行VID,PID值比较,判断是否为我们的设备,是的话记录句柄然后调用获取设备信息,获得设备标签返回即可。

最主要的功能是获取设备句柄,因为后面所有的操作都是基于此处的设备句柄,拥有句柄后才能进行通信;

注意函数的参数,输出为连接的所有设备名称列表,因此需要下面ConnectDevice函数输入某设备名称,然后进行连接。

连接设备同样使用这些API函数,区别在于连接设备时,函数的输入参数中需要输入设备名称,然后和寻找到的设备的设备信息中的标签进行比对,相同则成功连接,不相同则不能成功连接。

连接设备函数原型:ULONG DEVAPI SKF_ConnectDev (LPSTR szName, DEVHANDLE *phDev)

功能描述  通过设备名称连接设备,返回设备的句柄。

参数  szName  [IN]  设备名称。
  phDev  [OUT]  返回设备操作句柄。
  返回值  SAR_OK:  成功。
  其他:    错误码。

实现过程同枚举实现部分
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息