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=0T=1 和原始协议,PCI 结构是恒定的。 智能卡子系统提供全局 T=0、T=1 或原始 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 指令类中的指令代码。
bP1bP2
引用完成指令代码的代码。
bP3
命令期间要传输的数据字节数,符合 ISO 7816-4 第 8.2.1 节。

[in] cbSendLength

pbSendBuffer 参数的长度(以字节为单位)。

对于 T=0,在未将数据发送到卡且不需要返回任何数据的特殊情况下,此长度必须反映未发送 bP3 成员;长度应为 sizeof(CmdBytes) - sizeof(BYTE)

[in, out, optional] pioRecvPci

指向指令的协议标头结构的指针,后跟一个缓冲区,该缓冲区接收任何返回的协议控制信息, (PCI) 特定于正在使用的协议。 如果未返回 PCI,此参数可以为 NULL

[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
标头 winscard.h
Library Winscard.lib
DLL Winscard.dll

另请参阅

SCARD_IO_REQUEST

SCardConnect