EVT_SPB_CONTROLLER_LOCK função de retorno de chamada (spbcx.h)
Uma função de retorno de chamada de evento EvtSpbControllerLock do driver do controlador SPB bloqueia o controlador SPB para acessos de um único dispositivo de destino no barramento.
Sintaxe
EVT_SPB_CONTROLLER_LOCK EvtSpbControllerLock;
void EvtSpbControllerLock(
[in] WDFDEVICE Controller,
[in] SPBTARGET Target,
[in] SPBREQUEST LockRequest
)
{...}
Parâmetros
[in] Controller
Um identificador WDFDEVICE para o objeto de dispositivo de estrutura que representa o controlador SPB.
[in] Target
Um identificador SPBTARGET para o destino dessa solicitação de E/S. O destino é um dispositivo periférico ou uma porta anexada ao barramento. A extensão da estrutura SPB (SpbCx) atribuiu anteriormente esse identificador ao destino no retorno de chamada EvtSpbTargetConnect que abriu a conexão com o destino.
[in] LockRequest
Um identificador SPBREQUEST para uma solicitação de controle de E/S para bloquear o controlador. O driver do controlador SPB deve concluir essa solicitação executando a operação solicitada ou retornando um erro status. Para obter mais informações, consulte Comentários.
Retornar valor
Nenhum
Comentários
O SpbCx gerencia a fila de E/S para o controlador SPB. Se o driver do controlador SPB registrar uma função de retorno de chamada EvtSpbControllerLock , o SpbCx chamará essa função quando um cliente (driver periférico) do controlador enviar uma solicitação de IOCTL_SPB_LOCK_CONTROLLER para um destino no barramento. O valor do parâmetro LockRequest é um identificador que encapsula essa solicitação.
As funções EvtSpbControllerLock e EvtSpbControllerUnlock executam operações complementares. Ambas as funções são opcionais. Se o driver do controlador SPB implementar uma função EvtSpbControllerUnlock , o driver não será necessário para implementar uma função EvtSpbControllerLock , mas poderá fazê-lo. No entanto, se o driver do controlador SPB implementar uma função EvtSpbControllerLock , ele também deverá implementar uma função EvtSpbControllerUnlock . Para obter mais informações, consulte Comentários em SPB_CONTROLLER_CONFIG.
Embora o bloqueio esteja em vigor, o controlador não deve permitir acessos a destinos no barramento diferentes do destino designado pelo parâmetro LockRequest .
Se o driver do controlador SPB precisar alterar o modo de seu controlador para substituir temporariamente o mecanismo de seleção de destino normal, ele poderá fazer isso durante o retorno de chamada EvtSpbControllerLock . Se essa alteração de modo envolver um longo atraso ou exigir que o driver aguarde uma interrupção do dispositivo, o driver deverá iniciar a alteração de modo e, em seguida, retornar do retorno de chamada sem demora. Posteriormente, o driver pode concluir a operação de bloqueio em um DPC de temporizador ou em um DPC de interrupção.
Se a operação de bloqueio for concluída em um DPC, o driver do controlador SPB deverá ter alocado anteriormente todos os recursos necessários para a operação de bloqueio.
Um retorno de chamada EvtSpbControllerLock deve evitar a falha de uma solicitação de bloqueio. Se o Verificador de Driver estiver habilitado, essa falha disparará uma interceptação de verificador, que relatará ao gerenciador de Plug and Play que o controlador falhou. O SpbCx ignora a falha de uma solicitação de bloqueio e não tenta manipular nem atenuar a falha.
A função EvtSpbControllerLock não retorna um valor. Em vez disso, o driver do controlador SPB indica o status da operação de bloqueio na status de conclusão da solicitação de E/S identificada pelo parâmetro LockRequest. Defina o status de conclusão como STATUS_SUCCESS.
O SpbCx chama a função de retorno de chamada de evento EvtSpbControllerUnlock para desbloquear um controlador que foi bloqueado anteriormente por um retorno de chamada EvtSpbControllerLock .
Para registrar uma função de retorno de chamada EvtSpbControllerLock , chame o método SpbDeviceInitialize .
Para obter mais informações sobre a função EvtSpbControllerLock , consulte Manipulando sequências de Client-Implemented.
Exemplos
Para definir uma função de retorno de chamada EvtSpbControllerLock , primeiro você deve fornecer uma declaração de função que identifique o tipo de função de retorno de chamada que você está definindo. O Windows fornece um conjunto de tipos de função de retorno de chamada para drivers. Declarar uma função usando os tipos de função de retorno de chamada ajuda a Análise de Código para Drivers, SDV ( Verificador de Driver Estático ) e outras ferramentas de verificação a encontrar erros e é um requisito para escrever drivers para o sistema operacional Windows.
Por exemplo, para definir uma função de retorno de chamada EvtSpbControllerLock chamada MyEvtSpbControllerLock
, use o tipo de função EVT_SPB_CONTROLLER_LOCK, conforme mostrado neste exemplo de código:
EVT_SPB_CONTROLLER_LOCK MyEvtSpbControllerLock;
Em seguida, implemente a função de retorno de chamada da seguinte maneira:
_Use_decl_annotations_
VOID
MyEvtSpbControllerLock(
WDFDEVICE Controller,
SPBTARGET Target,
SPBREQUEST LockRequest
)
{ ... }
O tipo de função EVT_SPB_CONTROLLER_LOCK é definido no arquivo de cabeçalho Spbcx.h. Para identificar erros com mais precisão ao executar as ferramentas de análise de código, adicione a anotação Use_decl_annotations à sua definição de função. A anotação Use_decl_annotations garante que as anotações aplicadas ao tipo de função EVT_SPB_CONTROLLER_LOCK no arquivo de cabeçalho sejam usadas. Para obter mais informações sobre os requisitos para declarações de função, consulte Declarando funções usando tipos de função para drivers KMDF. Para obter mais informações sobre Use_decl_annotations, consulte Anotando o comportamento da função.
Requisitos
Requisito | Valor |
---|---|
Cliente mínimo com suporte | Com suporte a partir do Windows 8. |
Plataforma de Destino | Área de Trabalho |
Cabeçalho | spbcx.h |
IRQL | Chamado em IRQL <= DISPATCH_LEVEL. |