Partager via


Demandes de carte SD

Une fois qu’un pilote de périphérique de carte SD (Secure Digital) a ouvert et initialisé une interface au pilote de bus SD, il peut envoyer des demandes. Il existe deux façons de soumettre des demandes : de manière synchrone par le biais de la routine SdBusSubmitRequest et de manière asynchrone par le biais de la routine SdBusSubmitRequestAsync . Ces deux routines sont exportées par la bibliothèque de bus SD (sdbus.lib).

La routine de requête synchrone prend deux paramètres : un contexte d’interface et un paquet de requêtes.

Contexte de l’interface
Le pilote de périphérique récupère le contexte d’interface à partir du membre context de la structure SDBUS_INTERFACE_STANDARD après l’ouverture d’une interface SD avec SdBusOpenInterface. Le pilote doit transmettre ces informations de contexte chaque fois qu’il appelle une méthode dans l’interface.

Demander un paquet
Le pilote de périphérique doit allouer et initialiser une structure SDBUS_REQUEST_PACKET . Cette structure spécifie la fonction de requête et d’autres caractéristiques de la requête.

Étant donné que SdBusSubmitRequest est synchrone, il ne retourne pas STATUS_PENDING. Le pilote de périphérique doit s’exécuter au DISPATCH_LEVEL IRQL < lorsqu’il appelle cette routine.

La routine de requête asynchrone prend les cinq paramètres suivants : un contexte d’interface, un paquet de requêtes, un IRP, un pointeur vers une routine d’achèvement et un contexte d’achèvement.

Contexte de l’interface
Ce paramètre est identique au paramètre du même nom que celui utilisé avec le cas synchrone.

Demander un paquet
Ce paramètre est identique au paramètre du même nom que celui utilisé avec le cas synchrone.

IRP
Ce paramètre contient un IRP que le pilote de périphérique a alloué, ou un IRP que le pilote a reçu du pilote situé au-dessus de la pile des pilotes. ** L’IRP est utilisé comme vecteur pour la demande.

Routine d’achèvement
Ce paramètre contient une routine IoCompletion pour l’IRP fourni dans le paramètre IRP.

Contexte utilisateur
Ce paramètre contient un pointeur vers les données de contexte utilisateur que le système passe à la routine de terminaison spécifiée dans le paramètre de routine de terminaison.

Le pilote de périphérique doit s’exécuter à IRQL <= DISPATCH_LEVEL quand il appelle la routine SdBusSubmitRequestAsync . SdBusSubmitRequest est un wrapper qui alloue son propre IRP et appelle SdBusSubmitRequestAsync. Il est fourni pour des raisons pratiques de l’enregistreur de pilotes.

Les sections suivantes fournissent des exemples de code qui illustrent la façon dont un pilote de périphérique envoie chacune des deux catégories principales de requêtes SD : pour obtenir une description des différentes requêtes, consultez SD_REQUEST_FUNCTION.

Demandes de propriété Secure Digital (SD)

Les pilotes de carte SD (Secure Digital) utilisent des demandes de propriété pour lire ou définir des propriétés de carte. Par exemple, un pilote de carte SD peut lire une propriété pour déterminer si le commutateur de protection contre l'écriture de la carte SD est en position verrouillée, ou un pilote pour une fonction particulière sur une carte SDIO multifonction peut demander le numéro que le pilote de bus assigne à la fonction qu’il gère.

L'exemple de code suivant montre comment un pilote pour une fonction sur une carte multifonction peut demander son numéro de fonction au pilote de 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;
 }

Dans cet exemple de code, un pilote de périphérique initialise un paquet de requête de bus SD, SDBUS_REQUEST_PACKET et le transmet à SdBusSubmitRequest. Le paquet de requête entièrement initialisé présente les caractéristiques suivantes :

Type de la requête
L’exemple de code spécifie une requête SDRF_GET_PROPERTY dans le membre RequestFunction du paquet de requête, qui indique au pilote de bus de récupérer une propriété à partir de la carte. Pour obtenir une description de la demande de SDRF_GET_PROPERTY, consultez SD_REQUEST_FUNCTION.

Propriété à récupérer
L’exemple de code spécifie la propriété SDP_FUNCTION_NUMBER dans le membre Parameters.GetSetProperty.Property du paquet de requête, qui indique au pilote de bus de récupérer le contenu de la propriété numéro de fonction. Pour obtenir une description de la propriété SDP_FUNCTION_NUMBER, consultez SDBUS_PROPERTY.

Contenu et longueur des propriétés
L’exemple de code place un pointeur vers une mémoire tampon dans l’extension de l’appareil.

Parameters.GetSetProperty.Buffer membre du paquet de requête. Le pilote de bus stocke le numéro de fonction dans cet emplacement. L’exemple de code stocke également la taille de cette mémoire tampon dans le membre Parameters.GetSetProperty.Length du paquet de requête.

Demandes de commandes d’appareil SD (Secure Digital)

Les pilotes utilisent des demandes de commande de carte SD (Secure Digital) pour envoyer des commandes à un appareil SD. Le protocole pour les commandes SD est défini dans la spécification de la carte numérique sécurisée . Les pilotes peuvent envoyer des demandes de commande à tout moment une fois que l'IRP IRP_MN_START_DEVICE qui démarre l’appareil termine avec succès.

Cette section contient deux exemples de code : une demande de commande qui lit un octet de données à partir d’un registre d’une carte SD à l’aide d’E/S directes et d’une demande de commande d’appareil qui écrit une plus grande quantité de données dans une carte SD à l’aide d’E/S étendues. L’explication de la deuxième section dépend du premier, par conséquent, les lecteurs doivent étudier la première section avant d’étudier la seconde :

Sécuriser les demandes numériques qui utilisent

Sécuriser les demandes numériques qui utilisent des E/S étendues