智能卡驱动程序库回调例程
智能卡体系结构定义了一组标准回调例程类型。 有关这些例程的详细信息,请参阅 智能卡驱动程序回调。
读取器驱动程序必须将这些回调例程提供给驱动程序库例程 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 数组中的索引。 该表还简要介绍了每种例程类型,并指示读取器驱动程序实现例程是强制性的还是可选的。
索引 | 相应回调例程的说明 | 读取器驱动程序实现 |
---|---|---|
重置或关闭插入的智能卡 |
必需 |
|
弹出插入的智能卡 |
可选 |
|
安装事件处理程序以跟踪卡插入和删除 |
必需 |
|
执行特定于供应商的 IOCTL 操作 |
可选 |
|
做机械吞咽 |
可选 |
|
为卡读取器中的卡选择传输协议 |
必需 |
|
执行数据传输 |
必需 |
读取器驱动程序调用这些例程时,应从输入缓冲区检索调用参数,如 智能卡驱动程序回调中所述。 读取器驱动程序还应将输出数据存储在相应的缓冲区区域,如同一部分所述。
当除卡跟踪回调例程以外的任何回调例程返回STATUS_PENDING时,智能卡库将停止处理来自读取器驱动程序的任何进一步调用。 (有关卡跟踪回调例程的信息,请参阅 RDF_CARD_TRACKING.) 如果读取器驱动程序尝试在库处于此状态时使用驱动程序库例程,则库例程将返回STATUS_DEVICE_BUSY状态。 这实际上可以防止读取器驱动程序为来自资源管理器的 IOCTL 请求提供服务,因为读取器驱动程序如果无法调用 SmartcardDeviceControl,则无法处理 IOCTL 请求。