Процедуры обратного вызова библиотеки драйверов смарт-карт
Архитектура интеллектуального карта определяет набор стандартных типов процедур обратного вызова. Дополнительные сведения об этих процедурах см. в разделе Обратные вызовы драйвера смарт-карт.
Драйвер средства чтения должен сделать эти процедуры обратного вызова доступными для процедуры библиотеки драйверов 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 . Таблица также содержит краткое описание каждого типа подпрограммы и указывает, является ли драйвер чтения обязательным или необязательным для реализации подпрограммы.
Индекс | Описание соответствующей процедуры обратного вызова | Реализация драйвером средства чтения |
---|---|---|
Сбрасывает или отключает вставленный смарт-карта |
Обязательный |
|
Извлекает вставленную смарт-карта |
Необязательно |
|
Устанавливает обработчик событий для отслеживания вставок и удалений карта. |
Обязательный |
|
Выполняет операции IOCTL для конкретных поставщиков |
Необязательно |
|
Ли механическая ласточка |
Необязательно |
|
Выбирает протокол передачи для карта, который находится в средстве чтения карта |
Обязательный |
|
Выполняет передачу данных |
Обязательный |
Когда драйвер средства чтения вызывает эти подпрограммы, он должен получить вызывающие параметры из входных буферов, как описано в разделе Обратные вызовы драйвера смарт-карт. Драйвер средства чтения также должен хранить выходные данные в соответствующих буферных областях, как описано в том же разделе.
Когда любая подпрограмма обратного вызова, отличающаяся от процедуры обратного вызова с отслеживанием карта, возвращает STATUS_PENDING, библиотека смарт-карта прекращает обслуживание дальнейших вызовов от драйвера чтения. (Сведения о процедуре обратного вызова с отслеживанием карта см. в разделе RDF_CARD_TRACKING.) Если драйвер средства чтения пытается использовать подпрограмму библиотеки драйверов, когда библиотека находится в этом состоянии, она возвращает состояние STATUS_DEVICE_BUSY. Это фактически запрещает драйверу чтения обслуживать запросы IOCTL от диспетчера ресурсов, так как драйвер средства чтения не может обрабатывать запросы IOCTL, если ему не удается вызвать SmartcardDeviceControl.