PCSC那事儿(十二--SCardIsValidContext)

本文详细解析了智能卡API中的SCardIsValidContext函数,探讨其如何验证上下文的有效性,并通过示例展示了如何检查智能卡服务的状态及获取读卡器列表。

 

SCardIsValidContext

winscard_clnt.c 中定义

实现如下:

3543 LONG SCardIsValidContext(SCARDCONTEXT hContext)

3544 {

3545         LONG rv;

3546         LONG dwContextIndex;

3547

3548         PROFILE_START

3549

3550         rv = SCARD_S_SUCCESS;

3551

3552         /* Check if the _same_ server is running */

3553         rv = SCardCheckDaemonAvailability();

3554         if (rv != SCARD_S_SUCCESS)

3555                 return rv;

3556

3557         /*

3558          * Make sure this context has been opened

3559          */

3560         dwContextIndex = SCardGetContextIndice(hContext);

3561         if (dwContextIndex == -1)

3562                  rv = SCARD_E_INVALID_HANDLE;

3563

3564         PROFILE_END(rv)

3565

3566         return rv;

3567 }

 

 

SCardCheckDaemonAvailability 做什么呢?当然可以是看看 pcscd 是否还活着、 pcscd 是否重启过、客户端是否 clone 了自己。 still alive,restart,clone?

前面说过了,忘记了吗?也许很累了,那么休息下,继续。

 

SCardGetContextIndice 也说过了。

那么也就是说 testpcsc 很不放心,调用了 SCardIsValidContext ,查查 pcscd 是否还活着?

上面的 SCardEstablishContext 是否分到了正确的非重复的上下文,

从这里可以看出, SCardGetContextIndice 这里没有多大的必要了。因为 SCardEstablishContextTH 内部有个 again ,卖命的做,直到分到了一个正确的上下文。

这个 again 看到了希望,因为它直到 pcscd 的算法会给它一个它想要的,仅仅是时间问题。

 

算了。既然 testpcsc 那么多疑,就让它再查查了。

104         printf("Testing SCardIsValidContext/t: ");

105         rv = SCardIsValidContext(hContext+1);

 

 

看来 testpcsc 还是不放心,想试探下 SCardIsValidContext ,有意给了一个错误的 SCARDCONTEXT ,当然了 SCardIsValidContext 很忠实地返回了错误。

不像现实世界中的弄虚作假、到处忽悠、出尔反尔。

继续 ...

108          printf("Testing SCardListReaderGroups/t: ");

109 #ifdef USE_AUTOALLOCATE

110         dwGroups = SCARD_AUTOALLOCATE;

111         rv = SCardListReaderGroups(hContext, (LPSTR)&mszGroups, &dwGroups);

112 #else

113         rv = SCardListReaderGroups(hContext, NULL, &dwGroups);

114         test_rv(rv, hContext, PANIC);

115

116         printf("Testing SCardListReaderGroups/t: ");

117         mszGroups = calloc(dwGroups, sizeof(char));

118         rv = SCardListReaderGroups(hContext, mszGroups, &dwGroups);

119 #endif

 

这么多, 108~119 ,至少表面通俗易懂,获取系统的读卡器列表。

想知道内幕吗?内幕往往都是复杂的 ... 骗你了,不会太复杂了。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值