Condividi tramite


struttura SMARTCARD_EXTENSION (smclib.h)

La struttura SMARTCARD_EXTENSION viene utilizzata sia dal driver del lettore di smart card che dalla libreria di driver di smart card per accedere a tutte le altre strutture di dati della smart card.

Sintassi

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;

Members

Version

Indica la versione di questa struttura.

VendorAttr

Contiene informazioni che identificano il driver del lettore, ad esempio il nome del fornitore, il numero di unità e il numero di serie.

ReaderFunction[16]

La riga nel blocco di sintassi deve essere letta NTSTATUS (*ReaderFunction[16])(PSMARTCARD_EXTENSION);

Puntatore a una matrice di funzioni di callback per i lettori. Le funzioni di callback che un driver lettore fornito dal fornitore può implementare. Un driver lettore rende queste funzioni di callback disponibili per la routine della libreria di smart card , SmartcardDeviceControl, per chiamare archiviando i puntatori ad essi nell'estensione del dispositivo smart card.

RDF_ATR_PARSE
RDF_CARD_EJECT
RDF_CARD_POWER
RDF_CARD_TRACKING
RDF_IOCTL_VENDOR
RDF_READER_SWALLOW
RDF_SET_PROTOCOL
RDF_TRANSMIT
Per altre informazioni, vedere la sezione Osservazioni.

CardCapabilities

Contiene le funzionalità della smart card inserita.

LastError

Non usato.

IoRequest

Struttura con i membri seguenti:

IoRequest.Information

Contiene il numero di byte restituiti.

IoRequest.RequestBuffer

Puntatore ai dati nella richiesta di I/O dell'utente da inviare alla scheda.

IoRequest.RequestBufferLength

Indica il numero di byte da inviare alla scheda.

IoRequest.ReplyBuffer

Puntatore al buffer che contiene i dati restituiti dalla richiesta di I/O.

IoRequest.ReplyBufferLength

Indica il numero di byte dei dati restituiti dalla richiesta di I/O.

MajorIoControlCode

Contiene il codice di controllo di I/O principale.

MinorIoControlCode

Contiene il codice di controllo di I/O secondario.

OsData

Contiene informazioni specifiche del sistema operativo e del tipo di driver.

ReaderCapabilities

Contiene le funzionalità del lettore di tastiera.

ReaderExtension

Contiene dati specifici del lettore di smart card.

SmartcardReply

Contiene dati provenienti dal lettore.

SmartcardRequest

Contiene il comando corrente e i dati inviati alla smart card.

T0

Contiene i dati da usare con il protocollo T=0.

T1

Contiene i dati usati con il protocollo T=1.

PerfInfo

Reserved[25 - sizeof(PPERF_INFO)]

Riservato per l'utilizzo nel sistema.

Commenti

Questa struttura viene passata a tutte le funzioni di callback.

Le singole funzioni di callback sono identificate da una serie di valori costanti che devono essere usati come indici nella matrice ReaderFunction .

Indice Descrizione
RDF_ATR_PARSE facoltativo. La funzione di analisi RDF_ATR_PARSE analizza una risposta alla reimpostazione (ATR) per la libreria di driver di smart card quando la libreria di driver non è in grado di riconoscere o analizzare la libreria di driver della smart card.
RDF_CARD_EJECT facoltativo. RDF_CARD_EJECT funzione di callback

La funzione di callback RDF_CARD_EJECT espelle una smart card inserita dal lettore.

RDF_CARD_POWER La funzione di callback RDF_CARD_POWER reimposta o disattiva una smart card inserita. È obbligatorio che i driver del lettore di smart card implementino questa funzione di callback.

Nell'input, la struttura a cui punta SmartcardExtension deve avere i valori membro seguenti:

MajorIoControlCode
Deve avere un valore di IOCTL_SMARTCARD_POWER.
IoRequest.ReplyBufferLength
Deve contenere la lunghezza del buffer.
MinorIoControlCode
Deve avere uno dei codici secondari seguenti:
SCARD_COLD_RESET
Esegue un ripristino a freddo della smart card.
SCARD_WARM_RESET
Esegue una reimpostazione a caldo della smart card.
SCARD_POWER_DOWN
Disattiva l'alimentazione della smart card.
Nell'output la struttura a cui punta SmartcardExtension deve avere i valori seguenti:
IoRequest.ReplyBuffer
Riceve l'ATR restituito dalla smart card. Inoltre, è necessario trasferire ATR a SmartcardExtension->CardCapabilities.ATR.Buffer in modo che la libreria possa analizzare ATR.
IoRequest.Information
Riceve la lunghezza dell'ATR.
CardCapabilities.ATR.Length
Contiene la lunghezza dell'ATR.
RDF_CARD_TRACKING La funzione di callback RDF_CARD_TRACKING installa un gestore eventi per tenere traccia ogni volta che una scheda viene inserita o rimossa da un lettore di schede. È obbligatorio che i driver del lettore di smart card implementino questa funzione di callback.

Al momento della ricezione di una richiesta di IOCTL_SMARTCARD_IS_PRESENT , la libreria di driver determina se la smart card è già presente. Se la smart card è presente, la libreria driver completa la richiesta con lo stato STATUS_SUCCESS. Se non è presente alcuna smart card, la libreria driver chiama la funzione di callback di rilevamento smart card del driver lettore e il driver lettore inizia a cercare la smart card. Dopo l'avvio del rilevamento delle smart card, la libreria driver contrassegna la richiesta come con stato di STATUS_PENDING.

La libreria driver completa la richiesta.

Driver di dispositivo WDM

La libreria di driver WDM corrispondente aggiunge un puntatore alla richiesta in SmartcardExtension-OsData-NotificationIrp>>. Il driver del lettore deve completare la richiesta non appena rileva che una smart card è stata inserita o rimossa. Il driver reader completa la richiesta chiamando IoCompleteRequest, dopo di che, il driver reader deve impostare il membro NotificationIrp di SmartcardExtension -> OsData su NULL per informare la libreria driver che il driver di lettura può accettare ulteriori richieste di rilevamento delle smart card.

Poiché questa chiamata può avere una durata indefinita e il chiamante può terminare la richiesta prima che venga completata, è importante contrassegnare questo IRP come annullabile.

MyDriverCardSupervision(
SmartcardExtension, 
OtherParameters)
//
//    This function is called whenever the card status changes
//    For example, the card has been inserted or the card has been removed
//
{
    if (SmartcardExtension->OsData->NotificationOverlappedData != NULL){

        SmartcardCompleteCardTracking(SmartcardExtension);
    }
    //
    // Do additional tasks
    //
}
RDF_IOCTL_VENDOR La funzione di callback RDF_IOCTL_VENDOR esegue operazioni IOCTL specifiche del fornitore. È facoltativo per i driver del lettore di smart card implementare questa funzione di callback.

In input, il chiamante deve passare i valori seguenti alla funzione:

SmartcardExtension->MajorIoControlCode
Contiene un codice IOCTL specifico del fornitore. Per informazioni su come definire un codice IOCTL specifico del fornitore, vedere la macro SCARD_CTL_CODE in Winsmcrd.h . Si noti che il codice deve essere compreso tra 2048 e 4095.
SmartcardExtension->IoRequest.RequestBuffer
Puntatore al buffer di input dell'utente.
SmartcardExtension->IoRequest.RequestBufferLength
Dimensioni, in byte, del buffer di input dell'utente.
SmartcardExtension->IoRequest.ReplyBuffer
Puntatore al buffer di output dell'utente.
SmartcardExtension->IoRequest.ReplyBufferLength
Dimensioni, in byte, del buffer di output dell'utente.
SmartcardExtension->IoRequest.Information
Valore fornito dalla richiesta. Deve essere impostato sul numero di byte restituiti.
Come per tutti gli altri IOCTLs, un'applicazione in modalità utente invia un IOCTL definito dal fornitore a un dispositivo di lettura smart card chiamando la funzione DeviceIoControl . Quando l'IOCTL è definito dal fornitore, tuttavia, l'applicazione deve prima aprire il dispositivo lettore per l'accesso "sovrapposto", ovvero asincrono. L'applicazione deve anche definire una struttura OVERLAPPED e passarla al sistema nell'ultimo argomento di DeviceIoControl (la struttura OVERLAPPED è descritta anche nella documentazione di Windows SDK). Quando il sistema operativo chiama la routine di invio del controllo I/O del driver, passa una struttura DIOCPARAMETERS al driver. Il membro lpoOverlapped della struttura DIOCPARAMETERS contiene un puntatore alla struttura OVERLAPPED.
RDF_READER_SWALLOW La funzione di callback RDF_READER_SWALLOW esegue una rondine meccanica, che si verifica quando la smart card viene completamente inserita nel lettore smart card. È facoltativo per i driver di lettura smart card implementare questa funzione di callback.
RDF_SET_PROTOCOL La funzione di callback RDF_SET_PROTOCOL seleziona un protocollo di trasmissione per la smart card inserita. I driver di lettore smart card devono implementare questa funzione di callback.

