PCSC那事儿(二十二--SCardGetAttrib)

本文详细解析了SCardGetAttrib函数的实现,包括内存分配、参数处理和APDU交互。同时展示了如何使用该函数获取ATR字符串、Vendor IFD Version和Max message length等信息。
摘要由CSDN通过智能技术生成

 

SCardGetAttrib

SCardGetAttrib 定义在 winscard_clnt.c

实现如下:

 

2658 LONG SCardGetAttrib(SCARDHANDLE hCard, DWORD dwAttrId, LPBYTE pbAttr,

2659         LPDWORD pcbAttrLen)

2660 {

2661         LONG ret;

2662         unsigned char *buf = NULL;

2663

2664         PROFILE_START

2665

 

2666         if (NULL == pcbAttrLen)

2667                 return SCARD_E_INVALID_PARAMETER;

2668

2669         if (SCARD_AUTOALLOCATE == *pcbAttrLen)

2670         {

2671                 if (NULL == pbAttr)

2672                         return SCARD_E_INVALID_PARAMETER;

2673

2674                 *pcbAttrLen = MAX_BUFFER_SIZE;

2675                 buf = malloc(*pcbAttrLen);

2676                 if (NULL == buf)

2677                         return SCARD_E_NO_MEMORY;

2678

2679                 *(unsigned char **)pbAttr = buf;

2680          }

 

 

2669 行当传入的 pcbAttrLen 所指内容为 SCARD_AUTOALLOCATE ,则要求 SCardGetAttrib 内部为参数 pbAttr 分配内存。这个在前面也有所提到。

 

 

2681         else

2682         {

2683                 buf = pbAttr;

2684

2685                 /* if only get the length */

2686                 if (NULL == pbAttr)

2687                          /* use a reasonable size */

2688                         *pcbAttrLen = MAX_BUFFER_SIZE;

2689         }

2690

2691         ret = SCardGetSetAttrib(hCard, SCARD_GET_ATTRIB, dwAttrId, buf,

2692                 pcbAttrLen);

2693

2694         PROFILE_END(ret)

2695

2696         return ret;

2697 }

 

 

2686 行,如果传入的参数 pbAttr 为0,则只是需要返回 pbAttr 可能需要的长度,

在这里,这个长度是固定的, MAX_BUFFER_SIZE 264. 这个在前面也提到了,

用到短 APDU 收发的时候。

 

现在看看 SCardGetSetAttrib. 为了体现 extract SCardGetAttrib 用到了 SCardGetSetAttrib ,也就是调用了 SCardGetSetAttrib ,第二个参数是

SCARD_GET_ATTRIB.

SCardGetSetAttrib 定义在 winscard_clnt.c

实现如下:

2750 static LONG SCardGetSetAttrib(SCARDHANDLE hCard, int command, DWORD dwAttrId,

2751         LPBYTE pbAttr, LPDWORD pcbAttrLen)

2752 {

2753         LONG rv;

2754         getset_struct scGetSetStruct;

2755         sharedSegmentMsg msgStruct;

2756         int i;

2757         DWORD dwContextIndex, dwChannelIndex;

2758

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值