PC/SC介绍
一、 PC/SC介绍
  PC/SC规范是一个基于WINDOWS平台的一个标准用户接口(API),提供了一个从个人电脑(Personal Computer)到智能卡(SmartCard)的整合环境。它作为读卡器和卡与计算机之间有一个标准接口,实现不同生产商的卡和读卡器之间的互操作性,其独立于设备的 API使得应用程序开发人员不必考虑当前实现形式和将来实现形式之间的差异,并避免了由于基本硬件改变而引起的应用程序变更,从而降低了软件开发成本。通俗讲,也就是说由不同生产商生产的不同类型的智能卡 ,通过PC/SC这个接口规范,就能与计算机相连接,完成与计算机之间的互操作。
recv函数
PC/SC的主要优点是让应用程序不必为了与智能卡通信而去了解智能卡读卡器的细节,而且该应用程序还能适用于任何遵从PC/SC标准的读卡器。
PC/SC接口包含30多个以Scard为前缀的函数,所有函数的原型都winscard.h中声明,应用程序需要包含winscard.lib,所有函数的正常返回值都SCARD_S_SUCCESS。在这30多个函数中,常用的函数只有几个,与智能卡的访问流程对应,下面将详细介绍几个常用函数。
二、 PC/SC中常用函数的功能与用法
1、ScardEstablishContext():建立资源管理器的上下文
  函数ScardEstablishContext()用于建立将在其中进行设备数据库操作的资源管理器上下文(范围)。
函数原型:LONG SCardEstablishContext(DWORD dwScope,  LPCVOID pvReserved1, LPCVOID pvReserved2,  LPSCARDCONTEXT phContext);
各个参数的含义:
1dwScope:输入类型;表示资源管理器上下文范围,取值为:SCARD_SCOPE_USER(在用户域中完成设备数据库操作)、SCARD_SCOPE_SYSTEM(在系统域中完成设备数据库操作)。要求应用程序具有相应的操作权限。
2pvReserved1:输入类型;保留,必须为NULL
3pvReserved2:输入类型;保留,必须为NULL
4phContext:输出类型;建立的资源管理器上下文的句柄。
    示例:SCARDCONTEXT        ContextHandle
DWORD ret = SCardEstablishContext(SCARD_SCOPE_USER,  NULL, NULL, &ContextHandle)
如果ret 返回 SCARD_S_SUCCESS,则成功建立资源管理器的上下文,可进行下一步操作,下面的函数同此。
2ScardListReaders():获得系统中安装的读卡器列表
函数原型:LONG SCardListReaders(SCARDCONTEXT hContext,  LPCTSTR mszGroups,  LPTSTR mszReaders,  LPDWORD pcchReaders);
各个参数的含义:
  1hContext:输入类型;ScardEstablishContext()建立的资源管理器上下文的句柄,不能为NULL
  2mszGroups:输入类型;读卡器组名,为NULL时,表示列出所有读卡器。
3mszReaders:输出类型;系统中安装的读卡器的名字,各个名字之间用’\’分隔,最后一个名字后面为两个连续的’\0’
4pcchReaders:输入输出类型;mszReaders的长度。
示例:BYTE        pResponseBuffer;
        ULONG    ResponseLength;
DWORD  ret = SCardListReaders(ContextHandle, 0, (char *) pResponseBuffer, &ResponseLength);
3ScardConnect():与读卡器连接
函数原型:LONG SCardConnect(SCARDCONTEXT  hContext,  LPCTSTR  szReader,  DWORD  dwShareMode,    dwShareMode,  DWORDdwPreferredProtocols,  LPSCARDHANDLE phCard,  LPDWORD pdwActiveProtocol);
各个参数的含义:
1hContext:输入类型;ScardEstablishContext()建立的资源管理器上下文的句柄。
2szReader:输入类型;包含智能卡的读卡器名称(读卡器名称由ScardListReaders()给出)。
3dwShareMode:输入类型;应用程序对智能卡的操SCARD_SHARE_SHARED(多个应用共享同一个智能卡)、SCARD_SHARE_EXCLUSIVE(应用独占智能卡)、SCARD_SHARE_DIRECT(应用将智能卡作为私有用途,直接操纵智能卡,不允许其它应用访问智能卡)。
4dwPreferredProtocols:输入类型;连接使用的协议,SCARD_PROTOCOL_T0(使用T=0协议)、SCARD_PROTOCOL_T1(使用T=1协议)。
5phCard:输出类型;与智能卡连接的句柄。
6PdwActiveProtocol:输出类型;实际使用的协议。
示例:
char szReaderName[100];  //读卡器名称由ScardListReaders()给出
SCARDHANDLE      CardHandle;
DWORD       ActiveProtocol;   
DWORD  ret = SCardConnect(ContextHandle, szReaderName,
        SCARD_SHARE_SHARED, SCARD_PROTOCOL_T0 | SCARD_PROTOCOL_T1, &CardHandle,
        &ActiveProtocol);
