Compartir a través de


Función SCardTransmit (winscard.h)

La función SCardTransmit envía una solicitud de servicio a la tarjeta inteligente y espera recibir datos de vuelta de la tarjeta.

Sintaxis

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

Valor de referencia devuelto por la función SCardConnect .

[in] pioSendPci

Puntero a la estructura del encabezado de protocolo para la instrucción . Este búfer tiene el formato de una estructura de SCARD_IO_REQUEST , seguido de la información de control de protocolo específica (PCI).

Para los protocolos T=0, T=1 y Raw, la estructura PCI es constante. El subsistema de tarjeta inteligente proporciona una estructura T=0, T=1 o PCI sin formato, a la que puede hacer referencia mediante los símbolos SCARD_PCI_T0, SCARD_PCI_T1 y SCARD_PCI_RAW respectivamente.

[in] pbSendBuffer

Puntero a los datos reales que se van a escribir en la tarjeta.

Para T=0, los parámetros de datos se colocan en la dirección a la que apunta pbSendBuffer según la estructura siguiente:

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;

Los datos enviados a la tarjeta deben seguir inmediatamente el búfer de envío. En el caso especial en el que no se envía ningún dato a la tarjeta y no se espera ningún dato a cambio, bP3 no se envía.

Miembro Significado
bCla
Clase de instrucción T=0.
Contenedores
Código de instrucción en la clase de instrucción T=0.
bP1, bP2
Códigos de referencia que completan el código de instrucción.
bP3
Número de bytes de datos que se van a transmitir durante el comando, según iso 7816-4, sección 8.2.1.

[in] cbSendLength

Longitud, en bytes, del parámetro pbSendBuffer .

Para T=0, en el caso especial en el que no se envía ningún dato a la tarjeta y no se espera ningún dato a cambio, esta longitud debe reflejar que no se envía el miembro bP3 ; la longitud debe ser sizeof(CmdBytes) - sizeof(BYTE).

[in, out, optional] pioRecvPci

Puntero a la estructura del encabezado de protocolo para la instrucción, seguida de un búfer en el que recibir cualquier información de control de protocolo (PCI) devuelta específica del protocolo en uso. Este parámetro puede ser NULL si no se devuelve pci.

[out] pbRecvBuffer

Puntero a los datos devueltos de la tarjeta.

Para T=0, los datos van seguidos inmediatamente de los bytes de estado SW1 y SW2. Si no se devuelve ningún dato de la tarjeta, este búfer solo contendrá los bytes de estado SW1 y SW2.

[in, out] pcbRecvLength

Proporciona la longitud, en bytes, del parámetro pbRecvBuffer y recibe el número real de bytes recibidos de la tarjeta inteligente.

Este valor no se puede SCARD_AUTOALLOCATE porque SCardTransmit no admite SCARD_AUTOALLOCATE.

Para T=0, el búfer de recepción debe tener al menos dos bytes de longitud para recibir los bytes de estado SW1 y SW2.

Valor devuelto

Si la función envía correctamente una solicitud de servicio a la tarjeta inteligente, el valor devuelto se SCARD_S_SUCCESS.

Si la función presenta un error, devuelve un código de error. Para obtener más información, consulte Valores devueltos de tarjeta inteligente.

Comentarios

La función SCardTransmit es una función de acceso de lector y tarjeta inteligente. Para obtener información sobre otras funciones de acceso, consulte Funciones de acceso de lector y tarjeta inteligente.

Para el protocolo T=0, los datos recibidos son los códigos de estado SW1 y SW2, posiblemente precedidos por los datos de respuesta. Los párrafos siguientes proporcionan información sobre los búferes de envío y recepción usados para transferir datos y emitir un comando.

Ejemplos

En el ejemplo siguiente se muestra cómo enviar una solicitud de servicio a la tarjeta 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 compatible Windows XP [solo aplicaciones de escritorio]
Servidor mínimo compatible Windows Server 2003 [solo aplicaciones de escritorio]
Plataforma de destino Windows
Encabezado winscard.h
Library Winscard.lib
Archivo DLL Winscard.dll

Consulte también

SCARD_IO_REQUEST

SCardConnect