智能卡读取器驱动程序和智能卡驱动程序库都使用 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 的 NotificationIrp 成员 -> OsData 回到 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 函数,库将复制结构。 |
要求
要求 | 价值 |
---|---|
标头 | smclib.h (包括 Smclib.h) |