Поделиться через


Функция SCardTransmit (winscard.h)

Функция SCardTransmit отправляет запрос на обслуживание смарт-карта и ожидает обратного получения данных из карта.

Синтаксис

LONG SCardTransmit(
  [in]                SCARDHANDLE         hCard,
  [in]                LPCSCARD_IO_REQUEST pioSendPci,
  [in]                LPCBYTE             pbSendBuffer,
  [in]                DWORD               cbSendLength,
  [in, out, optional] LPSCARD_IO_REQUEST  pioRecvPci,
  [out]               LPBYTE              pbRecvBuffer,
  [in, out]           LPDWORD             pcbRecvLength
);

Параметры

[in] hCard

Ссылочное значение, возвращаемое функцией SCardConnect .

[in] pioSendPci

Указатель на структуру заголовков протокола для инструкции. Этот буфер имеет формат структуры SCARD_IO_REQUEST , за которой следует определенная информация об управлении протоколом (PCI).

Для протоколов T=0, T=1 и Raw структура PCI является константой. Подсистема интеллектуального карта предоставляет глобальную структуру T=0, T=1 или raw PCI, на которую можно ссылаться с помощью символов SCARD_PCI_T0, SCARD_PCI_T1 и SCARD_PCI_RAW соответственно.

[in] pbSendBuffer

Указатель на фактические данные для записи в карта.

Для T=0 параметры данных помещаются в адрес, на который указывает pbSendBuffer , в соответствии со следующей структурой:

struct {
    BYTE
        bCla,   // the instruction class
        bIns,   // the instruction code 
        bP1,    // parameter to the instruction
        bP2,    // parameter to the instruction
        bP3;    // size of I/O transfer
} CmdBytes;

Данные, отправляемые в карта, должны немедленно следовать за буфером отправки. В особом случае, когда данные не отправляются в карта и данные не ожидаются взамен, bP3 не отправляется.

Член Значение
bCla
Класс инструкций T=0.
Бункеров
Код инструкции в классе инструкций T=0.
bP1, bP2
Справочные коды, которые завершают код инструкции.
bP3
Количество байтов данных, передаваемых во время выполнения команды, в соответствии с ISO 7816-4, раздел 8.2.1.

[in] cbSendLength

Длина параметра pbSendBuffer в байтах.

Для T=0 в особом случае, когда данные не отправляются в карта и данные не ожидаются взамен, эта длина должна отражать, что элемент bP3 не отправляется; длина должна быть sizeof(CmdBytes) - sizeof(BYTE)равна .

[in, out, optional] pioRecvPci

Указатель на структуру заголовков протокола для инструкции, за которым следует буфер, в котором будут приниматься все возвращаемые сведения о контроле протокола (PCI), относящиеся к используемому протоколу. Этот параметр может иметь значение NULL , если pci не возвращается.

[out] pbRecvBuffer

Указатель на все данные, возвращенные из карта.

Для T=0 за данными сразу же следуют байты состояния SW1 и SW2. Если данные из карта не возвращаются, этот буфер будет содержать только байты состояния SW1 и SW2.

[in, out] pcbRecvLength

Предоставляет длину параметра pbRecvBuffer в байтах и получает фактическое количество байтов, полученных от смарт-карта.

Это значение не может быть SCARD_AUTOALLOCATE, так как SCardTransmit не поддерживает SCARD_AUTOALLOCATE.

Для T=0 буфер получения должен иметь длину не менее двух байт, чтобы получить байты состояния SW1 и SW2.

Возвращаемое значение

Если функция успешно отправляет запрос на обслуживание смарт-карта, возвращаемое значение будет SCARD_S_SUCCESS.

Если функция завершается сбоем, она возвращает код ошибки. Дополнительные сведения см. в разделе Возвращаемые значения смарт-карты.

Комментарии

Функция SCardTransmit — это смарт-карта и функция доступа для чтения. Дополнительные сведения о других функциях доступа см. в разделе Функции доступа к смарт-картам и читателю.

Для протокола T=0 обратно полученные данные представляют собой коды состояния SW1 и SW2, которым, возможно, предшествуют данные ответа. В следующих абзацах содержатся сведения о буферах отправки и получения, используемых для передачи данных и выполнения команды.

Примеры

В следующем примере показана отправка запроса на обслуживание в смарт-карта.

//  Transmit the request.
//  lReturn is of type LONG.
//  hCardHandle was set by a previous call to SCardConnect.
//  pbSend points to the buffer of bytes to send.
//  dwSend is the DWORD value for the number of bytes to send.
//  pbRecv points to the buffer for returned bytes.
//  dwRecv is the DWORD value for the number of returned bytes.
lReturn = SCardTransmit(hCardHandle,
                        SCARD_PCI_T0,
                        pbSend,
                        dwSend,
                        NULL,
                        pbRecv,
                        &dwRecv );
if ( SCARD_S_SUCCESS != lReturn )
{
    printf("Failed SCardTransmit\n");
    exit(1);   // or other appropriate error action
}

Требования

   
Минимальная версия клиента Windows XP [только классические приложения]
Минимальная версия сервера Windows Server 2003 [только классические приложения]
Целевая платформа Windows
Header winscard.h
Библиотека Winscard.lib
DLL Winscard.dll

См. также раздел

SCARD_IO_REQUEST

SCardConnect