ScardTransmit всегда возвращает ошибку 16

Я пытаюсь создать приложение в Windows, используя библиотеку Winscard для связи с бесконтактным считывателем смарт-карт. Я могу подключиться к устройству, но когда я пытаюсь отправить некоторые данные с помощью scardtransmit, я получаю сообщение об ошибке 16. Я приложил фрагмент кода, который я использую ниже

SCARD_IO_REQUEST pioSendPci = *SCARD_PCI_T1;
//SCARD_IO_REQUEST pioSendPci = *SCARD_PCI_RAW;
DWORD dwRecvLength;
BYTE pbRecvBuffer[258];
BYTE cmd1[260];
cmd1[0]= 0xA0;
cmd1[1]= 0x0D;
cmd1[2]= 0x01;
cmd1[3]= 0x00;
cmd1[4]= 0x01;
ULONG sendbuflen= 0x05;
dwRecvLength = sizeof(pbRecvBuffer);

rv2 = SCardTransmit(hCard, &pioSendPci , cmd1,sendbuflen ,NULL, pbRecvBuffer, &dwRecvLength);

person user3317689    schedule 17.02.2014    source источник
comment
Как вы подключаетесь к картридеру (т.е. какие параметры используете)?   -  person Michael Roland    schedule 14.03.2014


Ответы (1)


Команда, которую вы пытаетесь отправить, не похожа на действительный APDU.

Действительный APDU (см. ISO/IEC 7816-4) имеет следующую форму (за исключением APDU увеличенной длины):

+--------+--------+--------+--------+--------+----------+--------+
| CLA    | INS    | P1     | P2     | [Lc]   | [DATA]   | [Le]   |
+--------+--------+--------+--------+--------+----------+--------+
| 1 Byte | 1 Byte | 1 Byte | 1 Byte | 1 Byte | Lc Bytes | 1 Byte |
+--------+--------+--------+--------+--------+----------+--------+

Где Lc содержит количество переданных команд DATA байт или пусто (т.е. нет Le), если нет DATA байт. Le кодирует количество байтов данных ожидаемого ответа, при этом специальный случай Le пустой указывает на отсутствие байтов данных ожидаемого ответа, а Le = 0x00 указывает на 256 (или максимум) байтов данных ожидаемого ответа.

person Michael Roland    schedule 14.03.2014