Função SCardTransmit (winscard.h)

A função SCardTransmit envia uma solicitação de serviço para a cartão inteligente e espera receber dados de volta do cartão.

Sintaxe

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
);

Parâmetros

[in] hCard

Um valor de referência retornado da função SCardConnect .

[in] pioSendPci

Um ponteiro para a estrutura do cabeçalho do protocolo para a instrução. Esse buffer está no formato de uma estrutura de SCARD_IO_REQUEST , seguido pelas PCI (informações de controle de protocolo) específicas.

Para os protocolos T=0, T=1 e Raw, a estrutura PCI é constante. O subsistema smart cartão fornece uma estrutura T=0, T=1 ou PCI bruta global, que você pode referenciar usando os símbolos SCARD_PCI_T0, SCARD_PCI_T1 e SCARD_PCI_RAW respectivamente.

[in] pbSendBuffer

Um ponteiro para os dados reais a serem gravados no cartão.

Para T=0, os parâmetros de dados são colocados no endereço apontado por pbSendBuffer de acordo com a seguinte estrutura:

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;

Os dados enviados para o cartão devem seguir imediatamente o buffer de envio. No caso especial em que nenhum dado é enviado para o cartão e nenhum dado é esperado em troca, bP3 não é enviado.

Membro Significado
bCla
A classe de instrução T=0.
Caixas
Um código de instrução na classe de instrução T=0.
bP1, bP2
Códigos de referência que completam o código de instrução.
bP3
O número de bytes de dados a serem transmitidos durante o comando, por ISO 7816-4, Seção 8.2.1.

[in] cbSendLength

O comprimento, em bytes, do parâmetro pbSendBuffer .

Para T=0, no caso especial em que nenhum dado é enviado para o cartão e nenhum dado esperado em troca, esse comprimento deve refletir que o membro bP3 não está sendo enviado; o comprimento deve ser sizeof(CmdBytes) - sizeof(BYTE).

[in, out, optional] pioRecvPci

Ponteiro para a estrutura do cabeçalho do protocolo para a instrução, seguido por um buffer no qual receber qualquer PCI (informações de controle de protocolo) retornadas específicas para o protocolo em uso. Esse parâmetro poderá ser NULL se nenhuma PCI for retornada.

[out] pbRecvBuffer

Ponteiro para todos os dados retornados do cartão.

Para T=0, os dados são imediatamente seguidos pelos bytes de status SW1 e SW2. Se nenhum dado for retornado do cartão, esse buffer conterá apenas os bytes de status SW1 e SW2.

[in, out] pcbRecvLength

Fornece o comprimento, em bytes, do parâmetro pbRecvBuffer e recebe o número real de bytes recebidos da cartão inteligente.

Esse valor não pode ser SCARD_AUTOALLOCATE porque sCardTransmit não dá suporte a SCARD_AUTOALLOCATE.

Para T=0, o buffer de recebimento deve ter pelo menos dois bytes de comprimento para receber os bytes de status SW1 e SW2.

Valor retornado

Se a função enviar com êxito uma solicitação de serviço para a cartão inteligente, o valor retornado será SCARD_S_SUCCESS.

Se a função falhar, será exibido um código de erro. Para obter mais informações, consulte Valores retornados do cartão inteligente.

Comentários

A função SCardTransmit é uma função de acesso inteligente cartão e leitor. Para obter informações sobre outras funções de acesso, consulte Funções de acesso de cartão inteligente e leitor.

Para o protocolo T=0, os dados recebidos de volta são os códigos sw1 e SW2 status, possivelmente precedidos por dados de resposta. Os parágrafos a seguir fornecem informações sobre os buffers de envio e recebimento usados para transferir dados e emitir um comando.

Exemplos

O exemplo a seguir mostra o envio de uma solicitação de serviço para o cartão inteligente.

//  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
}

Requisitos

   
Cliente mínimo com suporte Windows XP [somente aplicativos da área de trabalho]
Servidor mínimo com suporte Windows Server 2003 [somente aplicativos da área de trabalho]
Plataforma de Destino Windows
Cabeçalho winscard.h
Biblioteca Winscard.lib
DLL Winscard.dll

Confira também

SCARD_IO_REQUEST

Scardconnect