来自 O2Micro 阅读器上的 WINSCARD.DLL 方法 SCardTransmit 的未知响应以及响应长度信息

Posted

技术标签:

【中文标题】来自 O2Micro 阅读器上的 WINSCARD.DLL 方法 SCardTransmit 的未知响应以及响应长度信息【英文标题】:Unknown response from WINSCARD.DLL method SCardTransmit on O2Micro reader with response length information 【发布时间】:2011-08-24 10:58:26 【问题描述】:

为了与智能卡通信,我使用 WINSCARD.DLL 作为 API 将 APDU 命令发送到智能卡。对于几个读卡器来说,这是按预期工作的,但是如果我将命令发送到 O2Micro 读卡器,我会从方法 SCardTransmit 得到一个未知的返回值(它不在 http://msdn.microsoft.com/en-us/library/ms936965.aspx 上)。

什么是有效的: 如果我发送命令(十六进制值):

CLA: 00, INS: A4, P1: 02, P2: 04, Lc: 02, Data: "4401", Le: (not present)

我收到回复SW1: 61. SW2: 1F

响应表明有0x1F 字节可用。所以我发送命令:

CLA: 00, INS: A4, P1: 02, P2: 04, Lc: 02, Data: "4401", Le: 1F

但是在那个命令上我没有得到数据并且返回值0x57

我的问题是,是否有人知道返回值 0x57 的含义,以及如何解决或解决它的方法。

【问题讨论】:

修正主题中的拼写。 【参考方案1】:

您的错误代码是来自 winerror.h 的窗口 System Error Codes 之一:ERROR_INVALID_PARAMETER。这几乎总是意味着您的 APDU 没问题,但 SCardTransmit 参数是问题所在。我建议仔细查看pbRecvBuffer 参数。警告:我只在 C++ 中使用 SCard 函数,而不是 C#。

PC/SC 函数可以返回标准的 Windows 错误代码以及 PC/SC 特定的错误代码。请注意有关FormatMessage 调用的一点:您可以使用它来使错误报告更加通用,并使用 Windows 提供的预定义错误消息。

【讨论】:

我将该函数称为:SCardTransmit((uint)Card, IntPtr.Zero , SendBuffer, (uint)SendBuffer.Length, IntPtr.Zero, RecvBuffer, ref RecvLength) RecvBuffer 是一个 257 字节的字节数组,RecvLength 为 0。我还测试了 RecvLength 为 257。但它仍然给我同样的错误。 经过一番努力,我发现SCardConnect 方法的首选协议无效。参数dwPrefProtocol(列表中的第四个)被设置为1|2。通常它在开发系统中使用 2,但在生产系统中使用 1。我使用值 2 对其进行了硬编码,然后它开始工作。感谢您的帮助! 你试过最大 255 字节吗?我相信这是该部分的最大字节数......

以上是关于来自 O2Micro 阅读器上的 WINSCARD.DLL 方法 SCardTransmit 的未知响应以及响应长度信息的主要内容,如果未能解决你的问题,请参考以下文章

在哪里可以找到用于 VC++ 2010(Win 7)中 PC/SC 编程的 winscard.lib?

C#调用PCSC即(winscard.dll)中SCardGetStatusChange()怎么使用?

在未连接智能卡的情况下发送带有 winscard.dll (PC/SC) 的 APDU

ACR38 阅读器和 SLE4442 Java 延迟

如何在 Java 中与智能卡交互?

Windows 上的 PCSC-Lite 代码