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 ,至少表面通俗易懂,获取系统的读卡器列表。
想知道内幕吗?内幕往往都是复杂的 ... 骗你了,不会太复杂了。
本文详细解析了智能卡API中的SCardIsValidContext函数,探讨其如何验证上下文的有效性,并通过示例展示了如何检查智能卡服务的状态及获取读卡器列表。
3333

被折叠的 条评论
为什么被折叠?



