Share via


Envío de solicitudes de E/S a un destino de E/S general en UMDF

Advertencia

UMDF 2 es la versión más reciente de UMDF y sustituye a UMDF 1. Todos los controladores UMDF nuevos deben escribirse con UMDF 2. No se agregan nuevas características a UMDF 1 y hay compatibilidad limitada con UMDF 1 en versiones más recientes de Windows 10. Los controladores universales de Windows deben usar UMDF 2.

Los ejemplos de UMDF 1 archivados se pueden encontrar en la Windows 11, versión 22H2 : actualización de ejemplos de controladores de mayo de 2022.

Para obtener más información, consulta Introducción con UMDF.

Un controlador UMDF puede enviar solicitudes de E/S a destinos de E/S generales de forma sincrónica o asincrónica.

Si un controlador envía solicitudes de E/S de forma sincrónica, un subproceso de controlador envía las solicitudes de una en una. El subproceso espera a que cada solicitud se complete antes de enviar la siguiente. Este proceso es más sencillo que enviar las solicitudes de E/S de forma asincrónica. El controlador puede enviar solicitudes de E/S de forma sincrónica si no envía muchas solicitudes y si el rendimiento del sistema o del dispositivo no se reduce mientras el controlador espera cada solicitud de E/S.

Si un controlador envía solicitudes de E/S de forma asincrónica, un subproceso de controlador envía cada solicitud en cuanto la solicitud está lista para enviarse, sin esperar a que finalicen las solicitudes enviadas previamente. Si el controlador debe controlar muchas solicitudes de E/S en breves períodos de tiempo, es probable que el controlador no pueda esperar a que se complete cada solicitud antes de enviar la siguiente solicitud. De lo contrario, el controlador podría perder datos o el rendimiento de sus dispositivos y, posiblemente, de todo el sistema podría reducirse.

Para que un controlador UMDF pueda enviar una solicitud de E/S a un destino de E/S, el controlador debe dar formato a la solicitud. En la tabla siguiente se enumeran los métodos a los que el controlador puede llamar para dar formato a las solicitudes de E/S. El controlador puede usar estos métodos para dar formato a una solicitud que el controlador recibió en una de sus colas de E/S o que creó el controlador.

Método Propósito

IWDFIoRequest::FormatUsingCurrentType

Da formato a una solicitud que el controlador recibió del marco para que el controlador pueda enviar la solicitud, sin modificar, al destino.

IWDFIoTarget::FormatRequestForIoctl

Da formato a una solicitud de control de dispositivo

IWDFIoTarget::FormatRequestForRead

Da formato a una solicitud de lectura

IWDFIoTarget::FormatRequestForWrite

Da formato a una solicitud de escritura

IWDFIoTarget2::FormatRequestForFlush

Da formato a una solicitud para vaciar los búferes.

IWDFIoTarget2::FormatRequestForQueryInformation

Da formato a una solicitud para obtener información de archivo.

IWDFIoTarget2::FormatRequestForSetInformation

Da formato a una solicitud para establecer información de archivo.

Para enviar la solicitud de E/S al destino de E/S, el controlador llama al método IWDFIoRequest::Send . Para enviar la solicitud de E/S de forma sincrónica, el controlador pasa la marca WDF_REQUEST_SEND_OPTION_SYNCHRONOUS al parámetro Flags . De lo contrario, el controlador envía la solicitud de E/S de forma asincrónica. Si el controlador envía la solicitud de E/S de forma asincrónica, el controlador normalmente requiere notificación cuando otro controlador completa la solicitud. El controlador debe definir una función de devolución de llamada IRequestCallbackRequestCompletion::OnCompletion y registrarla llamando al método IWDFIoRequest::SetCompletionCallback . Para obtener más información, consulte Finalización de solicitudes de E/S.

Un controlador que llama a IWDFIoRequest::Send para enviar una solicitud de E/S puede intentar cancelar la solicitud más adelante llamando al método IWDFIoRequest::CancelSentRequest . Si el controlador cancela una solicitud de E/S que el controlador recibió del marco de trabajo, el controlador siempre debe completar la solicitud llamando al método IWDFIoRequest::Complete o IWDFIoRequest::CompleteWithInformation con el parámetro CompletionStatus establecido en STATUS_CANCELLED. Si el controlador creó el objeto de solicitud, el controlador llama a IWDFObject::D eleteWdfObject en lugar de completar la solicitud.