智能卡读卡器无法读取部分卡片。

18

我有一个应用程序,使用智能卡读卡器让用户访问系统的某些部分。在一个位置上,我没有问题。但是在另一个位置上,使用不同类型的卡片制造商就遇到了很多问题。它一直返回零的ID。然后查看事件日志,我看到了这个:

enter image description here

这是代码:

 card.Connect(reader, SHARE.Shared, PROTOCOL.T0orT1);

 var apduGetID = new APDUCommand(0xFF, 0xCA, 0, 0, null, 4);
 var apduRespGetID = card.Transmit(apduGetID);
long cardId = BitConverter.ToUInt32(apduRespGetID.Data.Reverse().ToArray(), 0);

第二个问题是在尝试调试代码时,只有在移除断点后才能发现问题所在但不知道具体位置。请有人帮帮我吗?

P.S. 我找到了这个帖子,但它并没有解决我的问题:https://superuser.com/questions/715688/smart-card-errors

更新:这里是Transmit类:

 public override APDUResponse Transmit(APDUCommand ApduCmd)
        {
            var RecvLength = (uint)(ApduCmd.Le + APDUResponse.SW_LENGTH);
            byte[] ApduBuffer;
            var ApduResponse = new byte[ApduCmd.Le + APDUResponse.SW_LENGTH];
            var ioRequest = new SCard_IO_Request
            {
                m_dwProtocol = m_nProtocol,
                m_cbPciLength = 8
            };

            // Build the command APDU
            if (ApduCmd.Data == null)
            {
                ApduBuffer = new byte[APDUCommand.APDU_MIN_LENGTH + ((ApduCmd.Le != 0) ? 1 : 0)];

                if (ApduCmd.Le != 0)
                {
                    ApduBuffer[4] = ApduCmd.Le;
                }
            }
            else
            {
                ApduBuffer = new byte[APDUCommand.APDU_MIN_LENGTH + 1 + ApduCmd.Data.Length];

                for (var nI = 0; nI < ApduCmd.Data.Length; nI++)
                {
                    ApduBuffer[APDUCommand.APDU_MIN_LENGTH + 1 + nI] = ApduCmd.Data[nI];
                }

                ApduBuffer[APDUCommand.APDU_MIN_LENGTH] = (byte)ApduCmd.Data.Length;
            }

            ApduBuffer[0] = ApduCmd.Class;
            ApduBuffer[1] = ApduCmd.Ins;
            ApduBuffer[2] = ApduCmd.P1;
            ApduBuffer[3] = ApduCmd.P2;

            m_nLastError = SCardTransmit(m_hCard, ref ioRequest, ApduBuffer, (uint)ApduBuffer.Length, IntPtr.Zero, ApduResponse, out RecvLength);

            if (m_nLastError != 0)
            {
                var msg = "SCardTransmit error: " + m_nLastError;
                throw new SmartCardException(msg, m_nLastError);
            }

            var apduData = new byte[RecvLength];

            for (var nI = 0; nI < RecvLength; nI++)
            {
                apduData[nI] = ApduResponse[nI];
            }

            return new APDUResponse(apduData);
        }

更新2:我也尝试使用一些Thread.Sleep()。


1
你能在命令之间加入一些延迟,然后再重试吗?读卡器或卡片的速度可能没有你程序运行的速度快。 - Ebrahim Ghasemi
你自己编写了安装在智能卡上的程序吗?您可以向两种类型的卡发送00A404000004,并将卡的响应添加到问题中吗?(使用此工具向卡发送APDU命令:https://github.com/OpenSC/OpenSC/wiki) - Ebrahim Ghasemi
暂时禁用所有防火墙和反病毒应用程序,然后再次检查问题。 - Aishwarya Shiva
你使用的是哪个版本的Windows? - Hut8
嗨。@Hut8 我正在使用Windows 7。 - mortenstarck
显示剩余2条评论
2个回答

3
请确保第二台机器上安装了最新的智能卡驱动程序。有时,将制造商提供的驱动程序替换为“Microsoft WUDF驱动程序”可能会有所帮助- https://msdn.microsoft.com/en-us/library/windows/hardware/dn653571(v=vs.85).aspx 请注意,在插入后,操作系统会检测到两种类型的设备-智能卡枚举器设备(智能卡读卡器)和智能卡本身(有时称为智能卡容器)。一个智能卡读卡器可以包含多个智能卡。
以下是强制替换为Microsoft WUDF的智能卡驱动程序实例,以使客户端应用程序(iBank2)正常工作:
四个智能卡驱动程序已经被基本的Microsoft驱动程序强制替换,以使应用程序正常工作。

0

如果其他系统不能读取您的智能卡,只需检查智能卡在 BIOS 设置中是否启用。某些系统中有禁用/启用选项。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接