智能卡驱动程序库回调例程

智能卡体系结构定义了一组标准回调例程类型。 有关这些例程的详细信息,请参阅 智能卡驱动程序回调

读取器驱动程序必须将这些回调例程提供给驱动程序库例程 SmartcardDeviceControl (WDM) 调用,方法是将指向它们的指针存储在智能卡设备扩展(SMARTCARD_EXTENSION类型)。 这些指针存储在位于 SMARTCARD_EXTENSION 结构的 ReaderFunction 成员中的数组中。 单个回调例程可以通过一系列常量值进行标识,这些常量值应用作 ReaderFunction 数组中的索引。

例如,如果希望 SmartcardDeviceControl 在读取器驱动程序完成处理IOCTL_SMARTCARD_POWER请求时调用名为 DriverCardPower 的回调例程,则必须使用 RDF_CARD_POWER 常量按以下方式初始化设备扩展:

SmartcardExtension->ReaderFunction[RDF_CARD_POWER] = 
DriverCardPower;

RDF_CARD_POWER是一个固定的系统定义的常量,始终对应于为IOCTL_SMARTCARD_POWER请求提供服务的回调例程。

如果与正在处理的 IOCTL 对应的 ReaderFunction 数组的成员为 NULL则 SmartcardDeviceControl 会向读取器驱动程序返回STATUS_NOT_SUPPORTED状态。 在某些情况下,此行为很有用。 例如,如果驱动程序不支持卡弹出或卡吞咽,只需将 ReaderFunction 数组的相应成员指定为 NULL然后 SmartcardDeviceControl 将在调用该成员例程时返回STATUS_NOT_SUPPORTED。

下表列出了标识各种类型的回调例程的常量。 这些常量应用作 ReaderFunction 数组中的索引。 该表还简要介绍了每种例程类型,并指示读取器驱动程序实现例程是强制性的还是可选的。

索引 相应回调例程的说明 读取器驱动程序实现

RDF_CARD_POWER

重置或关闭插入的智能卡

必需

RDF_CARD_EJECT

弹出插入的智能卡

可选

RDF_CARD_TRACKING

安装事件处理程序以跟踪卡插入和删除

必需

RDF_IOCTL_VENDOR

执行特定于供应商的 IOCTL 操作

可选

RDF_READER_SWALLOW

做机械吞咽

可选

RDF_SET_PROTOCOL

为卡读取器中的卡选择传输协议

必需

RDF_TRANSMIT

执行数据传输

必需

读取器驱动程序调用这些例程时,应从输入缓冲区检索调用参数,如 智能卡驱动程序回调中所述。 读取器驱动程序还应将输出数据存储在相应的缓冲区区域,如同一部分所述。

当除卡跟踪回调例程以外的任何回调例程返回STATUS_PENDING时,智能卡库将停止处理来自读取器驱动程序的任何进一步调用。 (有关卡跟踪回调例程的信息,请参阅 RDF_CARD_TRACKING.) 如果读取器驱动程序尝试在库处于此状态时使用驱动程序库例程,则库例程将返回STATUS_DEVICE_BUSY状态。 这实际上可以防止读取器驱动程序为来自资源管理器的 IOCTL 请求提供服务,因为读取器驱动程序如果无法调用 SmartcardDeviceControl,则无法处理 IOCTL 请求。