Compartir a través de


EVT_WDF_IO_IN_CALLER_CONTEXT función de devolución de llamada (wdfdevice.h)

[Solo se aplica a KMDF]

La función de devolución de llamada de evento EvtIoInCallerContext de un controlador preprocesa una solicitud de E/S antes de que el marco lo coloque en una cola de E/S.

Sintaxis

EVT_WDF_IO_IN_CALLER_CONTEXT EvtWdfIoInCallerContext;

void EvtWdfIoInCallerContext(
  [in] WDFDEVICE Device,
  [in] WDFREQUEST Request
)
{...}

Parámetros

[in] Device

Identificador de un objeto de dispositivo de marco.

[in] Request

Identificador de un objeto de solicitud de marco.

Valor devuelto

None

Observaciones

El marco llama a la función de devolución de llamada EvtIoInCallerContext de un controlador para que el controlador pueda examinar cada solicitud de E/S y, posiblemente, realizar un procesamiento preliminar en la solicitud, antes de que el marco lo coloque en una cola de E/S. Para registrar una función de devolución de llamada EvtIoInCallerContext para un dispositivo, el controlador llama a WdfDeviceInitSetIoInCallerContextCallback.

Si un controlador registra una función de devolución de llamada EvtIoInCallerContext para un dispositivo, el marco llama a la función de devolución de llamada cada vez que recibe una solicitud de E/S para el dispositivo. Se llama a la función de devolución de llamada en el contexto del subproceso del proceso que envió la solicitud de E/S al controlador. Este proceso es el controlador de nivel superior siguiente o, si el controlador está en la parte superior de la pila de controladores, una aplicación en modo de usuario.

El propósito principal de esta función de devolución de llamada es permitir que los controladores basados en marcos admitan el método de acceso al búfer al que no se llama ni la E/S directa ni almacenada en búfer. Para este método de acceso al búfer, el controlador debe acceder a los búferes recibidos en el contexto de proceso del autor.

Una vez que la función de devolución de llamada ha obtenido los búferes de una solicitud, puede almacenar direcciones de búfer o identificadores en el almacenamiento de contexto del objeto de solicitud. (El controlador establece el tamaño del área de almacenamiento de contexto del objeto de solicitud mediante una llamada a WdfDeviceInitSetRequestAttributes).

Dado que la solicitud aún no pertenece a una cola de E/S, el marco no bloquea ni sincroniza la solicitud. El controlador es responsable de cualquier sincronización que pueda ser necesaria. Para obtener más información sobre la sincronización, consulte Técnicas de sincronización para controladores de Framework-Based.

Después de que la función de devolución de llamada haya terminado de preprocesar la solicitud, debe ponerla en cola llamando a WdfDeviceEnqueueRequest o completarla llamando a WdfRequestComplete (si se detecta un error).

Para obtener más información sobre la función de devolución de llamada EvtIoInCallerContext , consulte Interceptar una solicitud de E/S antes de que esté en cola y obtener acceso a los búferes de datos en controladores de Framework-Based.

Si un controlador ha configurado una cola de E/S para admitir el progreso hacia delante garantizado, es posible que el marco no llame a la función de devolución de llamada EvtIoInCallerContext del controlador durante situaciones de poca memoria. Si todos los objetos de solicitud reservados del marco están en uso, el marco pospone el procesamiento de la solicitud de E/S hasta que haya disponible un objeto de solicitud reservado. En esta situación, el marco no puede llamar a la función de devolución de llamada EvtIoInCallerContext para la solicitud de E/S pospuesta porque, cuando un objeto de solicitud reservado esté disponible, el marco ya no se ejecutará en el contexto de subproceso del proceso que envió la solicitud de E/S al controlador.

Se llama a la función de devolución de llamada EvtIoInCallerContext en el IRQL del subproceso que realiza la llamada. Si el subproceso de llamada procede de una aplicación en modo de usuario, se llama a la función de devolución de llamada en IRQL = PASSIVE_LEVEL. Si el subproceso de llamada procede de un controlador en modo kernel de nivel superior, se puede llamar a la función de devolución de llamada EvtIoInCallerContext del controlador en IRQL <= DISPATCH_LEVEL si tanto la función de devolución de llamada como el controlador de nivel superior están diseñados para pasar la solicitud en IRQL <= DISPATCH_LEVEL.

Requisitos

Requisito Value
Plataforma de destino Universal
Versión mínima de KMDF 1.0
Encabezado wdfdevice.h (incluir Wdf.h)
IRQL vea la sección Comentarios.

Consulte también

EvtDeviceWdmIrpPreprocess