发明内容
鉴于现有技术的不足,本发明提供了一种实现HID/SCSI设备PC/SC接口的系统和方法,在本发明中,通过位于应用层的伺服模块实现对HID/SCSI设备的灵活支持,从而满足实现应用程序与HID/SCSI设备的数据通信,具体实现技术方案,如下。
一方面,提供了一种实现HID/SCSI设备PC/SC接口的系统,该系统包括:伺服模块、PC/SC驱动模块、设备管理模块和应用程序模块;
所述伺服模块,用于将计算机获取的所述HID/SCSI设备的信息上报给所述PC/SC驱动模块,并提供所述HID/SCSI设备和所述PC/SC驱动模块之间的数据交互通道;
所述PC/SC驱动模块,用于将所述伺服模块报告的所述HID/SCSI设备的信息,上报给所述设备管理模块,并提供所述伺服模块和所述设备管理模块之间的数据交互通道;
所述设备管理模块,用于将所述PC/SC驱动模块报告的所述HID/SCSI设备的信息,上报给所述应用程序模块;并向所述应用程序模块提供访问所述HID/SCSI设备的接口信息;
所述应用程序模块,用于根据所述设备管理模块报告的所述HID/SCSI设备的信息和提供的访问所述HID/SCSI设备的接口信息,访问所述HID/SCSI设备。
其中,所述伺服模块位于所述系统的应用层,所述伺服模块包括:伺服函数库单元和监控单元;
伺服函数库单元,用于通过提供HID接口设备描述符/SCSI接口设备描述符,进行HID/SCSI协议处理,获取所述HID/SCSI设备的信息及实现数据交互;其中,所述HID接口设备描述符,用于向所述计算机声明设备类型具体为HID设备类型,并解析处理HID命令,所述SCSI接口设备描述符,用于向所述计算机声明设备类型具体为SCSI设备类型,并解析处理SCSI命令;
监控单元,用于监控所述HID/SCSI设备和所述计算机的连接状态。
其中,在获取所述HID/SCSI设备和所述计算机的连接状态实现时,可以采用回调函数的方式和注册表监控方式,相应地,所述监控单元具体为:
第一监控子单元,用于实现所述伺服模块所提供的伺服程序通过所述回调函数获取所述HID/SCSI设备与所述计算机的连接状态;或,
第二监控子单元,用于监控注册表,实现所述伺服模块所提供的伺服程序通过对所述注册表指定位置的监控获取所述HID/SCSI设备与所述计算机的连接状态。
其中,所述伺服函数库单元至少为一个,当所述伺服函数库单元为多个时,每个伺服函数库单元用于通过各自提供的HID接口设备描述符/SCSI接口设备描述符,进行HID/SCSI协议处理,获取各自对应的HID/SCSI设备的信息及实现数据交互。
进一步地,所述设备管理模块还包括:缓冲存储单元,所述缓冲存储单元用于缓存系统当前可用的智能卡SC协议处理器的标识。
另一方面,提供了一种实现HID/SCSI设备PC/SC接口的方法,该方法包括:
位于计算机应用层的伺服程序创建内核对象并加载伺服函数库,所述伺服函数库将创建的内核对象发送给PC/SC驱动程序;
当所述伺服程序获知HID/SCSI设备与所述计算机建立连接后,通过所述PC/SC驱动程序向计算机设备管理程序上报所述HID/SCSI设备的信息;
所述计算机设备管理程序根据所述HID/SCSI设备的信息,判断所述HID/SCSI设备符合访问要求后,所述PC/SC驱动程序将接收的计算机应用程序下发的访问所述HID/SCSI设备的指令,通过所述内核对象发送给所述伺服程序;
所述伺服程序接收所述访问指令,调用伺服函数库,获取所述伺服函数库中调用HID/SCSI接口指令的代码信息;
所述应用程序通过所述PC/SC驱动程序和伺服程序,经PC/SC接口对所述HID/SCSI设备进行访问。
其中,该方法中位于计算机应用层的伺服程序创建内核对象并加载伺服函数库之前,还包括:
计算机启动,加载PC/SC驱动程序信息至计算机内存;
计算机设备管理程序从所述计算机内存获取系统中的PC/SC驱动程序信息;
所述PC/SC驱动程序向所述设备管理程序注册协议处理器的标识;
相应地,所述判断所述HID/SCSI设备符合访问要求,具体为:
根据所述HID/SCSI设备的信息中携带的HID/SCSI设备的协议处理模块的标识,判断所述标识是否和注册的标识匹配,如果是,则所述HID/SCSI设备符合访问要求;否则,所述HID/SCSI设备不符合访问要求。
其中,经PC/SC接口对所述HID/SCSI设备进行访问的步骤之后,所述方法还包括:
所述计算机中的应用层的伺服程序获取HID/SCSI设备中的数据,通过内核对象将所述数据发送给所述PC/SC驱动程序;
所述PC/SC驱动程序通过所述设备管理程序将所述HID/SCSI设备中的数据发送给所述应用程序。
其中,上述经PC/SC接口对所述HID/SCSI设备进行访问具体为:
打开与所述HID/SCSI设备的连接;或,
关闭与所述HID/SCSI设备的连接;或,
获取所述HID/SCSI设备的复位应答(即ATR);或,
与所述HID/SCSI设备进行APDU交互。
上述本发明实施例提供的方法中,所述伺服函数库为多个时,每个伺服函数库用于通过各自提供的HID接口设备描述符/SCSI接口设备描述符,进行HID/SCSI协议处理,获取各自对应的HID/SCSI设备的信息,实现数据交互。
进一步地,所述伺服程序加载所述伺服函数库的方法还可以为:创建文件对象方式;
相应地,所述位于计算机应用层的伺服程序创建内核对象并加载伺服函数库,所述伺服函数库将创建的内核象发送给PC/SC驱动程序的步骤,具体为:
位于计算机应用层的伺服程序创建文件对象并加载伺服函数库,所述伺服函数库将创建的文件对象发送给PC/SC驱动程序;
相应地,所述PC/SC驱动程序将接收的计算机应用程序下发的访问所述HID/SCSI设备的指令,通过所述内核对象发送给伺服程序的步骤,具体为:
所述PC/SC驱动程序将接收的计算机应用程序下发的访问所述HID/SCSI设备的指令,通过所述文件对象发送给伺服程序;
相应地,所述位于计算机应用层的伺服程序创建文件对象并加载伺服函数库之前,还包括:
计算机启动加载PC/SC驱动程序信息至计算机内存;
计算机设备管理程序从计算机内存获取系统中的PC/SC驱动程序信息;
所述PC/SC驱动程序向所述设备管理程序注册协议处理器的标识。
当采用创建文件对象方式,实现伺服程序加载所述伺服函数库时,相应地,方法还包括:
计算机中的应用层的伺服程序获取HID/SCSI设备中的数据,通过文件对象将所述数据发送给所述PC/SC驱动程序;
所述PC/SC驱动程序通过所述设备管理程序将所述HID/SCSI设备中的数据发送给所述应用程序。
所述伺服程序向计算机设备管理程序上报所述HID/SCSI设备的信息之前,还包括:所述伺服程序监控所述HID/SCSI设备与所述计算机的连接状态,具体方法为:
通过回调函数的方式;或,
通过注册表监控的方式。
相应地,当采用回调函数的方式时,所述伺服程序通过所述回调函数获取所述HID/SCSI设备与所述计算机的连接状态;或;
当采用通过注册表监控的方式时,所述伺服程序通过对所述注册表指定位置的监控获取所述HID/SCSI设备与所述计算机的连接状态。
本发明实施例提供的技术方案的有益效果是:
通过将HID/SCSI接口指令从PC/SC驱动程序中分离出来,利用伺服模块来调用HID/SCSI接口指令,为计算机提供了一条访问HID/SCSI设备的通道,进而实现HID/SCSI设备通过PC/SC接口与计算机进行通信的过程,由于伺服模块中的伺服程序运行在系统应用层,因此伺服程序的编写、修改以及维护都较为简单,伺服程序的运行过程中发生错误,不会导致整个系统的崩溃;当需要支持新的HID/SCSI设备时,只需通过更换伺服程序就可以实现计算机系统对新设备的兼容,大大增强了系统的柔韧性和扩展性。另外,设计人员可以利用伺服函数库的功能使程序不至于太过巨大,比如,多个应用程序可以共享伺服函数库中的函数,其中,伺服函数库以一种自然的方式将一个大的应用程序划分为几个小的部分,有利于内部的分工与合作,各个部分可以独立升级等等。
具体实施方式
为使本发明的目的、技术方案和优点更加清楚,下面将结合附图对本发明实施方式作进一步地详细描述,但不作为对本发明的限定。
实施例1
本发明实施例提供了一种实现HID/SCSI设备PC/SC接口的系统,本实施例中,该系统具体为计算机1,其中,HID/SCSI设备具体以USB Token为例进行说明,其中,该USB Token为一种USB(Universal Serial BUS,通用串行总线)接口的硬件设备,通过USB口实现与电脑相连接,该USB Token内嵌芯片,可将信息安全地储存在该内嵌芯片中,且该USB Token内置协议处理器,无需单独的读卡器,只要插入到计算机、键盘及显示器的USB接口上,即可实现该USB Token的使用。参见图1,其中,
计算机1包括:伺服模块11、PC/SC驱动模块12、设备管理模块13、应用程序模块14;
USB Token 2包括:USB接口模块21、协议处理模块22、智能卡芯片模块23。如前文所述,该USB Token 2为HID/SCSI接口的设备;
下面将详细针对上述各功能模块的作用进行说明:
针对USB Token 2而言,其中,
USB接口模块21用于实现USB Token 2和计算机1的连接,在本实施例中,USB接口模块21实现时,可以采用USB接口芯片;
协议处理模块22用于与智能卡芯片模块23中运行的卡操作系统进行数据交互,获取智能卡芯片模块23中的数据信息;
智能卡芯片模块23用于存储用户的密钥、数字证书及密文信息等数据,利用智能卡芯片模块23内置的密码学算法能够实现对用户身份的认证;其中,该智能卡芯片模块23具体设计实现时,可以为基于安全设计的智能卡芯片。
针对计算机1而言,其中,
伺服模块11,用于将USB Token 2的信息报告给PC/SC驱动模块,并为上下两层模块间的数据交互提供通道,该伺服模块位于计算机的应用层;其中,该伺服模块11具体可以包括:伺服函数库单元111和监控单元112:
该伺服模块11通过调用伺服函数库单元111来获取HID/SCSI设备的信息(本实施例具体为USB Token 2的信息)及实现数据交互;
监控单元112,用于监控USB Token 2与计算机模块的连接状态;可以通过该监控单元112获知,该USB Token 2是否与计算机模块建立了连接。
如图1所示,其中,伺服函数库单元111包含HID协议处理区和SCSI协议处理区,HID协议处理区用于进行HID协议处理,获取HID设备的信息和实现数据交互,HID协议处理区内置有HID接口设备描述符,用于向计算机1声明其自身为HID设备类型,并解析处理HID命令;SCSI协议处理区用于进行SCSI协议处理,获取SCSI设备的信息及实现数据交互;SCSI协议处理区内置有SCSI接口设备描述符,用于向计算机1声明其自身为SCSI设备类型,并解析处理SCSI命令。
上述,描述符是数据结果或信息的格式化块,用于使计算机1获知USB Token 2的具体设备类型(如,HID设备类型或SCSI设备类型),其中,每个描述符包含了关于USB Token 2的整体信息或者一个元素的信息,具体如下:
按照HID协议标准,符合HID接口标准的设备其描述符的特征是:在接口描述符中,字节0是描述符的字节长度,值为09h;字节1是描述符类型,值为04h;字节4是支持的终端号,值为01h;字节5是类代码,值为03h;字节6是子类代码,值为00h;字节7是协议代码,值为00h。在类型描述符中,字节0是描述符的字节长度;字节1为HID类,值为21h;字节2是HID规范发布号,它采用二进制编码的十进制格式,比如1.0版本是0100h,1.1版本是0110h。符合HID接口标准的设备的其它描述符中的字节,如设备描述符、配置描述符中的字节以及上述接口描述符和类型描述符中的其它字节仍按照USB协议中的规定设备。
按照SCSI协议标准,符合USB-SCSI接口标准的设备其描述符的特征是:在接口描述符中,字节0是描述符的字节长度,值为09h;字节1是描述符类型,值为04h;字节4是支持的终端号;字节5是类代码,值为08h;字节6为子类代码,值为00h;字节7是协议代码,值为50h。在类型描述符中,字节0是描述符的字节长度,字节2是SCSI规范的版本号。符合SCSI接口标准的设备的其它描述符中的字节,如设备描述符、配置描述符中的字节以及上述接口描述符和类型描述符中的其它字节仍按照USB协议中的规定设置。
PC/SC驱动模块12,用于将通过伺服模块11获取的USB Token 2的信息报告给设备管理模块13,并为上下两层模块的数据交互提供通道。
设备管理模块13,用于将通过PC/SC驱动模块12获取的USB Token 2的信息报告给应用程序模块14,并向应用程序模块14提供访问USB Token 2的接口。其中,该设备管理模块是计算机1的系统组件,该设备管理模块13还包括缓冲存储单元131,该缓冲存储单元131用于存储系统当前可用的PC/SC协议处理器的名称,即向系统注册的PC/SC协议处理器的名称。
应用程序模块14,用于获取到通过设备管理模块13获取的USB Token 2的信息后,访问USB Token 2,与USB Token 2进行数据交互。
其中,在获取HID/SCSI设备和计算机的连接状态实现时,可以采用回调函数的方式和注册表监控方式,相应地,监控单元具体为:
第一监控子单元,用于实现伺服程序通过回调函数获取HID/SCSI设备与计算机的连接状态;或,
第二监控子单元,用于监控注册表,实现伺服程序通过对注册表指定位置的监控获取HID/SCSI设备与计算机的连接状态。
综上所述,本发明实施例提供的实现HID/SCSI设备PC/SC接口的系统,将HID/SCSI接口指令从PC/SC驱动程序中分离出来,通过伺服模块来调用HID/SCSI接口指令,为计算机提供了一条访问HID/SCSI设备的通道,进而实现HID/SCSI设备通过PC/SC接口与计算机进行通信的过程,由于伺服模块中的伺服程序运行在系统应用层,因此伺服程序的编写、修改以及维护都较为简单,伺服程序的运行过程中发生错误,不会导致整个系统的崩溃;当需要支持新的HID/SCSI设备时,只需通过更换伺服程序就可以实现计算机系统对新设备的兼容,大大增强了系统的柔韧性和扩展性。另外,设计人员可以利用伺服函数库的功能使程序不至于太过巨大,比如,多个应用程序可以共享伺服函数库中的函数,其中,伺服函数库以一种自然的方式将一个大的应用程序划分为几个小的部分,有利于内部的分工与合作,各个部分可以独立升级等等。
实施例2
如图2所示,本发明实施例提供了一种通过使用不同的伺服模块实现对多个USB Token进行访问的系统,与实施例1的区别在于,在本实施例中,伺服模块11包括多个伺服函数库单元。
计算机1通过调用不同的伺服函数库单元来实现与多个USB Token的数据通信,每个伺服函数库单元中都包括各自独立的HID协议处理区和SCSI协议处理区。
如图2所示,在本实施例中,第一伺服函数库单元关联USB Token1、第二伺服函数库单元关联USB Token2、第三伺服函数库单元关联USB Token3,伺服模块11通过调用不同的伺服函数库单元分别与不同的USB Token进行数据通信。
相应地,监控单元的作用是监控各USB Token和计算机的连接状态。
综上所述,本发明实施例提供的系统,进一步地实现了系统对多个USB Token进行访问的功能,提高了系统的访问性能,方便了用户的操作使用。
实施例3
参见图3,本发明实施例提供了一种实现HID/SCSI设备PC/SC接口的设备,与本发明实施例1提供的系统相应,该设备包括:伺服模块11、PC/SC驱动模块12、设备管理模块13、应用程序模块14;下面将详细针对上述各功能模块的作用进行说明:
伺服模块11,用于将USB Token 2的信息报告给PC/SC驱动模块,并为上下两层模块间的数据交互提供通道,该伺服模块位于该设备的应用层。其中,该伺服模块11具体可以包括:伺服函数库单元111和监控单元112:
该伺服模块11通过调用伺服函数库单元111来获取HID/SCSI设备的信息(本实施例具体为USB Token 2的信息)及实现数据交互;
监控单元112,用于监控USB Token 2与该设备的连接状态;可以通过该监控单元112获知,该USB Token 2是否与该设备建立了连接。
如图1所示,其中,伺服函数库单元111包含HID协议处理区和SCSI协议处理区,HID协议处理区用于进行HID协议处理,获取HID设备的信息和实现数据交互,HID协议处理区内置有HID接口设备描述符,用于向该设备1声明其自身为HID设备类型,并解析处理HID命令;SCSI协议处理区用于进行SCSI协议处理,获取SCSI设备的信息及实现数据交互;SCSI协议处理区内置有SCSI接口设备描述符,用于向该设备1声明其自身为SCSI设备类型,并解析处理SCSI命令。
上述,描述符是数据结果或信息的格式化块,用于使该设备1或获知USB Token 2的设备类型(如,HID设备类型或SCSI设备类型),其中,每个描述符包含了关于USB Token 2的整体信息或者一个元素的信息,具体如下:
按照HID协议标准,符合HID接口标准的设备其描述符的特征是:在接口描述符中,字节0是描述符的字节长度,值为09h;字节1是描述符类型,值为04h;字节4是支持的终端号,值为01h;字节5是类代码,值为03h;字节6是子类代码,值为00h;字节7是协议代码,值为00h。在类型描述符中,字节0是描述符的字节长度;字节1为HID类,值为21h;字节2是HID规范发布号,它采用二进制编码的十进制格式,比如1.0版本是0100h,1.1版本是0110h。符合HID接口标准的设备的其它描述符中的字节,如设备描述符、配置描述符中的字节以及上述接口描述符和类型描述符中的其它字节仍按照USB协议中的规定设备。
按照SCSI协议标准,符合USB-SCSI接口标准的设备其描述符的特征是:在接口描述符中,字节0是描述符的字节长度,值为09h;字节1是描述符类型,值为04h;字节4是支持的终端号;字节5是类代码,值为08h;字节6为子类代码,值为00h;字节7是协议代码,值为50h。在类型描述符中,字节0是描述符的字节长度,字节2是SCSI规范的版本号。符合SCSI接口标准的设备的其它描述符中的字节,如设备描述符、配置描述符中的字节以及上述接口描述符和类型描述符中的其它字节仍按照USB协议中的规定设置。
其中,在获取HID/SCSI设备和计算机的连接状态实现时,可以采用回调函数的方式和注册表监控方式,相应地,监控单元具体为:
第一监控子单元,用于实现伺服程序通过回调函数获取HID/SCSI设备与计算机的连接状态;或,
第二监控子单元,用于监控注册表,实现伺服程序通过对注册表指定位置的监控获取HID/SCSI设备与计算机的连接状态。
PC/SC驱动模块12,用于将通过伺服模块11获取的USB Token 2的信息报告给设备管理模块13,并为上下两层模块的数据交互提供通道。
设备管理模块13,用于将通过PC/SC驱动模块12获取的USB Token 2的信息报告给应用程序模块14,并向应用程序模块14提供访问USB Token 2的接口。其中,该设备管理模块是该设备1的系统组件,该设备管理模块13还包括缓冲存储单元131,该缓冲存储单元131用于存储系统当前可用的PC/SC协议处理器的名称,即向系统注册的PC/SC协议处理器的名称。
应用程序模块14,用于获取到通过设备管理模块13获取的USB Token 2的信息后,访问USB Token 2,与USB Token 2进行数据交互。
进一步地,本发明实施例提供的设备的伺服模块11包括多个伺服函数库单元。通过调用不同的伺服函数库单元来实现与多个USB Token的数据通信,每个伺服函数库单元中都包括各自独立的HID协议处理区和SCSI协议处理区,监控单元的作用相应地,便是监控各USBToken和计算机的连接状态。从而,进一步地实现了设备对多个USB Token进行访问的功能,提高了设备的访问性能,方便了用户的操作使用。
综上所述,本发明实施例提供的实现HID/SCSI设备PC/SC接口的设备,将HID/SCSI接口指令从PC/SC驱动程序中分离出来,通过伺服模块来调用HID/SCSI接口指令,为该设备提供了一条访问HID/SCSI设备的通道,进而实现HID/SCSI设备通过PC/SC接口与该设备进行通信的过程,由于伺服模块中的伺服程序运行在系统应用层,因此伺服程序的编写、修改以及维护都较为简单,伺服程序的运行过程中发生错误,不会导致整个系统的崩溃;当需要支持新的HID/SCSI设备时,只需通过更换伺服程序就可以实现该设备系统对新设备的兼容,大大增强了系统的柔韧性和扩展性。另外,设计人员可以利用伺服函数库的功能使程序不至于太过巨大,比如,多个应用程序可以共享伺服函数库中的函数,其中,伺服函数库以一种自然的方式将一个大的应用程序划分为几个小的部分,有利于内部的分工与合作,各个部分可以独立升级等等。
实施例4
参见图4,本发明实施例提供了一种实现HID/SCSI设备PC/SC接口的方法,与本发明实施例1提供的系统相应,本实施例中,HID/SCSI设备仍以USB Token为例进行说明,其中,该USB Token为一种USB(Universal Serial BUS,通用串行总线)接口的硬件设备,通过USB口为其与电脑相连接,该USB Token内嵌芯片,可将信息安全地储存在该内嵌芯片中,且该USB Token内置协议处理器无需单独的读卡器,只要插入到计算机、键盘及显示器的USB接口上,即可实现该USB Token的使用。该方法内容如下:
步骤401:计算机启动,加载PC/SC驱动程序信息至计算机内存;
其中,该步骤中,本领域技术人员可以获知,在计算机启动的时候,会加载操作系统运行的相关程序,由于PC/SC驱动程序位于操作系统的内核程序中,所以同样会实现该PC/SC驱动程序的加载,于是,在计算机启动时实现加载PC/SC驱动程序至计算机内存。
步骤402:设备管理程序从计算机内存获取系统中的PC/SC驱动程序信息;
其中,由于在步骤401中计算机内存中已经保存了加载成功的PC/SC驱动程序信息,即该加载成功的PC/SC驱动程序信息具体为在操作系统中进行注册的PC/SC驱动程序信息,该步骤402在具体实现时,可以通过设备管理程序采用枚举计算机内存中的驻留的各程序的形式,获取到所需要的该PC/SC驱动程序信息。
步骤403:PC/SC驱动程序向设备管理器中的设备管理程序注册协议处理器的名称;
其中,该步骤是为了确保后续只有匹配了在该设备管理程序中注册的协议处理器的USBToken,才能实现数据的读取操作。
为了便于说明,本发明实施例以PC/SC驱动程序向设备管理程序注册协议处理器的名称为USB Token的协议处理器名称为例,即本发明实施例提供的USB Token的协议处理器符合该计算机的读取数据的要求。
步骤404:伺服程序初始化,创建内核对象加载伺服函数库,并伺服函数库将内核对象下发给PC/SC驱动程序。该伺服程序位于计算机系统的应用层;
步骤405:监控程序判断USB Token是否与计算机建立连接,如果是,则执行步骤406;否则,执行步骤416;
其中,在该步骤中判断USB Token是否与计算机建立连接可以采用如下的方式:
采用回调函数的方式,实现伺服程序通过回调函数获取HID/SCSI设备与计算机的连接状态;
采用监控注册表的方式,通过监控注册表,实现伺服程序通过对注册表指定位置的监控获取HID/SCSI设备与计算机的连接状态。
本发明实施例不限制实现判断USB Token是否与计算机建立连接时所采用的具体方式。
步骤406:伺服程序将USB Token的信息报告给PC/SC驱动程序;
其中,在步骤406中,USB Token的信息主要为USB Token中协议处理器的信息。
步骤407:PC/SC驱动程序将USB Token的信息报告给计算机系统的设备管理器;
由于伺服函数库在初始化过程中,首先创建内核对象,伺服函数库通过函数将内核对象下发给PC/SC驱动程序,以进行后续的数据交互。具体为:
//创建发送数据的内涵对象
hEvents.hEventSnd=CreateEvent(NULL,FALSE,FALSE,″FTSmcSnd″);
//创建接受数据的内涵对象
hEvents.hEventRcv=CreateEvent(NULL,FALSE,FALSE,″FTSmcRcv″);
伺服函数库通过DeviceIoControl()将内核对象下发给PC/SC驱动程序,以进行后续的数据交互。
DeviceIoControl(
hFile, //设备句柄
IOCTL_FTSMC_SET_EVENTS, //IO控制代码
&hEvents, //输入缓冲区
sizeof(FTSMC_SHARED_EVENTS),//输入数据长度
NULL, //输出缓冲区
0, //输出缓冲区大小.
&dwReturn, //实际输出数据长度
NULL
);
步骤408:伺服程序等待内核对象以接收或发送指令数据;
//驱动层:设置事件,通知伺服程序,有数据下发,请接受
KeSetEvent(hEventSnd,0,FALSE);
//伺服程序
while(true){
//等待内核对象事件
if(WAIT_OBJECT_0+1==WaitForMultipleObjects(2,handles,FALSE,
INFINITE))
return 0;//退出
//获取内核驱动对象携带的数据
ReadFile(g_hFile,g_snd,sizeof(g_snd),&dwRead,NULL);
//根据内核对象携带的信息,对数据做不同的处理
Switch(KernelFunc)
{
Case 0:
… …
break;
Default:
… …
break;
}
//将处理结果反馈给内核驱动对象
WriteFile(g_hFile,g_rcv,rcvLen,&dwWritten,NULL);
//告知驱动对象,可以获取返回的数据了
SetEvent(hEventRcv);
}
步骤409:PC/SC驱动程序接收到计算机的应用程序下发的访问USB Token的指令;
步骤410:PC/SC驱动程序将应用程序下发的访问USB Token的指令通过内核对象报告给伺服程序;
步骤411:伺服程序接收到访问USB Token的指令后,调用伺服函数库,运行伺服函数库中的打开、启用、查询或关闭指令;
打开:
if(!InitFTSmcLib())
{
//初始化失败
g_LibStatus=STATUS_LIB_INIT_FAILED;
return FALSE;
}
else
{
//初始化成功
g_LibStatus=STATUS_LIB_INIT_OK;
}
启用:
if(!EnableFTSmcLib())
{
//操作失败
g_LibStatus=STATUS_LIB_ENABLE_FAILED;
return FALSE;
}
else
{
//操作成功
g_LibStatus=STATUS_LIB_ENABLE_OK;
}
查询:
if(!QureyFtSmcLib(szTokenVID,nStatus))//查询指定的设备状态
{
//操作失败
g_LibStatus=STATUS_LIB_QUERY_FAILED;
return FALSE;
}
else
{
//操作成功
g_LibStatus=STATUS_LIB_QUERY_OK;
}
关闭:
if(!FinalizeFTSmcLib())
{
//操作失败
g_LibStatus=STATUS_LIB_CLOSE_FAILED;
return FALSE;
}
else
{
//操作成功
g_LibStatus=STATUS_LIB_CLOSE_OK;
}
步骤412:伺服函数库向伺服程序提供调用HID/SCSI接口指令的代码;
if(!TransmitFTSmcLib(pInput,nInput,
pOutput,&nOutLen,
nOpMode)
)
{
//操作失败
g_LibStatus=STATUS_LIB_TRANSMIT_FAILED;
return FALSE;
}
else
{
//操作成功
g_LibStatus=STATUS_LIB_TRANSMIT_OK;
}
步骤413:应用程序通过PC/SC驱动程序及伺服程序经PC/SC接口对USB Token进行访问;其中,访问具体包括:
1)打开与USB Token的连接;
2)关闭与USB Token的连接;
3)获取USB Token的复位应答,即ATR(Answer To Reset,响应复位);
4)与USB Token进行APDU交互。其中,APDU(Application Protocol Data Unit,应用协议数据单元)在OSI参考模型的第七层,是应用层进行信息交换时所使用的基本信息单元。
其中,打开与USB Token的连接时,可以采用如下方式:
SCardConnect(ContextHandle, //所述设备管理器上下文句柄
strFTSmcReader, //所述PC/SC驱动名
SCARD_SHARE_SHARED,//访问模式
SCARD_PROTOCOL_T0|SCARD_PROTOCOL_T1,//通讯协议选择
&CardHandle, //返回的卡句柄
&ActiveProtocol); //返回的当前卡片应用协议
关闭与USB Token的连接时,可以采用如下方式:
SCardDisconnect(CardHandle,SCARD_EJECT_CARD);
获取USB Token的复位应答(取ATR)时,可以采用如下方式:
SCardStatus(CardHandle, //卡句柄
strFTSmcReader, //所述PC/SC驱动名
&dwLength, //数据长度
&dwCardState, //卡状态
&dwActiveProtocol, //当前协议
pbyATR, //复位应答缓冲区
&dwATRLength);//实际应答信息长度
执行与USB Token进行APDU数据交互时,可以采用如下方式:
SCardTransmit(CardHandle, //卡句柄
&IO_Request, //SCARD_IO_REQUEST信息
(PUCHAR)SendData, //下发的指令缓冲区
nCmdLen,//指令缓冲区大小
NULL, //返回的SCARD_IO_REQUEST信息
(PUCHAR)ReceiveData,//接收数据缓冲区
&nRespLen); //接收数据缓冲区大小
步骤414:伺服程序获取USB Token中的数据后,通过内核对象将该数据传送给PC/SC驱动程序;可以采用如下方式:
//驱动层:等待数据返回
KeWaitForSingleObject(
hEventRcv,
Executive,
KernelMode,
FALSE,
pDueTime
);
//驱动层:数据返回后,将数据反馈给上层缓冲区
RtlCopyMemory(……);
//
步骤415:PC/SC驱动程序通过系统设备管理器将USB Token中数据传送给应用程序。
当USB Token与计算机建立联系后,通过上述步骤406至415实现了计算机的应用程序和该USB Token的数据交互过程。
步骤416:等待USB Token与主机建立连接。
如图4所示,当等待到USB Token与主机建立连接后,执行步骤406至步骤415。
通过本实施例,具体说明了HID/SCSI设备PC/SC接口的实现原理,其中,上述本发明实施例在实现时,是采用伺服程序创建内核对象并加载伺服函数库实现的,本领域技术人员还可以获知,伺服程序还可以通过采用创建文件对象方式实现加载伺服函数库;当采用采用创建文件对象方式实现时,相应地,位于计算机应用层的伺服程序创建内核对象并加载伺服函数库,伺服函数库将创建的内核对象发送给PC/SC驱动程序的步骤,具体为:
位于计算机应用层的伺服程序创建文件对象并加载伺服函数库,伺服函数库将创建的文件对象发送给PC/SC驱动程序;
相应地,PC/SC驱动程序将接收的计算机应用程序下发的访问HID/SCSI设备的指令,通过内核对象发送给伺服程序的步骤,具体为:
PC/SC驱动程序将接收的计算机应用程序下发的访问HID/SCSI设备的指令,通过文件对象发送给伺服程序;
相应地,位于计算机应用层的伺服程序创建文件对象并加载伺服函数库之前,还包括:
计算机启动加载PC/SC驱动程序信息至计算机内存;
计算机设备管理程序从计算机内存获取系统中的PC/SC驱动程序信息;
PC/SC驱动程序向设备管理程序注册协议处理器的标识。
当采用创建文件对象方式,实现伺服程序加载伺服函数库时,相应地,方法还包括:
计算机中的应用层的伺服程序获取HID/SCSI设备中的数据,通过文件对象将数据发送给PC/SC驱动程序;
PC/SC驱动程序通过设备管理程序将HID/SCSI设备中的数据发送给应用程序。
综上所述,本发明实施例提供的实现HID/SCSI设备PC/SC接口的方法,通过将HID/SCSI接口指令从PC/SC驱动程序中分离出来,利用伺服模块来调用HID/SCSI接口指令,为计算机提供了一条访问HID/SCSI设备的通道,进而实现HID/SCSI设备通过PC/SC接口与计算机进行通信的过程,由于伺服模块中的伺服程序运行在系统应用层,因此伺服程序的编写、修改以及维护都较为简单,伺服程序的运行过程中发生错误,不会导致整个系统的崩溃;当需要支持新的HID/SCSI设备时,只需通过更换伺服程序就可以实现计算机系统对新设备的兼容,大大增强了系统的柔韧性和扩展性。另外,设计人员可以利用伺服函数库的功能使程序不至于太过巨大,比如,多个应用程序可以共享伺服函数库中的函数,其中,伺服函数库以一种自然的方式将一个大的应用程序划分为几个小的部分,有利于内部的分工与合作,各个部分可以独立升级等等。
实施例5
相应与本发明实施例2所提供的实现HID/SCSI设备PC/SC接口的系统,本发明实施例提供了一种实现HID/SCSI设备PC/SC接口的方法,该方法中,在应用层伺服程序中通过设置多个伺服函数库,不同的伺服函数库由同一个应用层伺服程序对其进行调用,每个伺服函数库对应不同的USB Token,从而实现应用程序对多个USB Token的访问。其中,所谓的不同的USB Token是指具有不同的其中具有不同的协议处理器名称的HID/SCSI设备。
通过本发明实施例提供的方法,若要实现对不同的USB Token的访问,只需通过PC/SC驱动程序向设备管理程序注册USB Token中相应协议处理器的名称,便可实现应用程序对不同USB Token的访问,具体流程参见实施例3。本领域技术人员可以获知,由于PC/SC驱动程序位于计算机系统的内核层,所以在实现向设备管理程序注册USB Token中相应协议处理器的名称时,需要重新启动计算机。
本发明实施例中的“接收”一词可以理解为主动从其他模块获取也可以是接收其他模块发送来的信息。
本领域技术人员可以理解附图只是一个优选实施例的示意图,附图中的模块或流程并不一定是实施本发明所必需的。
本领域技术人员可以理解实施例中的系统(或设备)中的模块可以按照实施例描述分布于实施例的系统(或设备)中,也可以进行相应变化位于不同于本实施例的一个或多个系统(或设备)中。上述实施例的模块可以合并为一个模块,也可以进一步拆分成多个子模块。
上述本发明实施例序号仅仅为了描述,不代表实施例的优劣。
本发明实施例中的部分步骤,可以利用软件实现,相应的软件程序可以存储在可读取的存储介质中,如光盘或硬盘等。