Поделиться через


Процедуры обратного вызова библиотеки драйверов смарт-карт

Архитектура интеллектуального карта определяет набор стандартных типов процедур обратного вызова. Дополнительные сведения об этих процедурах см. в разделе Обратные вызовы драйвера смарт-карт.

Драйвер средства чтения должен сделать эти процедуры обратного вызова доступными для процедуры библиотеки драйверов SmartcardDeviceControl (WDM) для вызова путем сохранения указателей на них в расширении устройства смарт-карта, которое имеет тип SMARTCARD_EXTENSION. Эти указатели хранятся в массиве, расположенном в элементе ReaderFunction структуры SMARTCARD_EXTENSION. Отдельные процедуры обратного вызова можно определить по ряду значений констант, которые следует использовать в качестве индексов в массиве ReaderFunction .

Например, если вы хотите, чтобы функция SmartcardDeviceControl вызывала подпрограмму обратного вызова в драйвере средства чтения с именем DriverCardPower после завершения обработки запроса IOCTL_SMARTCARD_POWER , необходимо использовать константу RDF_CARD_POWER для инициализации расширения устройства следующим образом:

SmartcardExtension->ReaderFunction[RDF_CARD_POWER] = 
DriverCardPower;

RDF_CARD_POWER — это фиксированная системная константа, которая всегда соответствует процедуре обратного вызова, которая обслуживает IOCTL_SMARTCARD_POWER запрос.

Если элемент массива ReaderFunction , соответствующий обрабатываемому IOCTL, имеет значение 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.