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: 成功。
其他: 错误码。
实现过程同枚举实现部分
标准函数接口: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: 成功。
其他: 错误码。
实现过程同枚举实现部分
相关文章推荐
- UKEY通信各个应用的流程介绍--枚举设备
- UKEY通信各个应用的流程介绍--设备认证
- UKEY通信各个应用的流程介绍--设备认证
- UKEY通信各个应用的流程介绍--初始化设备
- UKEY通信各个应用的流程介绍--初始化设备
- UKEY通信各个应用的流程介绍--生成RSA签名密钥对
- UKEY通信各个应用的流程介绍--签名与验签
- UKEY通信各个应用的流程介绍--生成RSA签名密钥对
- UKEY通信各个应用的流程介绍--导入RSA加密密钥对
- UKEY通信各个应用的流程介绍--数据加解密
- UKEY通信各个应用的流程介绍--签名与验签
- UKEY通信各个应用的流程介绍--数据加解密
- UKEY通信各个应用的流程介绍--导入RSA加密密钥对
- 虚拟字符设备的完整制作过程 模块源代码,应用,编译所有步骤均有详细介绍
- 【Android开发经验】移动设备的“声波通信/验证”的实现——SinVoice开源项目介绍(一)
- linux /dev 常见特殊设备介绍与应用
- 【Android开发经验】移动设备的“声波通信/验证”的实现——SinVoice开源项目介绍(三)
- 【Android开发经验】移动设备的“声波通信/验证”的实现——SinVoice开源项目介绍(二)
- linux /dev 常见特殊设备介绍与应用[loop,null,zero,full,random]
- linux /dev 常见特殊设备介绍与应用