SD-Kartenanforderungen
Nachdem ein Secure Digital -Karte Gerätetreiber eine Schnittstelle für den SD-Bustreiber geöffnet und initialisiert hat, kann er Anforderungen senden. Es gibt zwei Möglichkeiten, Anforderungen zu übermitteln: synchron mithilfe der SdBusSubmitRequest-Routine und asynchron mithilfe der SdBusSubmitRequestAsync-Routine . Beide Routinen werden von der SD-Busbibliothek (sdbus.lib) exportiert.
Die synchrone Anforderungsroutine verwendet zwei Parameter: einen Schnittstellenkontext und ein Anforderungspaket.
Schnittstellenkontext
Der Gerätetreiber ruft den Schnittstellenkontext aus dem Context-Member der SDBUS_INTERFACE_STANDARD-Struktur ab, nachdem er eine SD-Schnittstelle mit SdBusOpenInterface geöffnet hat. Der Treiber muss diese Kontextinformationen immer dann übergeben, wenn er eine Methode in der Schnittstelle aufruft.
Anforderungspaket
Der Gerätetreiber muss eine SDBUS_REQUEST_PACKET Struktur zuordnen und initialisieren. Diese Struktur gibt die Anforderungsfunktion und andere Merkmale der Anforderung an.
Da SdBusSubmitRequest synchron ist, wird keine STATUS_PENDING zurückgegeben. Der Gerätetreiber muss bei IRQL < DISPATCH_LEVEL ausgeführt werden, wenn er diese Routine aufruft.
Die asynchrone Anforderungsroutine verwendet die folgenden fünf Parameter: einen Schnittstellenkontext, ein Anforderungspaket, ein IRP, einen Zeiger auf eine Vervollständigungsroutine und einen Abschlusskontext.
Schnittstellenkontext
Dieser Parameter ist identisch mit dem Parameter mit demselben Namen, der mit der synchronen Groß-/Kleinschreibung verwendet wird.
Anforderungspaket
Dieser Parameter ist identisch mit dem Parameter mit demselben Namen, der mit der synchronen Groß-/Kleinschreibung verwendet wird.
IRP
Dieser Parameter enthält einen IRP, den der Gerätetreiber zugewiesen hat, oder ein IRP, das der Treiber von dem Treiber empfangen hat, der sich darüber im Treiberstapel befindet. Das IRP wird als Netzbetreiber für die Anforderung verwendet.
Vervollständigungsroutine
Dieser Parameter enthält eine IoCompletion-Routine für das im IRP-Parameter angegebene IRP.
Benutzerkontext
Dieser Parameter enthält einen Zeiger auf Benutzerkontextdaten, die das System an die im Vervollständigungsroutinenparameter angegebene Vervollständigungsroutine übergibt.
Der Gerätetreiber muss unter IRQL <= DISPATCH_LEVEL ausgeführt werden, wenn er die SdBusSubmitRequestAsync-Routine aufruft. SdBusSubmitRequest ist ein Wrapper, der sein eigenes IRP zuordnet und SdBusSubmitRequestAsync aufruft. Es wird zur Vereinfachung des Treiberschreibers bereitgestellt.
Die folgenden Abschnitte enthalten Codebeispiele, die veranschaulichen, wie ein Gerätetreiber jede der beiden Hauptkategorien von SD-Anforderungen übermittelt: Eine Beschreibung der verschiedenen Anforderungen finden Sie unter SD_REQUEST_FUNCTION.
Secure Digital (SD)-Eigenschaftsanforderungen
Secure Digital (SD) Karte Treiber verwenden Eigenschaftenanforderungen, um Karte Eigenschaften zu lesen oder festzulegen. Beispielsweise könnte ein SD-Karte-Treiber eine Eigenschaft lesen, um zu bestimmen, ob sich der schreibgeschützte Schalter auf dem SD-Karte in der gesperrten Position befindet, oder ein Treiber für eine bestimmte Funktion in einem multifunktionsfähigen SDIO-Karte die Nummer anfordern, die der Bustreiber der verwalteten Funktion zuweist.
Im folgenden Codebeispiel wird veranschaulicht, wie ein Treiber für eine Funktion in einem Multifunktions-Karte seine Funktionsnummer vom Bustreiber anfordern kann:
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 diesem Codebeispiel initialisiert ein Gerätetreiber ein SD Bus-Anforderungspaket , SDBUS_REQUEST_PACKET, und übergibt es an SdBusSubmitRequest. Das vollständig initialisierte Anforderungspaket weist die folgenden Merkmale auf:
Typ der Anforderung
Das Codebeispiel gibt eine SDRF_GET_PROPERTY Anforderung im RequestFunction-Member des Anforderungspakets an, das den Bustreiber anweist, eine Eigenschaft aus dem Karte abzurufen. Eine Beschreibung der SDRF_GET_PROPERTY-Anforderung finden Sie unter SD_REQUEST_FUNCTION.
Abzurufende Eigenschaft
Das Codebeispiel gibt die SDP_FUNCTION_NUMBER-Eigenschaft im Parameters.GetSetProperty.Property-Member des Anforderungspakets an, das den Bustreiber anweist, den Inhalt der Funktionsnummereigenschaft abzurufen. Eine Beschreibung der SDP_FUNCTION_NUMBER-Eigenschaft finden Sie unter SDBUS_PROPERTY.
Eigenschafteninhalt und Länge
Im Codebeispiel wird ein Zeiger auf einen Puffer in der Geräteerweiterung in der
Parameters.GetSetProperty.Buffer-Member des Anforderungspakets. Der Bustreiber speichert die Funktionsnummer an diesem Speicherort. Der Beispielcode speichert auch die Größe dieses Puffers im Parameter.GetSetProperty.Length-Member des Anforderungspakets.
Secure Digital (SD)-Gerätebefehlsanforderungen
Treiber verwenden Secure Digital (SD) Karte Befehlsanforderungen, um Befehle an ein SD-Gerät zu senden. Das Protokoll für SD-Befehle ist in der Secure Digital Card-Spezifikation definiert. Treiber können jederzeit Befehlsanforderungen senden, nachdem die IRP_MN_START_DEVICE IRP, die das Gerät startet, erfolgreich abgeschlossen wurde.
Dieser Abschnitt enthält zwei Codebeispiele: eine Befehlsanforderung, die ein Byte von Daten aus einem Register eines SD-Karte mithilfe direkter E/A liest, und eine Gerätebefehlsanforderung, die eine größere Menge von Daten mithilfe erweiterter E/A in ein SD-Karte schreibt. Die Erläuterung im zweiten Abschnitt hängt vom ersten abschnitt ab, daher sollten die Leser den ersten Abschnitt vor dem Studium des zweiten:
Sichere digitale Anforderungen, die verwenden
Schützen digitaler Anforderungen, die erweiterte E/A-Vorgänge verwenden