Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Nadat het apparaatstuurprogramma voor een SD-kaart (Secure Digital) een interface voor het SD-busstuurprogramma heeft geopend en geïnitialiseerd, kan het aanvragen indienen. Er zijn twee manieren om aanvragen in te dienen: synchroon via de SdBusSubmitRequest routine en asynchroon via de SdBusSubmitRequestAsync routine. Beide routines worden geëxporteerd door de SD-busbibliotheek (sdbus.lib).
De synchrone aanvraagroutine heeft twee parameters: een interfacecontext en een aanvraagpakket.
Interfacecontext
Het apparaatstuurprogramma haalt de interfacecontext op uit de Context lid van de SDBUS_INTERFACE_STANDARD structuur na het openen van een SD-interface met SdBusOpenInterface. Het stuurprogramma moet deze contextinformatie doorgeven wanneer deze een methode aanroept in de interface.
pakket aanvragen
Het apparaatstuurprogramma moet een SDBUS_REQUEST_PACKET structuur toewijzen en initialiseren. Deze structuur geeft de aanvraagfunctie en andere kenmerken van de aanvraag aan.
Omdat SdBusSubmitRequest synchroon is, wordt er geen STATUS_PENDING geretourneerd. Het apparaatstuurprogramma moet draaien op IRQL < DISPATCH_LEVEL wanneer deze routine wordt aangeroepen.
De asynchrone aanvraagroutine gebruikt de volgende vijf parameters: een interfacecontext, een aanvraagpakket, een IRP, een aanwijzer naar een voltooiingsroutine en een voltooiingscontext.
Interfacecontext
Deze parameter is hetzelfde als de parameter met dezelfde naam die wordt gebruikt met de synchrone case.
pakket aanvragen
Deze parameter is hetzelfde als de parameter met dezelfde naam die wordt gebruikt met de synchrone case.
IRP
Deze parameter bevat een IRP die het apparaatstuurprogramma heeft toegewezen, of een IRP die het stuurprogramma heeft ontvangen van het stuurprogramma dat zich erboven in de stuurprogrammastack bevindt. De IRP wordt gebruikt als drager voor de aanvraag.
voltooiingsroutine
Deze parameter bevat een IoCompletion- routine voor de IRP die is opgegeven in de IRP-parameter.
gebruikerscontext
Deze parameter bevat een aanwijzer naar gebruikerscontextgegevens die het systeem doorgeeft aan de voltooiingsroutine die is opgegeven in de parameter voltooiingsroutine.
Het apparaatstuurprogramma moet op IRQL <= DISPATCH_LEVEL draaien wanneer het de SdBusSubmitRequestAsync routine aanroept. SdBusSubmitRequest is een wrapper die zijn eigen IRP toewijst en roept SdBusSubmitRequestAsyncaan. Het is beschikbaar voor het gemak van de ontwikkelaar van de driver.
De volgende secties bevatten codevoorbeelden die laten zien hoe een apparaatstuurprogramma elk van de twee hoofdcategorieën sd-aanvragen verzendt: zie SD_REQUEST_FUNCTIONvoor een beschrijving van de verschillende aanvragen.
Secure Digital (SD) Eigenschapsaanvragen
Secure Digital-kaartstuurprogramma's (SD) gebruiken eigenschapsaanvragen om kaarteigenschappen te lezen of in te stellen. Een SD-kaartstuurprogramma kan bijvoorbeeld een eigenschap lezen om te bepalen of de schakelaar voor schrijven-beveiliging op de SD-kaart zich in de vergrendelde positie bevindt, of een stuurprogramma voor een bepaalde functie op een multifunctionele SDIO-kaart kan het nummer aanvragen dat het busstuurprogramma toewijst aan de functie die wordt beheerd.
In het volgende codevoorbeeld ziet u hoe een stuurprogramma voor een functie op een multifunctionele kaart het functienummer van het busstuurprogramma kan aanvragen:
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 dit codevoorbeeld initialiseert een apparaatstuurprogramma een SD-busaanvraagpakket, SDBUS_REQUEST_PACKETen geeft dit door aan SdBusSubmitRequest. Het volledig geïnitialiseerde aanvraagpakket heeft de volgende kenmerken:
type van het verzoek
In het codevoorbeeld wordt een SDRF_GET_PROPERTY aanvraag opgegeven in de RequestFunction lid van het aanvraagpakket, waarmee het busdriver wordt geïnstrueerd om een eigenschap van de kaart op te halen. Zie SD_REQUEST_FUNCTIONvoor een beschrijving van de SDRF_GET_PROPERTY aanvraag.
eigenschap om op te halen
In het codevoorbeeld wordt de eigenschap SDP_FUNCTION_NUMBER opgegeven in het Parameters.GetSetProperty.Property lid van het aanvraagpakket, waarmee de busstuurprogramma wordt geïnstrueerd om de inhoud van de functienummereigenschap op te halen. Zie SDBUS_PROPERTYvoor een beschrijving van de eigenschap SDP_FUNCTION_NUMBER.
Eigenschapsinhoud en Lengte
In het codevoorbeeld wordt een aanwijzer geplaatst naar een buffer in de apparaatextensie in de
Parameters.GetSetProperty.Buffer is een lid van het aanvraagpakket. De buschauffeur slaat het functienummer op deze locatie op. In de voorbeeldcode wordt ook de grootte van deze buffer opgeslagen in het Parameters.GetSetProperty.Length element van het aanvraagpakket.
Opdrachtaanvragen voor beveiligde digitale apparaten (SD)
Stuurprogramma's gebruiken opdrachtaanvragen voor sd-kaarten (Secure Digital) om opdrachten naar een SD-apparaat te verzenden. Het protocol voor SD-opdrachten wordt gedefinieerd in de specificatie Secure Digital Card. Stuurprogramma's kunnen op elk gewenst moment opdrachtaanvragen verzenden nadat de IRP_MN_START_DEVICE IRP waarmee het apparaat wordt gestart, is voltooid.
Deze sectie bevat twee codevoorbeelden: een opdrachtaanvraag die een byte met gegevens uit een register van een SD-kaart leest met behulp van directe I/O, en een opdrachtaanvraag voor een apparaat waarmee een grotere hoeveelheid gegevens naar een SD-kaart wordt geschreven met behulp van uitgebreide I/O. De uitleg in de tweede sectie hangt dus af van de eerste, daarom moeten lezers de eerste sectie bestuderen voordat ze de tweede bestuderen:
veilige digitale aanvragen die gebruikmaken van
Beveiligde Digitale Aanvragen die Gebruikmaken van Uitgebreide I/O