Rutinas de devolución de llamada de la biblioteca de controladores de tarjeta inteligente
La arquitectura de tarjeta inteligente define un conjunto de tipos de rutina de devolución de llamada estándar. Para más información sobre estas rutinas, consulte Devoluciones de llamada del controlador de tarjeta inteligente.
Un controlador de lector debe hacer que estas rutinas de devolución de llamada estén disponibles para la rutina de la biblioteca de controladores, SmartcardDeviceControl (WDM), para llamar mediante el almacenamiento de punteros a ellos en la extensión del dispositivo de tarjeta inteligente, que es de tipo SMARTCARD_EXTENSION. Estos punteros se almacenan en una matriz que se encuentra en el miembro ReaderFunction de SMARTCARD_EXTENSION estructura. Las rutinas de devolución de llamada individuales se pueden identificar mediante una serie de valores constantes, que se deben usar como índices en la matriz ReaderFunction .
Por ejemplo, si desea que SmartcardDeviceControl llame a una rutina de devolución de llamada en el controlador de lector denominado DriverCardPower cada vez que termine de procesar una solicitud de IOCTL_SMARTCARD_POWER , debe usar la constante RDF_CARD_POWER para inicializar la extensión del dispositivo de la siguiente manera:
SmartcardExtension->ReaderFunction[RDF_CARD_POWER] =
DriverCardPower;
RDF_CARD_POWER es una constante fija definida por el sistema que siempre corresponde a la rutina de devolución de llamada que atiende la solicitud de IOCTL_SMARTCARD_POWER.
Si el miembro de la matriz ReaderFunction que corresponde al IOCTL que se está procesando es NULL, SmartcardDeviceControl devuelve un estado de STATUS_NOT_SUPPORTED al controlador de lector. En algunos casos, este comportamiento es útil. Si, por ejemplo, el controlador no admite la expulsión de tarjetas o la ingestión de tarjetas, simplemente asigne el miembro adecuado de la matriz ReaderFunction para que sea NULL y SmartcardDeviceControl devolverá STATUS_NOT_SUPPORTED cada vez que se llame a esa rutina de miembro.
En la tabla siguiente se enumeran las constantes que identifican los distintos tipos de rutinas de devolución de llamada. Estas son las constantes que debe usar como índices en la matriz ReaderFunction . La tabla también proporciona una breve descripción de cada tipo de rutina e indica si es obligatorio o opcional para que un controlador de lector implemente la rutina.
Índice | Descripción de la rutina de devolución de llamada correspondiente | Implementación por parte del controlador del lector |
---|---|---|
Restablece o desactiva una tarjeta inteligente insertada |
Mandatory |
|
Expulsa una tarjeta inteligente insertada |
Opcionales |
|
Instala un controlador de eventos para realizar un seguimiento de las inserciones y eliminaciones de tarjetas. |
Mandatory |
|
Realiza operaciones de IOCTL específicas del proveedor. |
Opcionales |
|
Hace una golondrina mecánica |
Opcionales |
|
Selecciona un protocolo de transmisión para la tarjeta que se encuentra en el lector de tarjetas. |
Mandatory |
|
Realiza transmisiones de datos |
Mandatory |
Cuando el controlador del lector llama a estas rutinas, debe recuperar los parámetros de llamada de los búferes de entrada, como se describe en Devoluciones de llamada del controlador de tarjeta inteligente. El controlador de lector también debe almacenar los datos de salida en las áreas de búfer adecuadas, como se describe en la misma sección.
Cuando cualquier rutina de devolución de llamada que no sea la rutina de devolución de llamada de seguimiento de tarjetas devuelve STATUS_PENDING, la biblioteca de tarjetas inteligentes deja de atender las llamadas adicionales del controlador del lector. (Para obtener información sobre la rutina de devolución de llamada de seguimiento de tarjetas, consulte RDF_CARD_TRACKING). Si el controlador de lector intenta usar una rutina de biblioteca de controladores mientras la biblioteca está en este estado, la rutina de biblioteca devuelve un estado de STATUS_DEVICE_BUSY. Esto impide eficazmente que el controlador del lector pueda atender las solicitudes IOCTL del administrador de recursos, ya que el controlador de lector no puede procesar solicitudes IOCTL si no puede llamar a SmartcardDeviceControl.