Demandes de carte SD
Une fois qu’un pilote de périphérique secure digital (SD) carte a ouvert et initialisé une interface avec le pilote de bus SD, il peut envoyer des demandes. Il existe deux façons d’envoyer des demandes : de manière synchrone au moyen de la routine SdBusSubmitRequest et de manière asynchrone au moyen 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ête.
Contexte d’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.
Paquet de requête
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 demande.
É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ête, un IRP, un pointeur vers une routine d’achèvement et un contexte d’achèvement.
Contexte d’interface
Ce paramètre est identique au paramètre du même nom que celui utilisé avec le cas synchrone.
Paquet de requête
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 lui dans la pile des pilotes. L’IRP est utilisé comme transporteur 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 transmet à la routine d’achèvement spécifiée dans le paramètre de routine d’achèvement.
Le pilote de périphérique doit s’exécuter à IRQL <= DISPATCH_LEVEL lorsqu’il appelle la routine SdBusSubmitRequestAsync . SdBusSubmitRequest est un wrapper qui alloue son propre IRP et appelle SdBusSubmitRequestAsync. Il est fourni pour la commodité 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 principales catégories de demandes SD : pour obtenir une description des différentes demandes, consultez SD_REQUEST_FUNCTION.
Demandes de propriétés sécurisées numériques (SD)
Les pilotes de carte SD (Secure Digital) utilisent des demandes de propriétés pour lire ou définir des propriétés carte. Par exemple, un pilote SD carte peut lire une propriété pour déterminer si le commutateur de protection en écriture sur le carte SD est verrouillé ou si un pilote pour une fonction particulière sur une SDIO multifonction carte peut demander le numéro que le pilote de bus attribue à 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 demande
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 du 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 de la propriété
L’exemple de code place un pointeur vers une mémoire tampon dans l’extension de l’appareil dans le
Parameters.GetSetProperty.Buffer membre du paquet de requête. Le pilote de bus stocke le numéro de fonction à 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 commande d’appareil secure digital (SD)
Les pilotes utilisent Secure Digital (SD) carte demandes de commandes pour envoyer des commandes à un appareil SD. Le protocole pour les commandes SD est défini dans la spécification Secure Digital Card . Les pilotes peuvent envoyer des demandes de commande à tout moment après la IRP_MN_START_DEVICE IRP qui démarre l’appareil.
Cette section contient deux exemples de code : une demande de commande qui lit un octet de données à partir d’un registre d’un carte SD à l’aide d’E/S directes, et une demande de commande d’appareil qui écrit une plus grande quantité de données dans un carte SD à l’aide d’E/S étendues. L’explication de la deuxième section dépend de la première. Par conséquent, les lecteurs doivent étudier la première section avant d’étudier la deuxième :
Sécuriser les requêtes numériques qui utilisent
Sécuriser les requêtes numériques qui utilisent des E/S étendues