如何构建PCSC智能卡读卡器“友好名称”?

我使用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_MACHINE\SYSTEM\CurrentControlSet\Services键。 在此密钥下,您可以找到与读卡器的“服务”(我通过查询WMI注册表找到)匹配的子项。 例如: SCM Microsystems Inc. SCR3320 USB Smart Card Reader读卡器的服务是SCR3XX2K

这个子键( SCR3XX2K )有另一个子键Enum ,它有多个有趣的值:

  • Count :DWORD,连接的读者数量
  • 0 :STRING,硬件设备ID

我想这些是附加到’友好名称’的数字,但我无法弄清楚如何构造名称字符串。 我需要这个将硬件设备ID(我通过WMI)映射到他们的友好名称。

那么,用于为智能卡读卡器创建“友好名称”的模式是什么?这些值来自何处?

它们是这三个属性的联合体:

 SCARD_ATTR_VENDOR_NAME SCARD_ATTR_VENDOR_IFD_TYPE SCARD_ATTR_DEVICE_UNIT 

TechNet文章智能卡事件在“智能卡读卡器名称”部分中对此进行了说明。

SCARD_??? 使用SCardGetAttrib 函数请求属性。

SCARD_ATTR_DEVICE_SYSTEM_NAME属性返回friendly name就像列出读者时所获得的friendly name一样。

SmartCard读卡器列表存在于HKLM\SOFTWARE\Microsoft\Cryptography\Calais\Readers下的注册表中。 读取器由SCR驱动程序的INF文件添加到此列表中,因此在驱动程序安装期间。

设备和阅读器之间的链接可以在HKLM\SYSTEM\CurrentControlSet\Control\Class\{50DD5230-BA8A-11D1-BF5D-0000F805F5‌​30}下的SmartCardReader类{50DD5230-BA8A-11D1-BF5D-0000F805F530} HKLM\SYSTEM\CurrentControlSet\Control\Class\{50DD5230-BA8A-11D1-BF5D-0000F805F5‌​30}