- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
在 Windows >= XP 上使用 winscard
只有一个 PCSC 阅读器的句柄和上下文,是否有某种方法可以获取其设备实例 ID 或可以在 中使用的其他内容SetupDi*
API,用于找出为所述读卡器加载了哪个驱动程序。
SCardGetReaderDeviceInstanceId
仅在 Windows 8 上可用,所以不幸的是不适合我。
作为 B 计划,可以使用智能卡读卡器类 GUID 在 SetupDi
中枚举所有智能卡读卡器。但是我需要一个unique 属性来关联SCard*
API 和SetupDi*
API 之间的阅读器。例如,序列号听起来不错,但并非所有制造商都使用它。
有什么想法吗?
最佳答案
将 SCard 与 Setup 匹配的一种方法是打开驱动程序,然后使用 IOCTL_SMARTCARD_GET_ATTRIBUTE 查询 SCARD_ATTR_DEVICE_SYSTEM_NAME 并将其与通过 SCard API 匹配。
只有一个小问题。智能卡服务打开所有智能卡驱动程序而不共享。您首先需要停止智能卡服务,然后才能打开设备驱动程序。
另一种解决方案是使用 SCardControl 函数通过 SCard API 中的 IOCTL_xxx 调用来调用驱动程序。
这里的问题是,到目前为止我还没有找到一个 IOCTL_xxx 调用,我可以使用它来匹配来自设置 API 的任何属性。
我尝试了一个强力循环来扫描支持的 IOCTL_xxx 调用,但是 SCard api 在这样做时崩溃,并向事件查看器报告每个失败的 IOCTL_xxx 调用。
-- 更新--
IOCTL 支持以下标签:
SCARD_ATTR_VENDOR_NAMESCARD_ATTR_VENDOR_IFD_TYPESCARD_ATTR_VENDOR_IFD_VERSIONSCARD_ATTR_CHANNEL_IDSCARD_ATTR_PROTOCOL_TYPESSCARD_ATTR_DEFAULT_CLKSCARD_ATTR_MAX_CLKSCARD_ATTR_DEFAULT_DATA_RATESCARD_ATTR_MAX_DATA_RATESCARD_ATTR_MAX_IFSDSCARD_ATTR_POWER_MGMT_SUPPORTSCARD_ATTR_CHARACTERISTICSSCARD_ATTR_ICC_PRESENCESCARD_ATTR_ICC_INTERFACE_STATUSSCARD_ATTR_DEVICE_UNIT
下面是从 IOCTL 生成智能卡设备名称的代码,并通过 SCARD 也证明了两种方法之间的相似性
//------------------------------------------------------------------------------
// PROTOTYPES
//------------------------------------------------------------------------------
/* get the Smartcard DeviceName via IOCTL calls */
BOOL Smc_GetDeviceNameViaIOCTL(HANDLE,TCHAR*,UINT);
/* get the Smartcard DeviceName via SCARD calls */
BOOL Smc_GetDeviceNameViaSCARD(SCARDHANDLE,TCHAR*,UINT);
//------------------------------------------------------------------------------
// IMPLEMENTATIONS
//------------------------------------------------------------------------------
/************************************************/
/* get the Smartcard DeviceName via IOCTL calls */
/************************************************/
BOOL Smc_GetDeviceNameViaIOCTL(HANDLE in_hDev, TCHAR *out_Name, UINT in_MaxLen)
{
/* locals */
UINT lv_Pos;
DWORD lv_InBuf;
DWORD lv_ValLen;
DWORD lv_ChanID;
CHAR lv_OutBuf[256];
BOOL lv_Result;
// reserve space for eos
if (in_MaxLen-- <= 0)
return FALSE;
// init the position
lv_Pos = 0;
// set the tag
lv_InBuf = SCARD_ATTR_VENDOR_NAME;
// get the value
lv_Result = DeviceIoControl(
in_hDev, IOCTL_SMARTCARD_GET_ATTRIBUTE,
&lv_InBuf, sizeof(DWORD), lv_OutBuf, 256, &lv_ValLen, 0);
// fail?
if (!lv_Result)
return FALSE;
// check the length, including space
if (lv_Pos + lv_ValLen + 1 > in_MaxLen)
return FALSE;
// append to output
AChar2TCharCL(lv_OutBuf, lv_ValLen, &out_Name[lv_Pos], in_MaxLen-lv_Pos);
// update position
lv_Pos += lv_ValLen;
// append space
out_Name[lv_Pos++] = ' ';
// set the tag
lv_InBuf = SCARD_ATTR_VENDOR_IFD_TYPE;
// get the value
lv_Result = DeviceIoControl(
in_hDev, IOCTL_SMARTCARD_GET_ATTRIBUTE,
&lv_InBuf, sizeof(DWORD), lv_OutBuf, 256, &lv_ValLen, 0);
// fail?
if (!lv_Result)
return FALSE;
// check the length, including space
if (lv_Pos + lv_ValLen + 1 > in_MaxLen)
return FALSE;
// append to output
AChar2TCharCL(lv_OutBuf, lv_ValLen, &out_Name[lv_Pos], in_MaxLen-lv_Pos);
// update position
lv_Pos += lv_ValLen;
// append space
out_Name[lv_Pos++] = ' ';
// set the tag
lv_InBuf = SCARD_ATTR_DEVICE_UNIT;
// get the value
lv_Result = DeviceIoControl(
in_hDev, IOCTL_SMARTCARD_GET_ATTRIBUTE,
&lv_InBuf, sizeof(DWORD), &lv_ChanID, sizeof(DWORD), &lv_ValLen, 0);
// fail?
if (!lv_Result)
return FALSE;
// format as string
FormatStringA(lv_OutBuf, 256, "%d", lv_ChanID);
// check the length
if (lv_Pos + strlenA(lv_OutBuf) > in_MaxLen)
return FALSE;
// append to output
AChar2TCharC(lv_OutBuf, &out_Name[lv_Pos], in_MaxLen-lv_Pos);
// done
return TRUE;
}
/************************************************/
/* get the Smartcard DeviceName via SCARD calls */
/************************************************/
BOOL Smc_GetDeviceNameViaSCARD(SCARDHANDLE in_hCard, TCHAR *out_Name, UINT in_MaxLen)
{
/* locals */
UINT lv_Pos;
DWORD lv_InBuf;
DWORD lv_ValLen;
DWORD lv_ChanID;
CHAR lv_OutBuf[256];
UINT lv_hResult;
// reserve space for eos
if (in_MaxLen-- <= 0)
return FALSE;
// init the position
lv_Pos = 0;
// set the tag
lv_InBuf = SCARD_ATTR_VENDOR_NAME;
lv_ValLen = 256;
// get the value
lv_hResult = lib_SCardGetAttrib(in_hCard, lv_InBuf, (BYTE*)lv_OutBuf, &lv_ValLen);
// fail?
if (FAILED(lv_hResult))
return FALSE;
// check the length, including space
if (lv_Pos + lv_ValLen + 1 > in_MaxLen)
return FALSE;
// append to output
AChar2TCharCL(lv_OutBuf, lv_ValLen, &out_Name[lv_Pos], in_MaxLen-lv_Pos);
// update position
lv_Pos += lv_ValLen;
// append space
out_Name[lv_Pos++] = ' ';
// set the tag
lv_InBuf = SCARD_ATTR_VENDOR_IFD_TYPE;
lv_ValLen = 256;
// get the value
lv_hResult = lib_SCardGetAttrib(in_hCard, lv_InBuf, (BYTE*)lv_OutBuf, &lv_ValLen);
// fail?
if (FAILED(lv_hResult))
return FALSE;
// check the length, including space
if (lv_Pos + lv_ValLen + 1 > in_MaxLen)
return FALSE;
// append to output
AChar2TCharCL(lv_OutBuf, lv_ValLen, &out_Name[lv_Pos], in_MaxLen-lv_Pos);
// update position
lv_Pos += lv_ValLen;
// append space
out_Name[lv_Pos++] = ' ';
// set the tag
lv_InBuf = SCARD_ATTR_DEVICE_UNIT;
lv_ValLen = sizeof(DWORD);
// get the value
lv_hResult = lib_SCardGetAttrib(in_hCard, lv_InBuf, (BYTE*)&lv_ChanID, &lv_ValLen);
// fail?
if (FAILED(lv_hResult))
return FALSE;
// format as string
FormatStringA(lv_OutBuf, 256, "%d", lv_ChanID);
// check the length
if (lv_Pos + strlenA(lv_OutBuf) > in_MaxLen)
return FALSE;
// append to output
AChar2TCharC(lv_OutBuf, &out_Name[lv_Pos], in_MaxLen-lv_Pos);
// done
return TRUE;
}
关于windows - 如何找到 PCSC 阅读器的设备实例 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14253830/
我需要一个适用于 Linux 的软件模拟器 PC/SC 阅读器,但找不到。 我唯一找到的是 http://vsmartcard.sourceforge.net/ .但是这个库需要手机来模拟PC/SC设
在Windows中我们有函数SCardListCards 但是我正在 Linux 下使用 pcsclite 进行编程,如何在这里列出卡片? 卡牌名称、属性? 最佳答案 这只是对具有已知智能卡 ATR
我正在开发 C# Java Card(智能卡)程序,我正在尝试利用 PCSC-sharp github 上的库。 这是我的请求的“短/tl;dr”版本:PCSC-sharp 示例涵盖了 Iso7816
我正在尝试读取卡 UID/HCE来 self 的 pcsc java 代码的 android 设备 UID。但我收到以下错误 javax.smartcardio.CardException: sun.
在 Windows >= XP 上使用 winscard 只有一个 PCSC 阅读器的句柄和上下文,是否有某种方法可以获取其设备实例 ID 或可以在 中使用的其他内容SetupDi* API,用于找出
有人可以解释两者之间的区别/关系吗? 现在我正在使用 GPSShell + globalplatform + pcsclite 来操作支持 NFC 的卡。从我的角度来看(我对 libnfc 了解不多)
如果读卡器中没有卡,我在获取 PCSC 读卡器序列号时遇到问题。我正在使用winscard.dll 和c++。 以下代码仅适用于读卡器中存在卡的情况。否则,不会检索 SCardHandle。我还没有找
我正在使用 PCSC-lite v1.6.4 开发基于智能卡的应用程序。我需要一种方法来检测一旦智能卡从读卡器中取出,然后检测插入读卡器,以便智能卡将被强制再次完成特定过程。 如果可能,是否有任何基于
我有带有 SAM 插槽(安全访问模块)的 acr1281 读卡器。我可以使用 python 库通过 pc/sc 与卡通信 smartcard 。但我想向插入读卡器的 SAM 发送命令。 如何为此“切换
我已经成功地构建了一个程序,可以在 Linux 上使用 Qt 读取 Mifare 1K 卡。所以现在,我希望它能在 Windows 上运行。据我所知,Windows 上没有 PCSC-Lite 端口,
我一直在使用 pcsc-sharp 库开发一个小型智能卡扫描仪应用程序。该应用程序作为控制台应用程序运行时工作正常,代码如下: using System; using System.Colle
我正在尝试使用 PCSC 框架读取卡片。但它根本不返回任何内容。 import java.util.List; import javax.smartcardio.*; public class Blo
有没有人有将 pcsc-lite/ccid 移植到 Android 的经验?我不需要从应用程序层访问智能卡/读卡器,只需从 shell 即可。所以,只要我能让 pcscd 守护程序运行,就可以了。 我
问题:使用 JavaScript 将 APDU 从网页发送到 PCSC 阅读器。 我没有太多声誉来评论 question所以我要问新问题。 我已经尝试/搜索了专家提供的大部分解决方案。 questio
我有来自 Ingenico 的智能卡读卡器,试图让它在 Ubuntu 12.4 上运行。 64位 我已经安装了 pcsc lite 和 libusb 以及读卡器驱动程序SCL01x 非接触式读卡器 -
我正在从事 Raspberry Pi 项目。我正在尝试安装 driver package适用于 ACR1251U-A1 NFC 标签。 这个包需要先安装pcsc-lite包。但是据我在互联网上搜索后了
我目前正在从事一个项目,该项目要求我将 JavaCard 应用程序小程序 (.cap) 文件加载到 JavaCard。我们的框架是基于 Visual C++ 和 PCSC 的,因此我们需要将同一个小程
我有多个没有唯一序列号的 ACR122T 智能卡设备(来自 ACS)。我需要从 pcsc-lite 中知道我连接到哪个物理智能卡。我通过使用 lsusb 知道物理设备在哪个 USB 端口上,但是如何使
我们目前正在使用此设置: 硬件: phyFlex i.MX6 (Fsl ARM) 板。 液晶显示器 PR533 USB 评估板(ccid 兼容) 软件: yocto poky/oe 1.7,当前 di
我是一名优秀的程序员,十分优秀!