烟灰

我QQ名烟灰,于是乎,在我的这个空间里面,有了烟灰的痕迹

1 引言
完整的智能卡应用系统由后台服务程序、主机或终端应用程序和智能卡等组成,如图1所示。其中,后台服务程序提供了支持智能卡的服务。例如,在一个电子付款系统中,后台服务程序可以提供到信用卡和帐户信息的访问;主机或终端应用程序一般存在于台式机或者终端、电子付款终端、手机或者一个安全子系统中,终端应用程序要处理用户、智能卡和后台服务程序之间的通讯;智能卡则存储用户的一些信息。

终端应用程序需要通过读卡器来访问智能卡,在一个系统中,通常存在多家厂商提供的读卡器,因此需要一个统一的读卡器设备驱动接口。
随着智能卡的广泛应用,为解决计算机与各种读卡器之间的互操作性问题,人们提出了PC/SC(Personal Computer/Smart Card)规范,PC/SC规范作为读卡器和卡与计算机之间有一个标准接口,实现不同生产商的卡和读卡器之间的互操作性,其独立于设备的 API使得应用程序开发人员不必考虑当前实现形式和将来实现形式之间的差异,并避免了由于基本硬件改变而引起的应用程序变更,从而降低了软件开发成本。
Microsoft在其Platform SDK中实现了PC/SC,作为连接智能卡读卡器与计算机的一个标准模型,提供了独立于设备的 API,并与Windows平台集成。因此,我们可以用PC/SC接口来访问智能卡。

2 PC/SC概述
PC/SC接口包含30多个以Scard为前缀的函数,所有函数的原型都在winscard.h中声明,应用程序需要包含winscard.lib,所有函数的正常返回值都是SCARD_S_SUCCESS。在这30多个函数中,常用的函数只有几个,与智能卡的访问流程(图2)对应,下面将详细介绍这些常用函数。

3 PC/SC的使用

3.1建立资源管理器的上下文
函数ScardEstablishContext()用于建立将在其中进行设备数据库操作的资源管理器上下文(范围)。
函数原型:LONG SCardEstablishContext(DWORD dwScope, LPCVOID pvReserved1, LPCVOID pvReserved2, LPSCARDCONTEXT phContext);
各个参数的含义:(1)dwScope:输入类型;表示资源管理器上下文范围,取值为:SCARD_SCOPE_USER(在用户域中完成设备数据库操作)、SCARD_SCOPE_SYSTEM(在系统域中完成设备数据库操作)。要求应用程序具有相应的操作权限。(2)pvReserved1:输入类型;保留,必须为NULL。(3)pvReserved2:输入类型;保留,必须为NULL。(4)phContext:输出类型;建立的资源管理器上下文的句柄。

下面是建立资源管理器上下文的代码:
SCARDCONTEXT        hSC;
LONG                lReturn;
lReturn = SCardEstablishContext(SCARD_SCOPE_USER, NULL, NULL, &hSC);
if ( lReturn!=SCARD_S_SUCCESS )
printf("Failed SCardEstablishContext\n");

3.2 获得系统中安装的读卡器列表
函数ScardListReaders()可以列出系统中安装的读卡器的名字。
函数原型:LONG SCardListReaders(SCARDCONTEXT hContext, LPCTSTR mszGroups, LPTSTR mszReaders, LPDWORD pcchReaders);
各个参数的含义:(1)hContext:输入类型;ScardEstablishContext()建立的资源管理器上下文的句柄,不能为NULL。(2)mszGroups:输入类型;读卡器组名,为NULL时,表示列出所有读卡器。(3)mszReaders:输出类型;系统中安装的读卡器的名字,各个名字之间用’\0’分隔,最后一个名字后面为两个连续的’\0’。(4)pcchReaders:输入输出类型;mszReaders的长度。
系统中可能安装多个读卡器,因此,需要保存各个读卡器的名字,以便以后与需要的读卡器建立连接。
下面是获得系统中安装的读卡器列表的代码:
char            mszReaders[1024];
LPTSTR          pReader, pReaderName[2];
DWORD           dwLen=sizeof(mzsReaders);
int             nReaders=0;
lReturn = SCardListReaders(hSC, NULL, (LPTSTR)mszReaders, &dwLen);
if ( lReturn==SCARD_S_SUCCESS )
{
pReader = (LPTSTR)pmszReaders;
while (*pReader !='\0' )
{
if ( nReaders<2 ) //使用系统中前2个读卡器
                pReaderName[nReaders++]=pReader;
printf("Reader: %S\n", pReader );
//下一个读卡器名
pReader = pReader + strlen(pReader) + 1;
}
}

3.3 与读卡器(智能卡)连接
函数ScardConnect()在应用程序与读卡器上的智能卡之间建立一个连接。
函数原型:LONG SCardConnect(SCARDCONTEXT hContext, LPCTSTR szReader, DWORD dwShareMode, DWORD dwPreferredProtocols, LPSCARDHANDLE phCard, LPDWORD pdwActiveProtocol);
各个参数的含义:(1)hContext:输入类型;ScardEstablishContext()建立的资源管理器上下文的句柄。(2)szReader:输入类型;包含智能卡的读卡器名称(读卡器名称由ScardListReaders()给出)。(3)dwShareMode:输入类型;应用程序对智能卡的操作方式,SCARD_SHARE_SHARED(多个应用共享同一个智能卡)、SCARD_SHARE_EXCLUSIVE(应用独占智能卡)、SCARD_SHARE_DIRECT(应用将智能卡作为私有用途,直接操纵智能卡,不允许其它应用访问智能卡)。(4)dwPreferredProtocols:输入类型;连接使用的协议,SCARD_PROTOCOL_T0(使用T=0协议)、SCARD_PROTOCOL_T1(使用T=1协议)。(5)phCard:输出类型;与智能卡连接的句柄。(6)PdwActiveProtocol:输出类型;实际使用的协议。
下面是与智能卡建立连接的代码:
SCARDHANDLE     hCardHandle[2];
DWORD           dwAP;
lReturn = SCardConnect( hContext, pReaderName[0],    SCARD_SHARE_SHARED,
SCARD_PROTOCOL_T0 | SCARD_PROTOCOL_T1, &hCardHandle[0], &dwAP );
if ( lReturn!=SCARD_S_SUCCESS )
{
printf("Failed SCardConnect\n");
exit(1);
}
与智能卡建立连接后,就可以向智能卡发送指令,与其交换数据了。

