SMARTCARD_EXTENSION 结构 (smclib.h)
智能卡读取器驱动程序和智能卡驱动程序库都使用SMARTCARD_EXTENSION结构来访问所有其他智能卡数据结构。
语法
typedef struct _SMARTCARD_EXTENSION {
ULONG Version;
VENDOR_ATTR VendorAttr;
NTSTATUS( *ReaderFunction[16];
SCARD_CARD_CAPABILITIES CardCapabilities;
ULONG LastError;
struct {
PULONG Information;
PUCHAR RequestBuffer;
ULONG RequestBufferLength;
PUCHAR ReplyBuffer;
ULONG ReplyBufferLength;
} IoRequest;
ULONG MajorIoControlCode;
ULONG MinorIoControlCode;
POS_DEP_DATA OsData;
SCARD_READER_CAPABILITIES ReaderCapabilities;
PREADER_EXTENSION ReaderExtension;
SMARTCARD_REPLY SmartcardReply;
SMARTCARD_REQUEST SmartcardRequest;
T0_DATA T0;
T1_DATA T1;
PPERF_INFO PerfInfo;
ULONG Reserved[25 - sizeof(PPERF_INFO)];
} *PSMARTCARD_EXTENSION, SMARTCARD_EXTENSION;
成员
Version
指示此结构的版本。
VendorAttr
包含标识读取器驱动程序的信息,例如供应商名称、单位编号和序列号。
ReaderFunction[16]
语法块中的行应为 NTSTATUS (*ReaderFunction[16])(PSMARTCARD_EXTENSION);
指向读取器回调函数数组的指针。 供应商提供的读取器驱动程序可以实现的回调函数。 读取器驱动程序使这些回调函数可供智能卡库例程 SmartcardDeviceControl 调用,方法是将指向它们的指针存储在智能卡设备扩展中。
- RDF_ATR_PARSE
- RDF_CARD_EJECT
- RDF_CARD_POWER
- RDF_CARD_TRACKING
- RDF_IOCTL_VENDOR
- RDF_READER_SWALLOW
- RDF_SET_PROTOCOL
- RDF_TRANSMIT
CardCapabilities
包含插入的智能卡的功能。
LastError
未使用。
IoRequest
具有以下成员的 结构:
IoRequest.Information
包含返回的字节数。
IoRequest.RequestBuffer
指向要发送到卡的用户 I/O 请求中的数据的指针。
IoRequest.RequestBufferLength
指示要发送到卡的字节数。
IoRequest.ReplyBuffer
指向缓冲区的指针,该缓冲区保存 I/O 请求返回的数据。
IoRequest.ReplyBufferLength
指示 I/O 请求返回的数据的字节数。
MajorIoControlCode
包含主要的 I/O 控制代码。
MinorIoControlCode
包含次要 I/O 控制代码。
OsData
包含特定于操作系统和驱动程序类型的信息。
ReaderCapabilities
包含键盘阅读器的功能。
ReaderExtension
包含特定于智能卡读取器的数据。
SmartcardReply
包含来自读取器的数据。
SmartcardRequest
包含当前命令和发送到智能卡的数据。
T0
包含用于 T=0 协议的数据。
T1
包含与 T=1 协议一起使用的数据。
PerfInfo
Reserved[25 - sizeof(PPERF_INFO)]
预留给系统使用。
注解
此结构将传递给所有回调函数。
单个回调函数由一系列常量值标识,这些常量值应用作 ReaderFunction 数组中的索引。
索引 | 描述 | ||||||||
---|---|---|---|---|---|---|---|---|---|
RDF_ATR_PARSE | 可选。 当驱动程序库无法识别或分析智能卡驱动程序库时,RDF_ATR_PARSE分析函数会分析智能卡驱动程序库的重置 (ATR) 。 | ||||||||
RDF_CARD_EJECT | 可选。 RDF_CARD_EJECT 回调函数 RDF_CARD_EJECT回调函数从读取器中弹出插入的智能卡。 |
||||||||
RDF_CARD_POWER | RDF_CARD_POWER回调函数重置或关闭插入的智能卡。智能卡读取器驱动程序必须实现此回调函数。
输入时, SmartcardExtension 指向的结构应具有以下成员值:
|
||||||||
RDF_CARD_TRACKING | RDF_CARD_TRACKING回调函数安装事件处理程序,用于跟踪每次在卡读取器中插入或删除卡。智能卡读取器驱动程序必须实现此回调函数。
收到IOCTL_SMARTCARD_IS_PRESENT请求后,驱动程序库将确定智能卡是否已存在。 如果存在智能卡,驱动程序库会以STATUS_SUCCESS状态完成请求。 如果没有智能卡,驱动程序库将调用读取器驱动程序的智能卡跟踪回调函数,读取器驱动程序开始查找智能卡。 启动智能卡跟踪后,驱动程序库会将请求标记为具有STATUS_PENDING状态。 驱动程序库完成请求。 WDM 设备驱动程序 相应的 WDM 驱动程序库将指针添加到 SmartcardExtension-OsData-NotificationIrp>> 中的请求。 读取器驱动程序必须在检测到已插入或删除智能卡后立即完成请求。 读取器驱动程序通过调用 IoCompleteRequest 来完成请求,之后,读取器驱动程序必须将 SmartcardExtension -> OsData 的 NotificationIrp 成员重新设置为 NULL,以通知驱动程序库读取器驱动程序可以接受进一步的智能卡跟踪请求。 由于此调用可能具有无限期的持续时间,并且调用方可以在请求完成之前终止请求,因此将此 IRP 标记为可取消非常重要。
|
||||||||
RDF_IOCTL_VENDOR | RDF_IOCTL_VENDOR回调函数执行供应商特定的 IOCTL 操作。智能卡读取器驱动程序可以选择实现此回调函数。
输入时,调用方必须将以下值传递给函数:
|
||||||||
RDF_READER_SWALLOW | RDF_READER_SWALLOW回调函数执行机械吞咽,这是智能卡完全插入智能卡读取器时发生的情况。智能卡读取器驱动程序实现此回调函数是可选的。 | ||||||||
RDF_SET_PROTOCOL | RDF_SET_PROTOCOL回调函数为插入的智能卡选择传输协议。智能卡读取器驱动程序必须实现此回调函数。
在输入时,调用方必须将以下值传递给函数:
|
||||||||
RDF_TRANSMIT | RDF_TRANSMIT回调函数执行数据传输。智能卡读取器驱动程序必须实现此回调函数。
在输入时,调用方必须将以下值传递给函数:
dwProtocol 成员必须包含调用 IOCTL_SMARTCARD_SET_PROTOCOL 返回的协议标识符。 cbPciLength 成员包含SCARD_IO_REQUEST结构的大小(以字节为单位)。 此结构的大小通常为 8 个字节。 SCARD_IO_REQUEST结构后跟 (协议) 要传输到卡的数据。 根据用于传输的协议,该库提供了多个支持函数。 有关这些支持函数的详细信息,请参阅 SmartcardT0Request (WDM) 和 SmartcardT1Request (WDM) 。 RequestBuffer 和 ReplyBuffer 指向同一系统缓冲区。 如果使用库函数 SmartcardxxRequest 和 SmartcardxxReply,则不会覆盖输入缓冲区。 如果不使用这些函数,请在开始传输之前复制 RequestBuffer 。 必须将SCARD_IO_REQUEST结构复制到 ReplyBuffer 参数,后跟从卡接收的数据。 同样,如果使用 SmartcardxxRequest 和 SmartcardxxReply 函数,则库将为你复制结构。 |
要求
要求 | 值 |
---|---|
Header | smclib.h (包括 Smclib.h) |