4SCardStatus():返回连接到当前读卡器句柄的状态(ATR
  函数原型:LONG SCardStatus(SCARDHANDLE hCard, LPSTR mszReaderName, LPDWORD  pcchReaderLen, LPDWORD pdwState, LPDWORD pdwProtocol, LPBYTE pbAtr, LPDWORD pcbAtrLen);
各个参数的含义:
      1 hCard 输出类型;与智能卡连接的句柄.
      2 mszReaderName:输入输出类型;系统中安装的读卡器的名字。
      3 pcchReaderLen 输入输出类型;mszReaderName的长度。
4 pdwState:输出类型;当前读卡器的状态,SCARD_ABSENT, SCARD_PRESENT, SCARD_SWALLOWED,, SCARD_POWERED, SCARD_NEGOTIABLE, SCARD_SPECIFI
5pdwProtocol:输出类型;连接使用的协议,SCARD_PROTOCOL_T0(使用T=0协议)、SCARD_PROTOCOL_T1(使用T=1协议)。
6pbAtr:输出类型;当前读卡器中只能卡的ATR
7pcbAtrLen:输出类型;ATR长度。
示例:DWORD ret = SCardStatus(CardHandle,    stuReader.szReaderName, &dwLength, &dwCardState, &dwActiveProtocol, pbyATR, &dwATRLength);
5ScardTransmit():向智能卡发送指令
函数原型:LONG SCardTransmit(SCARDHANDLE hCard, LPCSCARD_I0_REQUEST pioSendPci, LPCBYTE pbSendBuffer, DWORD cbSendLength, LPSCARD_IO_REQUEST pioRecvPci, LPBYTE pbRecvBuffer, LPDWORD pcbRecvLength);
各个参数的含义:
1hCard:输入类型;与智能卡连接的句柄。
2pioSendPci:输入类型;指令的协议头结构的指针,由SCARD_IO_REQUEST结构定义。后面是使用的协议的协议控制信息。一般使用系统定义的结构,SCARD_PCI_T0T=0协议)、 SCARD_PCI_T1T=1协议)、SCARD_PCI_RAW(原始协议)。
3pbSendBuffer:输入类型;要发送到智能卡的数据的指针。
4cbSendLength:输入类型;pbSendBuffer的字节数目。
5pioRecvPci:输入输出类型;指令协议头结构的指针,后面是使用的协议的协议控制信息,如果不返回协议控制信息,可以为NULL
6pbRecvBuffer:输入输出类型;从智能卡返回的数据的指针。
7pcbRecvLength:输入输出类型;pbRecvBuffer的大小和实际大小。
示例:char        SendData[1024], ReceiveData[1024];
      ULONG      nCmdLen, nResp;
nCmdLen = strlen(strApdu);
DWORD ret = SCardTransmit(CardHandle, SCARD_PCI_T0, (PUCHAR)SendData, nCmdLen / 2, NULL, (PUCHAR)ReceiveData, &nResp);
6ScardDisconnect():与读卡器断开连接
函数原型:LONG SCardDisconnect(SCARDHANDLE hCard, DWORD dwDisposition);
各个参数的含义:
1hCard:输入类型;与智能卡连接的句柄。
2dwDisposition:输入类型;断开连接时,对智能卡的操作,SCARD_LEAVE_CARD(不做任何操作)、SCARD_RESET_CARD(复位智能卡)、SCARD_UNPOWER_CARD(给智能卡掉电)、SCARD_EJECT_CARD(弹出智能卡)。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。