SCardGetAttrib 函数 (winscard.h)
SCardGetAttrib 函数检索给定句柄的当前读取器属性。 它不会影响读取器、驱动程序或卡的状态。
语法
LONG SCardGetAttrib(
[in] SCARDHANDLE hCard,
[in] DWORD dwAttrId,
[out] LPBYTE pbAttr,
[in, out] LPDWORD pcbAttrLen
);
参数
[in] hCard
从 SCardConnect 返回的引用值。
[in] dwAttrId
要获取 的属性 的标识符。 下表列出了 dwAttrId 的可能值。 这些值是只读的。 请注意,供应商可能并不支持所有属性。
值 | 含义 |
---|---|
|
(ATR) 字符串重置的答案。 |
|
DWORD 编码为 0xDDDDCCCC,其中 DDDD = 数据通道类型, CCCC = 通道编号:
|
|
指示支持哪些机械特征的 DWORD。 如果为零,则不支持任何特殊特征。 请注意,可以设置多个位:
|
|
当前块等待时间。 |
|
当前时钟速率,以 kHz 为单位。 |
|
当前字符等待时间。 |
|
比特率转换因子。 |
|
当前错误块控制编码。
0 = LRC) 检查 (纵向冗余 1 = 循环冗余检查 (CRC) |
|
时钟转换因子。 |
|
信息字段大小的当前字节大小卡。 |
|
信息字段大小设备的当前字节大小。 |
|
当前防护时间。 |
|
DWORD 编码为 0x0rrrpppp, 其中 rrr 为 RFU,应0x000。 pppp 对当前协议类型进行编码。 已设置的位表示当前正在使用哪个 ISO 协议。 (例如,如果设置了零位, 则 T=0 协议 有效。) |
|
当前工作等待时间。 |
|
默认时钟速率,以 kHz 为单位。 |
|
默认数据速率,以 bps 为单位。 |
|
读取器的显示名称。 |
|
保留供将来使用。 |
|
读取器的系统名称。 |
|
附加到计算机的此供应商的读取器的实例。 第一个实例是设备单元 0,下一个实例是单位 1 (如果它是同一品牌的读取器) ,则依此类举。 两个不同品牌的读取器都将具有此值的零。 |
|
单字节。 如果智能卡电接触未处于活动状态,则为零;如果接触处于活动状态,则为零。 |
|
指示智能卡状态的单字节: 0 = 不存在 1 = 卡存在但未吞咽 (仅当阅读器支持智能卡吞咽) 2 = 如果阅读器支持智能卡吞咽) ,则卡存在 (和吞咽 4 = 卡没收。 |
|
指示智能卡类型的单字节: 0 = 未知类型 1 = 7816 异步 2 = 7816 同步 其他值 RFU。 |
|
最大时钟速率,以 kHz 为单位。 |
|
最大数据速率,以 bps 为单位。 |
|
信息文件大小设备的最大字节数。 |
|
如果插入智能卡时设备不支持关机,则为零。 否则为非零。 |
|
DWORD 编码为 0x0rrrpppp ,其中 rrr 为 RFU,应0x000。 pppp 对支持的协议类型进行编码。 给定位位置中的“1”表示支持关联的 ISO 协议,因此,如果设置了位 0 和 1,则支持 T=0 和 T=1 协议。 |
|
供应商提供的接口设备序列号。 |
|
供应商提供的接口设备类型 (读取器) 的型号指定。 |
|
供应商提供的接口设备版本 (DWORD 格式为 0xMMmmbbbb ,其中 MM = 主要版本, mm = 次要版本, bbbb = 内部版本号) 。 |
|
供应商名称。 |
[out] pbAttr
指向缓冲区的指针,该缓冲区接收其 ID 在 dwAttrId 中提供的属性。 如果此值为 NULL, 则 SCardGetAttrib 将忽略 在 httpAttrLen 中提供的缓冲区长度,在此参数未为 NULL 的情况下写入 将返回的缓冲区长度,并返回成功代码。
[in, out] pcbAttrLen
pbAttr 缓冲区的长度(以字节为单位),接收接收的属性的实际长度 如果缓冲区长度指定为SCARD_AUTOALLOCATE,则 pbAttr 将转换为指向字节指针的指针,并接收包含该属性的内存块的地址。 此内存块必须使用 SCardFreeMemory 解除分配。
返回值
此函数根据是成功还是失败返回不同的值。
返回代码 | 说明 |
---|---|
|
SCARD_S_SUCCESS。 |
|
ERROR_NOT_SUPPORTED。 |
|
错误代码。 有关详细信息,请参阅 智能卡返回值。 |
注解
SCardGetAttrib 函数是直接卡访问函数。 有关其他直接访问函数的详细信息,请参阅 直接卡访问函数。
示例
以下示例演示如何检索卡读取器的属性。 该示例假定 hCardHandle 是从上一次调用 SCardConnect 函数中获得的有效句柄。
LPBYTE pbAttr = NULL;
DWORD cByte = SCARD_AUTOALLOCATE;
DWORD i;
LONG lReturn;
lReturn = SCardGetAttrib(hCardHandle,
SCARD_ATTR_VENDOR_NAME,
(LPBYTE)&pbAttr,
&cByte);
if ( SCARD_S_SUCCESS != lReturn )
{
if ( ERROR_NOT_SUPPORTED == lReturn )
printf("Value not supported\n");
else
{
// Some other error occurred.
printf("Failed SCardGetAttrib - %x\n", lReturn);
exit(1); // Or other appropriate action
}
}
else
{
// Output the bytes.
for (i = 0; i < cByte; i++)
printf("%c", *(pbAttr+i));
printf("\n");
// Free the memory when done.
// hContext was set earlier by SCardEstablishContext
lReturn = SCardFreeMemory( hContext, pbAttr );
}
要求
要求 | 值 |
---|---|
最低受支持的客户端 | Windows XP [仅限桌面应用] |
最低受支持的服务器 | Windows Server 2003 [仅限桌面应用] |
目标平台 | Windows |
标头 | winscard.h |
Library | Winscard.lib |
DLL | Winscard.dll |