Condividi tramite


Richieste di scheda SD

Dopo l'apertura e l'inizializzazione di un'interfaccia per il driver del bus SD, un driver di dispositivo per la scheda Secure Digital (SD) può inviare richieste. Esistono due modi per inviare richieste: in modo sincrono tramite la routine SdBusSubmitRequest e in modo asincrono tramite la routine SdBusSubmitRequestAsync . Entrambe queste routine vengono esportate dalla libreria del bus SD (sdbus.lib).

La routine di richiesta sincrona accetta due parametri: un contesto di interfaccia e un pacchetto di richiesta.

Contesto dell'interfaccia
Il driver di dispositivo recupera il contesto dell'interfaccia dal membro Context della struttura SDBUS_INTERFACE_STANDARD dopo l'apertura di un'interfaccia SD con SdBusOpenInterface. Il driver deve passare queste informazioni di contesto in ogni volta che chiama un metodo nell'interfaccia .

Richiedi pacchetto
Il driver di dispositivo deve allocare e inizializzare una struttura SDBUS_REQUEST_PACKET . Questa struttura specifica la funzione di richiesta e altre caratteristiche della richiesta.

Poiché SdBusSubmitRequest è sincrono, non restituisce STATUS_PENDING. Il driver di dispositivo deve essere in esecuzione in IRQL < DISPATCH_LEVEL quando chiama questa routine.

La routine di richiesta asincrona accetta i cinque parametri seguenti: un contesto di interfaccia, un pacchetto di richiesta, un IRP, un puntatore a una routine di completamento e un contesto di completamento.

Contesto dell'interfaccia
Questo parametro corrisponde al parametro con lo stesso nome usato con il caso sincrono.

Richiedi pacchetto
Questo parametro corrisponde al parametro con lo stesso nome usato con il caso sincrono.

IRP
Questo parametro contiene un IRP allocato dal driver di dispositivo o un IRP ricevuto dal driver che si trova sopra di esso nello stack di driver. L'IRP viene usato come gestore telefonico per la richiesta.

Routine di completamento
Questo parametro contiene una routine IoCompletion per l'IRP fornita nel parametro IRP.

Contesto utente
Questo parametro contiene un puntatore ai dati del contesto utente che il sistema passa alla routine di completamento specificata nel parametro della routine di completamento.

Il driver di dispositivo deve essere in esecuzione in IRQL <= DISPATCH_LEVEL quando chiama la routine SdBusSubmitRequestAsync . SdBusSubmitRequest è un wrapper che alloca il proprio IRP e chiama SdBusSubmitRequestAsync. Viene fornito per comodità del writer di driver.

Le sezioni seguenti forniscono esempi di codice che illustrano come un driver di dispositivo invia ognuna delle due categorie principali di richieste SD: per una descrizione delle diverse richieste, vedere SD_REQUEST_FUNCTION.

Richieste di proprietà Secure Digital (SD)

I driver della scheda Secure Digital (SD) usano richieste di proprietà per leggere o impostare le proprietà della scheda. Ad esempio, un driver della scheda SD potrebbe leggere una proprietà per determinare se l'opzione di protezione da scrittura sulla scheda SD si trova nella posizione bloccata o un driver per una determinata funzione su una scheda SDIO multifunzione potrebbe richiedere il numero assegnato dal driver del bus alla funzione gestita.

L'esempio di codice seguente illustra come un driver per una funzione in una scheda multifunzione potrebbe richiedere il numero di funzione dal driver del bus:

 sdrp = ExAllocatePool(NonPagedPool, 
 sizeof(SDBUS_REQUEST_PACKET));
 if (!sdrp) {
 return STATUS_INSUFFICIENT_RESOURCES;
 }
 RtlZeroMemory(sdrp, sizeof(SDBUS_REQUEST_PACKET));
 sdrp->RequestFunction = SDRF_GET_PROPERTY;
 sdrp->Parameters.GetSetProperty.Property = 
 SDP_FUNCTION_NUMBER;
 sdrp->Parameters.GetSetProperty.Buffer = 
 &pDevExt->FunctionNumber;
 sdrp->Parameters.GetSetProperty.Length = 
 sizeof(pDevExt->FunctionNumber);
 status = SdBusSubmitRequest (pDevExt->BusInterface.Context,sdrp);
 ExFreePool(sdrp);
 if (!NT_SUCCESS(status)) {
 return status;
 }

In questo esempio di codice, un driver di dispositivo inizializza un pacchetto di richiesta del bus SD, SDBUS_REQUEST_PACKET e lo passa a SdBusSubmitRequest. Il pacchetto di richiesta completamente inizializzato presenta le caratteristiche seguenti:

Tipo della richiesta
Nell'esempio di codice viene specificata una richiesta SDRF_GET_PROPERTY nel membro RequestFunction del pacchetto di richiesta, che indica al driver del bus di recuperare una proprietà dalla scheda. Per una descrizione della richiesta di SDRF_GET_PROPERTY, vedere SD_REQUEST_FUNCTION.

Proprietà da recuperare
Nell'esempio di codice viene specificata la proprietà SDP_FUNCTION_NUMBER nel membro Parameters.GetSetProperty.Property del pacchetto di richiesta, che indica al driver del bus di recuperare il contenuto della proprietà del numero di funzione. Per una descrizione della proprietà SDP_FUNCTION_NUMBER, vedere SDBUS_PROPERTY.

Contenuto e lunghezza delle proprietà
L'esempio di codice inserisce un puntatore a un buffer nell'estensione del dispositivo nell'oggetto

Membro Parameters.GetSetProperty.Buffer del pacchetto di richiesta. Il conducente del bus archivierà il numero di funzione in questa posizione. Il codice di esempio archivia anche le dimensioni di questo buffer nel membro Parameters.GetSetProperty.Length del pacchetto di richiesta.

Richieste di comandi del dispositivo Secure Digital (SD)

I driver usano richieste di comando secure digital (SD) per inviare comandi a un dispositivo SD. Il protocollo per i comandi SD è definito nella specifica Secure Digital Card . I driver possono inviare richieste di comando in qualsiasi momento dopo il completamento dell'IRP IRP_MN_START_DEVICE che avvia correttamente il dispositivo.

Questa sezione contiene due esempi di codice: una richiesta di comando che legge un byte di dati da un registro di una scheda SD usando operazioni di I/O dirette e una richiesta di comando del dispositivo che scrive una quantità maggiore di dati in una scheda SD usando operazioni di I/O estese. La spiegazione nella seconda sezione dipende dal primo, quindi, i lettori devono studiare la prima sezione prima di studiare il secondo:

Proteggere le richieste digitali che usano

Proteggere le richieste digitali che usano operazioni di I/O estese