Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Depois que um driver de dispositivo de cartão SD (Secure Digital) 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 da interface
O driver do dispositivo recupera o contexto da interface a partir 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.
Pacote de solicitação
O driver do dispositivo deve alocar e inicializar uma estrutura 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 do 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 da interface
Esse parâmetro é o mesmo que o parâmetro com o mesmo nome usado no caso síncrono.
Pacote de solicitação
Esse parâmetro é o mesmo que o parâmetro de mesmo nome usado na situação síncrona.
IRP
Esse parâmetro contém um IRP que o driver do dispositivo alocou ou um IRP que o driver recebeu do driver localizado acima dele na pilha de driver. O IRP é usado como um transportador 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 transfere para a rotina de conclusão indicada pelo parâmetro correspondente.
O driver do 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 desenvolvedor 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 Secure Digital (SD)
Os drivers de cartão SD (Secure Digital) usam solicitações de propriedade para ler ou definir propriedades de 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 cartão SDIO multifuncional pode solicitar o número que o motorista do ônibus atribui à função que gerencia.
O exemplo de código a seguir ilustra como um driver para uma função em um cartão multifuncional pode solicitar seu número de função do driver de ônibus:
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 ônibus a recuperar uma propriedade do cartão. Para obter uma descrição da solicitação 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 número 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.
Parameters.GetSetProperty.Buffer membro do pacote de solicitação. O motorista do ônibus armazenará o número da função neste 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 do dispositivo SD (Secure Digital)
Os drivers usam solicitações de comando de cartão SD (Secure Digital) 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 após o IRP_MN_START_DEVICE IRP que inicia o dispositivo ser 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 SD usando E/S direta e uma solicitação de comando do dispositivo que grava uma quantidade maior de dados em um cartão SD 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: