我使用 WinSCard 列出所有读者,这给了我这样的列表:
ASK RDR4x7 0
SCM Microsystems Inc. SCR3320 USB Smart Card Reader 0
SCM Microsystems Inc. SCR3320 USB Smart Card Reader 1
SCM Microsystems Inc. SCR3320 USB Smart Card Reader 2
这很好,但我不知道哪个名字属于哪个读卡器。
这些名字从何而来?它们是如何构建的?
到目前为止,我发现的是:在注册表中,有一个HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServices
密钥。在此注册表项下,您可以找到与读卡器的"服务"匹配的子项(我通过查询WMI注册表找到该服务)。例如:SCM Microsystems Inc. SCR3320 USB Smart Card Reader
读者的服务是SCR3XX2K
。
这个子项(SCR3XX2K
)有另一个子项Enum
,它有多个有趣的值:
-
Count
:DWORD,连接的读卡器数量 -
0
,1
,2
: 字符串, 硬件设备 ID
我想这些是附加到"友好名称"的数字,但我无法弄清楚名称字符串是如何构造的。我需要它将硬件设备 ID(我通过 WMI 获得)映射到它们的友好名称。
那么,用于为智能卡读卡器创建"友好名称"的模式是什么,这些值来自哪里?
它们是这 3 个属性的串联:
SCARD_ATTR_VENDOR_NAME
SCARD_ATTR_VENDOR_IFD_TYPE
SCARD_ATTR_DEVICE_UNIT
TechNet 文章智能卡事件在"智能卡读卡器名称"部分中对此进行了记录。
SCARD_???
属性是使用 SCardGetAttrib
函数请求的。
SCARD_ATTR_DEVICE_SYSTEM_NAME
属性返回的friendly name
与您在列出读取器时获得的一样。
智能卡读卡器的列表存在于注册表中的 HKLMSOFTWAREMicrosoftCryptographyCalaisReaders
下。读取器由 SCR 驱动程序的 INF 文件添加到此列表中,因此在驱动程序安装期间。
设备和读卡器之间的链接可以在智能卡读取器类中找到 {50DD5230-BA8A-11D1-BF5D-0000F805F530}
HKLMSYSTEMCurrentControlSetControlClass{50DD5230-BA8A-11D1-BF5D-0000F805F530}
下。