引文来源  pc/sc 编程_烟灰_百度空间

pc/sc 编程_烟灰_百度空间相关推荐

  1. Windows Server 2008之旅??Windows Server Backup功能_闲云野鹤?精神家园_百度空间

    为什么80%的码农都做不了架构师?>>>    Windows Server 2008之旅??Windows Server Backup功能 2008-08-17 10:43 备份无 ...

  2. 毕业论文评审意见、导师意见范文、模板_Smile~风_百度空间

    毕业论文评审意见.导师意见范文.模板_Smile~风_百度空间 又到一年论文答辩时,很多同学需要自己写评审意见.导师意见,下面列出了我通过百度收集的一些模板和范围,方便大家参考. 题目1:固本活血法对 ...

  3. 如何控制Yahoo! Slurp蜘蛛的抓取频度_国外博客资源站_百度空间

    如何控制Yahoo! Slurp蜘蛛的抓取频度_国外博客资源站_百度空间 如何控制Yahoo! Slurp蜘蛛的抓取频度 2009年08月13日 星期四 5:56 上周末豆瓣的阿北给我电话:最近你们雅 ...

  4. JavaScript跨域问题分析与总结_直来直往_百度空间

    JavaScript跨域问题分析与总结_直来直往_百度空间 JavaScript跨域问题分析与总结 2009-11-15 16:44 一.为什么需要JS跨域 假设我们构建了一个网上商城www.xxx. ...

  5. 基于EPOLL+多进程+线程池的server框架设想_程序世界_百度空间

    基于EPOLL+多进程+线程池的server框架设想_程序世界_百度空间 基于EPOLL+多进程+线程池的server框架设想 最近,看了几个开源代码的server框架,有了一些自己的想法,把它记下来 ...

  6. 【转】vim 分割窗口[转]_孤鸿灬的空间_百度空间

    [转]vim 分割窗口[转]_孤鸿灬的空间_百度空间 [转]vim 分割窗口[转]_孤鸿灬的空间_百度空间 [转]vim 分割窗口[转] 同时显示两个不同的文件,或者同时查看一个文件的两个不同的部分, ...

  7. WIN7下C:\Documents and Settings 无法打开_雨山_百度空间

    WIN7下C:\Documents and Settings 无法打开_雨山_百度空间 你修改下权限就好了! 1.右键单击"计算机",进入"管理"找到" ...

  8. linux下qt静态编译_自由出土文物的空间_百度空间

    linux下qt静态编译_自由出土文物的空间_百度空间 linux下qt静态编译_自由出土文物的空间_百度空间 linux下qt静态编译 2012-04-09 13:10 测试通过,贴一下过程,仅用来 ...

  9. CIF、DCIF、D1区别_昂首阔步_百度空间

    CIF.DCIF.D1区别_昂首阔步_百度空间 CIF.DCIF.D1区别 关于视频监控分辨率CIF.DCIF.D1格式的介绍 什么是D1? 做闭路电视监控系统这一行久了,大家都以为D1是硬盘录像机显 ...

最新文章

  1. 吸引:由《你的知识需要管理》编辑过程想到的
  2. JQuery Ajax解读(3)
  3. SVN服务器从Windows迁移到Linux
  4. 搜索推荐系统实战:起始篇
  5. 【iOS7一些总结】9、与列表显示(在):列表显示UITableView
  6. delphi组件读写机制
  7. VBscript读取excel表,中数据导入到SQLserver数据库里面
  8. Linux 系统启动
  9. 初中参观机器人博物馆的作文_参观足球机器人实验室600字作文
  10. iPAD越狱后下载破解版的pad软件方法总录
  11. AD域创建及加入域的办法
  12. 软件测试人员的优势,软件测试师 求职八大优势
  13. 【Python高级技能】超炫酷,电脑每天自动换壁纸,这个神器适合你。
  14. python批量建立文件夹
  15. selenium模拟12306登录
  16. js 实现呼起(打开)app
  17. MYSQL窗口函数用法
  18. 如何将qsv格式视频转换为MP4格式?qsv文件怎么转换成mp4
  19. 广东省梅州市谷歌卫星地图下载
  20. JAVA计算机毕业设计实验室耗材管理系统源码+系统+mysql数据库+lw文档

热门文章

  1. 实际项目中手动测试和自动测试的合理运用
  2. 用Python试一下PCA和SVM
  3. Cyberpunk2077—赛博朋克2077 中代码矩阵解密小游戏之最优解寻找
  4. 2021-08-13 Ubuntu sudo apt-get install 提示Media change : please insert the disc labeled
  5. Semantic Instance Segmentation with a Discriminative Loss Function【论文详解】
  6. win10远程桌面教程(修改远程桌面端口)
  7. 针对我国目前的资源现状GIS技术可以有哪些作用
  8. GIS技术 离线地图实现
  9. PHREEQC水文地球化学建模方法【建议收藏】
  10. 【黑金动力社区】发布MS531第二版 MS531-II