SCardTransmit возвращает ERROR_INVALID_PARAMETER, когда dwMaxCCIDMessageLength превышает 4 КБ.

Я разрабатываю usb-смарт-карту и использую Windows PC/SC API для передачи данных с помощью этой смарт-карты. Это часть моего кода:

if(SCardConnect(hSC, sCard, SCARD_SHARE_EXCLUSIVE, SCARD_PROTOCOL_T1, &hCard, &dwActiveProtocol) == SCARD_S_SUCCESS)
{
    if(SCardTransmit(hCard, SCARD_PCI_T1, pSendBuf, ulSendBufLen, SCARD_PCI_T1, pRecBuf, pulRecBufLen) == SCARD_S_SUCCESS)
    {
        //do something
    }
}

Я уверен, что размер и указатели на оба входных и выходных буфера допустимы.

Пока поле dwMaxCCIDMessageLength дескриптора устройства меньше 0x00001000h, проблем нет, и программа работает нормально, но когда я увеличиваю его до большего значения (более 4 КБ), SCardTransmit завершается с ошибкой с кодом результата ERROR_INVALID_PARAMETER.

В настоящее время я знаю, что содержимое pSendBuf было успешно получено смарт-картой и обработка содержимого завершена, но когда карта хочет вернуть ответ, возникает эта ошибка, и я думаю, что это какая-то несогласованность (например, ограничение размера буфера) в ПК /SC драйвер.

Кто-нибудь может мне помочь?


person Ehsan Khodarahmi    schedule 29.03.2013    source источник


Ответы (1)


То, что драйвер является узким местом, маловероятно, и, учитывая, что у вас есть интерфейс USB, я бы также не стал предполагать, что уровень протокола вызывает подозрения. Это оставляет микросхему смарт-карты в качестве главного подозреваемого, и, поскольку многие новые микросхемы имеют в общей сложности 8 КБ ОЗУ, я нахожу понятным, что они не выделяют большую ее часть для буфера ввода-вывода. Не имея представления о затронутой команде, я бы посоветовал попробовать цепочку или чтение файла по частям.

person guidot    schedule 29.03.2013