Compartir a través de


EVT_SPB_CONTROLLER_LOCK función de devolución de llamada (spbcx.h)

Un controlador de controlador SPB EvtSpbControllerLock función de devolución de llamada de eventos bloquea el controlador SPB para acceder a un único dispositivo de destino en el bus.

Sintaxis

EVT_SPB_CONTROLLER_LOCK EvtSpbControllerLock;

void EvtSpbControllerLock(
  [in] WDFDEVICE Controller,
  [in] SPBTARGET Target,
  [in] SPBREQUEST LockRequest
)
{...}

Parámetros

[in] Controller

Un identificador WDFDEVICE para el objeto de dispositivo del marco que representa el controlador SPB.

[in] Target

Un de SPBTARGET al destino de esta solicitud de E/S. El destino es un dispositivo periférico o un puerto que está conectado al bus. La extensión de marco de SPB (SpbCx) asignó previamente este identificador al destino en el EvtSpbTargetConnect devolución de llamada que abrió la conexión al destino.

[in] LockRequest

Identificador SPBREQUEST a una solicitud de control de E/S para bloquear el controlador. El controlador del controlador SPB debe completar esta solicitud realizando la operación solicitada o devolviendo un estado de error. Para obtener más información, vea Comentarios.

Valor devuelto

Ninguno

Observaciones

SpbCx administra la cola de E/S para el controlador SPB. Si el controlador del controlador SPB registra un EvtSpbControllerLock función de devolución de llamada, SpbCx llama a esta función cuando un cliente (controlador periférico) del controlador envía una solicitud IOCTL_SPB_LOCK_CONTROLLER a un destino en el bus. El valor del parámetro LockRequest es un identificador que encapsula esta solicitud.

Las funciones de EvtSpbControllerLock y EvtSpbControllerUnlock realizan operaciones complementarias. Ambas funciones son opcionales. Si el controlador del controlador SPB implementa una función EvtSpbControllerUnlock, el controlador no es necesario implementar una función de EvtSpbControllerLock, pero podría hacerlo. Sin embargo, si el controlador del controlador SPB implementa una función EvtSpbControllerLock, también debe implementar una función EvtSpbControllerUnlock. Para obtener más información, vea Comentarios en SPB_CONTROLLER_CONFIG.

Aunque el bloqueo está en vigor, el controlador no debe permitir el acceso a destinos en el bus distinto del destino designado por el parámetro LockRequest.

Si el controlador del controlador SPB debe cambiar el modo de su controlador para invalidar temporalmente el mecanismo de selección de destino normal, puede hacerlo durante el EvtSpbControllerLock devolución de llamada. Si este cambio de modo implica un retraso largo o requiere que el controlador espere una interrupción del dispositivo, el controlador debe iniciar el cambio de modo y, a continuación, volver de la devolución de llamada sin demora. Más adelante, el controlador puede completar la operación de bloqueo en un DPC del temporizador o una interrupción DPC.

Si la operación de bloqueo se completa en un DPC, el controlador del controlador SPB debería haber asignado previamente todos los recursos que necesita para la operación de bloqueo.

Una EvtSpbControllerLock devolución de llamada debe evitar que se produzca un error en una solicitud de bloqueo. Si controlador comprobador está habilitado, este error desencadenará una captura del comprobador, que notificará al administrador de Plug and Play que el controlador ha producido un error. SpbCx omite el error de una solicitud de bloqueo y no intenta controlar ni mitigar el error.

La función EvtSpbControllerLock no devuelve ningún valor. En su lugar, el controlador del controlador SPB indica el estado de la operación de bloqueo en el estado de finalización de la solicitud de E/S identificada por el parámetro LockRequest. Establezca el estado de finalización en STATUS_SUCCESS.

SpbCx llama a la función de devolución de llamada de eventos EvtSpbControllerUnlock para desbloquear un controlador bloqueado previamente por un EvtSpbControllerLock devolución de llamada.

Para registrar una función de devolución de llamada EvtSpbControllerLock, llame al método SpbDeviceInitialize.

Para obtener más información sobre la función EvtSpbControllerLock, consulte Handling Client-Implemented Sequences.

Ejemplos

Para definir un EvtSpbControllerLock función de devolución de llamada, primero debe proporcionar una declaración de función que identifique el tipo de función de devolución de llamada que está definiendo. Windows proporciona un conjunto de tipos de función de devolución de llamada para controladores. Declarar una función mediante los tipos de función de devolución de llamada ayuda a Análisis de código para controladores, comprobador de controladores estáticos (SDV) y otras herramientas de comprobación encuentran errores y es un requisito para escribir controladores para el sistema operativo Windows.

Por ejemplo, para definir un EvtSpbControllerLock función de devolución de llamada denominada MyEvtSpbControllerLock, use el tipo de función EVT_SPB_CONTROLLER_LOCK, como se muestra en este ejemplo de código:

EVT_SPB_CONTROLLER_LOCK  MyEvtSpbControllerLock;

A continuación, implemente la función de devolución de llamada de la siguiente manera:

_Use_decl_annotations_
VOID
  MyEvtSpbControllerLock(
    WDFDEVICE Controller,
    SPBTARGET Target,
    SPBREQUEST LockRequest
    )
{ ... }

El tipo de función EVT_SPB_CONTROLLER_LOCK se define en el archivo de encabezado Spbcx.h. Para identificar con más precisión los errores al ejecutar las herramientas de análisis de código, asegúrese de agregar la anotación Use_decl_annotations a la definición de función. La anotación Use_decl_annotations garantiza que se usen las anotaciones que se aplican al tipo de función EVT_SPB_CONTROLLER_LOCK en el archivo de encabezado. Para obtener más información sobre los requisitos de las declaraciones de función, consulte Declaración de funciones mediante tipos de rol de función para controladores kmDF. Para obtener más información sobre Use_decl_annotations, vea Anotación del comportamiento de la función.

Requisitos

Requisito Valor
cliente mínimo admitido Se admite a partir de Windows 8.
de la plataforma de destino de Escritorio
encabezado de spbcx.h
irQL Se llama a irQL <= DISPATCH_LEVEL.

Consulte también