1

我正在开发智能卡 UMDF Windows 驱动程序。我想实现以下行为:

通过使用 API 调用SCardListReaders列出所有连接的阅读器时,我想为每个连接的阅读器检索正确的友好名称。因此,例如,如果我有两个相同品牌的阅读器,我希望驱动程序将其返回:

SmartcardBrand USBReader 0
SmartcardBrand USBReader 1

我知道友好名称由属性组成,驱动SCARD_ATTR_VENDOR_NAME程序返回。SCARD_ATTR_VENDOR_IFD_TYPESCARD_ATTR_DEVICE_UNIT

我的问题是,在我的驱动程序中,我如何区分SmartcardBrand USBReader 0SmartcardBrand USBReader 1

SCARD_ATTR_DEVICE_UNIT当被要求时,我应该返回操作系统什么。我无法在驱动程序中使用和增加全局静态变量,因为每次连接新阅读器时都会启动一个新的 UMDF 主机进程(我可以在任务管理器中看到它),从而产生一个单独的新内存区域。

在 UMDF 驱动程序中计算设备实例的正确方法是什么?


我通过使用内存映射文件解决了这个问题。基本上,我的驱动程序的每个 UMDF 进程都会创建一个内存映射文件,其名称为读者的友好名称。当其他进程尝试创建具有相同名称的文件时,它表明驱动程序已在运行。

但是,当我连接使用我的驱动程序的阅读器,然后连接使用 Windows 本机驱动程序的阅读器时,会出现不一致。Windows 驱动程序将看不到我创建的内存映射文件并为其设备应用索引 0。

我发现,当加载 Windows 驱动程序时,它会SCARD_ATTR_VENDOR_IFD_TYPE从我的驱动程序(以及当前加载的所有其他驱动程序)SCARD_ATTR_VENDOR_IFD_TYPE查询。SCARD_ATTR_DEVICE_UNIT我想通过这种方式,Windows 驱动程序可以知道哪些设备单元被占用,并为它的阅读器应用一个免费的设备单元。

4

0 回答 0