SCardTransmit

This function sends a service request to the smart card and expects to receive data back from the card.

LONG SCardTransmit(
IN SCARDHANDLE hCard, 
IN LPCSCARD_I0_REQUEST pioSendPci, 
IN LPCBYTE pbSendBuffer, 
IN DWORD cbSendLength, 
IN OUT LPSCARD_IO_REQUEST pioRecvPci, 
OUT LPBYTE pbRecvBuffer, 
IN OUT LPDWORD pcbRecvLength );

Parameters

  • hCard
    Handle to the reference value returned from SCardConnect.

  • pioSendPci
    Pointer to the protocol header structure for the instruction. This buffer is in the format of an SCARD_IO_REQUEST structure, followed by the specific protocol control information.

    For the T=0, T=1, and Raw protocols, the PCI structure is constant. The smart card subsystem supplies a global T=0, T=1, or Raw PCI structure, which you can reference by using the symbols SCARD_PCI_T0, SCARD_PCI_T1, and SCARD_PCI_RAW respectively.

  • pbSendBuffer
    Pointer to the actual data to be written to the card.

    For T=0, the data parameters are placed into the pbSendBuffer according to the following structure.

    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;
    

    Members

    bCla T=0 instruction class
    bIns Instruction code in the T=0 instruction class
    bP1, bP2 Reference codes completing the instruction code
    bP3 Number of data bytes which are to be transmitted during the command, per ISO 7816-4, Section 8.2.1.

    The data sent to the card should immediately follow the send buffer. In the special case where no data is sent to the card and no data is expected in return, bP3 is not sent.

  • cbSendLength
    Count of bytes that represent the length of the pbSendBuffer parameter.

    For T=0, in the special case where no data is sent to the card and no data expected in return, this length must reflect that the bP3 member is not being sent: the length should be sizeof(CmdBytes)sizeof(BYTE).

  • pioRecvPci
    Pointer to the protocol header structure for the instruction, followed by a buffer in which to receive any returned protocol control information (PCI) specific to the protocol in use. This parameter may be NULL if no returned PCI is desired.

  • pbRecvBuffer
    Pointer to any data returned from the card.

    For T=0, the data is immediately followed by the SW1 and SW2 status bytes. If no data is returned from the card, then this buffer will only contain the SW1 and SW2 status bytes.

  • pcbRecvLength
    Pointer to the length, in bytes, of the pbRecvBuffer parameter; receives the actual number of bytes received from the smart card.

    For T=0, the receive buffer must be at least two bytes long in order to receive the SW1 and SW2 status bytes.

Return Values

Value Description
Succeeds SCARD_S_SUCCESS
Fails An error value (see Smart Card Error values for a list of all error values)

Remarks

SCardTransmit is a smart card and reader access function.

  • T=0 Protocol Remarks
    For the T=0 protocol, the data received back are the SW1 and SW2 status codes, possibly preceded by response data. The following paragraphs provide information on the send and receive buffers used to transfer data and issue a command.

  • Sending data to the card
    To send n bytes of data to the card, where n>0, the send and receive buffers must be formatted as follows.

    The first four bytes of the pbSendBuffer buffer contain the CLA, INS, P1, and P2 values for the T=0 operation. The fifth byte is set to n: the size, in bytes, of the data to be transferred to the card. The next n bytes contain the data to be sent to the card.

    The cbSendLength parameter is set to the size of the T=0 header information (CLA, INS, P1 and P2) plus a byte containing the length of the data to be transferred (n), plus the size of data to be sent. In this example, this is n+5.

    The pbRecvBuffer receives the SW1 and SW2 status codes from the operation.

    The pcbRecvLength should be at least 2, and will be set to 2 upon return.

  • Obtaining data from the card
    To receive n>0 bytes of data from the card, the send and receive buffers must be formatted as follows.

    The first four bytes of the pbSendBuffer buffer contain the CLA, INS, P1, and P2 values for the T=0 operation. The fifth byte is set to n: the size, in bytes, of the data to be transferred from the card. If 256 bytes are to be transferred from the card, then this byte shall be set to 0.

    The cbSendLength parameter is set to 5, the size of the T=0 header information.

    The pbRecvBuffer receives the data returned from the card, immediately followed by the SW1 and SW2 status codes from the operation.

    The pcbRecvLength should be at least n+2, and will be set to n+2 upon return.

  • Issuing a command without exchanging data
    To issue a command to the card that does not involve the exchange of data (either sent or received), the send and receive buffers must be formatted as follows.

    The pbSendBuffer buffer contains the CLA, INS, P1, and P2 values for the T=0 operation. The P3 value is not sent. This differentiates the header from the case where 256 bytes are expected to be returned.

    The cbSendLength parameter is set to 4, the size of the T=0 header information (CLA, INS, P1, and P2).

    The pbRecvBuffer will receive the SW1 and SW2 status codes from the operation.

    The pcbRecvLength should be at least 2, and will be set to 2 upon return.

Requirements

Runs on Versions Defined in Include Link to
Windows CE OS 3.0 and later Winscard.h   Winscard.lib

Note   This API is part of the complete Windows CE OS package as provided by Microsoft. The functionality of a particular platform is determined by the original equipment manufacturer (OEM) and some devices may not support this API.

See Also

SCardConnect, SCARD_IO_REQUEST

 Last updated on Tuesday, July 13, 2004

© 1992-2000 Microsoft Corporation. All rights reserved.