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

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

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

例如,如果希望 SmartcardDeviceControl 在读取器驱动程序中调用名为 DriverCardPower 的回调例程,只要它处理 完IOCTL_SMARTCARD_POWER 请求,则必须使用 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 请求提供服务,因为读取器驱动程序无法处理 IOCTL 请求(如果无法调用 SmartcardDeviceControl)。