Compartilhar via


Solicitações de cartão SD

Depois que um SD (Secure Digital) cartão driver de dispositivo tiver aberto e inicializado uma interface para o driver de barramento SD, ele poderá enviar solicitações. Há duas maneiras de enviar solicitações: de forma síncrona por meio da rotina SdBusSubmitRequest e de forma assíncrona por meio da rotina SdBusSubmitRequestAsync . Ambas as rotinas são exportadas pela biblioteca de barramento SD (sdbus.lib).

A rotina de solicitação síncrona usa dois parâmetros: um contexto de interface e um pacote de solicitação.

Contexto de interface
O driver de dispositivo recupera o contexto da interface do membro Context da estrutura SDBUS_INTERFACE_STANDARD depois de abrir uma interface SD com SdBusOpenInterface. O driver deve passar essas informações de contexto sempre que chamar um método na interface .

Solicitar pacote
O driver do dispositivo deve alocar e inicializar uma estrutura de SDBUS_REQUEST_PACKET . Essa estrutura especifica a função de solicitação e outras características da solicitação.

Como SdBusSubmitRequest é síncrono, ele não retorna STATUS_PENDING. O driver de dispositivo deve estar em execução no IRQL < DISPATCH_LEVEL quando chama essa rotina.

A rotina de solicitação assíncrona usa os cinco parâmetros a seguir: um contexto de interface, um pacote de solicitação, um IRP, um ponteiro para uma rotina de conclusão e um contexto de conclusão.

Contexto de interface
Esse parâmetro é o mesmo que o parâmetro pelo mesmo nome usado com o caso síncrono.

Solicitar pacote
Esse parâmetro é o mesmo que o parâmetro pelo mesmo nome usado com o caso síncrono.

IRP
Esse parâmetro contém um IRP que o driver de dispositivo alocou ou um IRP que o driver recebeu do driver localizado acima dele na pilha de driver. O IRP é usado como uma operadora para a solicitação.

Rotina de conclusão
Esse parâmetro contém uma rotina IoCompletion para o IRP fornecido no parâmetro IRP.

Contexto do usuário
Esse parâmetro contém um ponteiro para os dados de contexto do usuário que o sistema passa para a rotina de conclusão especificada no parâmetro de rotina de conclusão.

O driver de dispositivo deve estar em execução em IRQL <= DISPATCH_LEVEL quando chama a rotina SdBusSubmitRequestAsync . SdBusSubmitRequest é um wrapper que aloca seu próprio IRP e chama SdBusSubmitRequestAsync. Ele é fornecido para conveniência do gravador de driver.

As seções a seguir fornecem exemplos de código que ilustram como um driver de dispositivo envia cada uma das duas categorias principais de solicitações SD: para obter uma descrição das diferentes solicitações, consulte SD_REQUEST_FUNCTION.

Solicitações de propriedade SD (Secure Digital)

Drivers de cartão SD (Secure Digital) usam solicitações de propriedade para ler ou definir propriedades cartão. Por exemplo, um driver de cartão SD pode ler uma propriedade para determinar se o comutador de proteção de gravação no cartão SD está na posição bloqueada ou um driver para uma função específica em um SDIO multifuncional cartão pode solicitar o número que o driver de barramento atribui à função que gerencia.

O exemplo de código a seguir ilustra como um driver para uma função em uma cartão multifunção pode solicitar seu número de função do driver de barramento:

 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;
 }

Neste exemplo de código, um driver de dispositivo inicializa um pacote de solicitação de barramento SD, SDBUS_REQUEST_PACKET e o passa para SdBusSubmitRequest. O pacote de solicitação totalmente inicializado tem as seguintes características:

Tipo da solicitação
O exemplo de código especifica uma solicitação SDRF_GET_PROPERTY no membro RequestFunction do pacote de solicitação, que instrui o motorista do barramento a recuperar uma propriedade do cartão. Para obter uma descrição da solicitação de SDRF_GET_PROPERTY, consulte SD_REQUEST_FUNCTION.

Propriedade a ser recuperada
O exemplo de código especifica a propriedade SDP_FUNCTION_NUMBER no membro Parameters.GetSetProperty.Property do pacote de solicitação, que instrui o driver de barramento a recuperar o conteúdo da propriedade number da função. Para obter uma descrição da propriedade SDP_FUNCTION_NUMBER, consulte SDBUS_PROPERTY.

Conteúdo e comprimento da propriedade
O exemplo de código coloca um ponteiro para um buffer na extensão do dispositivo no

Parameters.GetSetProperty.Buffer membro do pacote de solicitação. O motorista do barramento armazenará o número da função nesse local. O código de exemplo também armazena o tamanho desse buffer no membro Parameters.GetSetProperty.Length do pacote de solicitação.

Solicitações de comando de dispositivo SD (Secure Digital)

Os drivers usam o SD (Secure Digital) cartão solicitações de comando para enviar comandos para um dispositivo SD. O protocolo para comandos SD é definido na especificação cartão digital seguro . Os drivers podem enviar solicitações de comando a qualquer momento depois que o IRP IRP_MN_START_DEVICE que inicia o dispositivo for concluído com êxito.

Esta seção contém dois exemplos de código: uma solicitação de comando que lê um byte de dados de um registro de um cartão de SD usando E/S direta e uma solicitação de comando de dispositivo que grava uma quantidade maior de dados em um SD cartão usando E/S estendida. A explicação na segunda seção depende da primeira, portanto, os leitores devem estudar a primeira seção antes de estudar a segunda:

Proteger solicitações digitais que usam

Proteger solicitações digitais que usam E/S estendida