Подтвердить что ты не робот

Считыватель смарт-карт, не может читать некоторые карты

У меня есть приложение, использующее устройство чтения смарт-карт, позволяющее пользователям получать доступ к частям системы. В одном месте у меня нет проблем. Но у другого, у которого есть другой тип производителя карт, много проблем. Он продолжает получать идентификатор нуля. Затем, посмотрев в журнал событий, я увидел это: 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/info/715688/smart-card-errors

Обновление: вот класс передачи

 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()

4b9b3361

Ответ 1

Пожалуйста, проверьте, что на втором компьютере у вас есть все современные драйверы смарт-карты. Кроме того, иногда это помогает заменить драйвер, который предоставляется производителем с помощью "Microsoft WUDF driver" - https://msdn.microsoft.com/en-us/library/windows/hardware/dn653571(v=vs.85).aspx

Обратите внимание, что у вас есть два типа устройств, обнаруженных ОС, когда вы его подключаете - устройство перечислителя смарт-карт (устройство чтения смарт-карт) и смарт-карту (иногда называемую контейнером смарт-карты). Один считыватель смарт-карт может содержать несколько смарт-карт.

Пример смарт-карты, драйвер которой был принудительно заменен Microsoft WUDF, чтобы заставить клиентское приложение (iBank2) работать:

four smart cards WUDF type

Четыре драйвера смарт-карт были принудительно заменены базовым драйвером Microsoft, чтобы приложение работало.

Ответ 2

Хорошо, если другая система не берет вашу смарт-карту, просто проверьте настройки BIOS для смарт-карты. Существует возможность отключить/включить их в некоторых системах.