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


Функция 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 не отправляется.

Член Meaning
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 [только классические приложения]
целевая платформа Виндоус
Header winscard.h
Library Winscard.lib
DLL Winscard.dll

См. также

SCARD_IO_REQUEST

SCardConnect