Неизвестный ответ от метода SCardTransmit WINSCARD.DLL на считывателе O2Micro с информацией о длине ответа

Для связи со смарт-картой я использую WINSCARD.DLL в качестве API для отправки команд APDU на смарт-карты. Для пары картридеров это работает, как и ожидалось, но почему-то я получаю неизвестный возврат (его нет на http://msdn.microsoft.com/en-us/library/ms936965.aspx) из метода SCardTransmit, если я отправлю команду на устройство чтения O2Micro.

Что работает: если я отправлю команду (значения в шестнадцатеричном формате):

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, и, возможно, как его решить или обойти.


person René    schedule 24.08.2011    source источник
comment
Исправьте орфографию в теме.   -  person leppie    schedule 24.08.2011


Ответы (1)


Ваш код ошибки является одним из окон Коды системных ошибок из winerror.h: ERROR_INVALID_PARAMETER. Это почти всегда означает, что ваши APDU в порядке, но проблема заключается в аргументах SCardTransmit. Рекомендую внимательно посмотреть на параметр pbRecvBuffer. Предостережение: я использовал функции SCard только с C++, а не с C#.

Функции ПК/SC могут возвращать стандартные коды ошибок Windows, а также коды ошибок, специфичные для ПК/SC. Обратите внимание на вызов FormatMessage: вы можете использовать его, чтобы сделать отчеты об ошибках немного более общими с предопределенными сообщениями об ошибках, предоставляемыми окнами.

person pb2q    schedule 24.08.2011
comment
Я вызываю функцию следующим образом: SCardTransmit((uint)Card, IntPtr.Zero , SendBuffer, (uint)SendBuffer.Length, IntPtr.Zero, RecvBuffer, ref RecvLength) RecvBuffer представляет собой массив байтов из 257 байтов, а RecvLength равен 0. Я также тестировал с RecvLength, равным 257. Но все равно это дает мне ту же ошибку. - person René; 25.08.2011
comment
Приложив некоторые усилия, я обнаружил, что методу SCardConnect был присвоен недопустимый предпочтительный протокол. Параметр dwPrefProtocol (четвертый в списке) был прописан как 1|2. Обычно он использует 2 в системах разработки и 1 в производственных системах. Я изменил его жестко, используя значение 2, и после этого он начал работать. Спасибо за помощь! - person René; 02.09.2011
comment
Вы пробовали с максимальным размером 255 байт? Я считаю, что это максимальное количество байтов для этой части... - person NKCSS; 21.06.2016