In input, il chiamante deve passare i valori seguenti alla funzione:

SmartcardExtension->MajorIoControlCode
Contiene IOCTL_SMARTCARD_SET_PROTOCOL.
SmartcardExtension->MinorIoControlCode
Contiene un OR bit per bit di uno o più protocolli che il chiamante accetta. Il driver deve selezionare un protocollo supportato dalla smart card inserita. È consigliabile che il protocollo T = 1 sia preceduto dal protocollo T = 0.
Valore Significato
SCARD_PROTOCOL_RAW Seleziona il protocollo non elaborato.
SCARD_PROTOCOL_T0 Seleziona il protocollo ISO T = 0.
SCARD_PROTOCOL_T1 Seleziona il protocollo ISO T = 1.
 
SmartcardExtension->IoRequest.ReplyBufferLength
Contiene la lunghezza del buffer di risposta.
SmartcardExtension->CardCapabilities.PtsData
Contiene i parametri necessari per eseguire la richiesta PTS. Per altre informazioni, vedere PTS_DATA.
La richiesta restituisce i valori seguenti:
SmartcardExtension->IoRequest.ReplyBuffer
Contiene il protocollo selezionato.
SmartcardExtension->IoRequest.Information
Impostare su sizeof(ULONG).
Il chiamante può fornire una maschera di protocolli accettabili. La routine di callback del protocollo impostato del driver seleziona uno dei protocolli nella maschera e restituisce il protocollo selezionato in SmartcardExtension->IoRequest.ReplyBuffer.
RDF_TRANSMIT La funzione di callback RDF_TRANSMIT esegue trasmissioni di dati. I driver di lettore smart card devono implementare questa funzione di callback.

In input, il chiamante deve passare i valori seguenti alla funzione:

SmartcardExtension->MajorIoControlCode
Contiene IOCTL_SMARTCARD_TRANSMIT.
SmartcardExtension->IoRequest.RequestBuffer
Puntatore a una struttura SCARD_IO_REQUEST seguita dai dati da trasmettere alla scheda.
SmartcardExtension->IoRequest.RequestBufferLength
Numero di byte da trasmettere alla scheda.
SmartcardExtension->IoRequest.ReplyBufferLength
Dimensioni, in byte, del buffer di risposta.
La richiesta restituisce i valori seguenti:
SmartcardExtension->IoRequest.ReplyBuffer
Puntatore al buffer che riceve la struttura SCARD_IO_REQUEST, oltre al risultato della scheda.
SmartcardExtension->IoRequest.Information
Riceve il numero effettivo di byte restituiti dalla smart card, oltre alle dimensioni della struttura SCARD_IO_REQUEST. Per una definizione della struttura SCARD_IO_REQUEST, vedere IOCTL_SMARTCARD_TRANSMIT.
Quando questa funzione viene chiamata, SmartcardExtension->IoRequest.RequestBuffer punta a una struttura SCARD_IO_REQUEST seguita dai dati da trasmettere.
typedef struct _SCARD_IO_REQUEST{
  DWORD  dwProtocol;   // Protocol identifier
  DWORD  cbPciLength;  // Protocol Control Information Length
} SCARD_IO_REQUEST, *PSCARD_IO_REQUEST, *LPSCARD_IO_REQUEST;
    
   

Il membro dwProtocol deve contenere l'identificatore del protocollo restituito da una chiamata a IOCTL_SMARTCARD_SET_PROTOCOL.

Il membro cbPciLength contiene le dimensioni, in byte, della struttura SCARD_IO_REQUEST. Le dimensioni di questa struttura sono in genere 8 byte.

La struttura SCARD_IO_REQUEST è seguita da dati (protocollo) da trasmettere alla scheda. A seconda del protocollo da usare per la trasmissione, la libreria offre diverse funzioni di supporto. Per altre informazioni su queste funzioni di supporto, vedere SmartcardT0Request (WDM) e SmartcardT1Request (WDM).

RequestBuffer e ReplyBuffer puntano allo stesso buffer di sistema. Se si usa la funzione di libreria SmartcardxxRequest e SmartcardxxReply, non si sovrascriverà il buffer di input. Se non si usano queste funzioni, creare una copia di RequestBuffer prima di avviare le trasmissioni.

È necessario copiare la struttura SCARD_IO_REQUEST nel parametro ReplyBuffer , seguito dai dati ricevuti dalla scheda. Anche in questo caso, se si usano le funzioni SmartcardxxRequest e SmartcardxxReply , la libreria copia la struttura.

Requisiti

Requisito Valore
Intestazione smclib.h (includere Smclib.h)