Compartir a través de


Requisitos de rutina ControllerControl

Como su nombre implica, una rutina ControllerControl está asociada a un objeto de controlador. Cuando se ejecuta la rutina ControllerControl , el hardware representado por el objeto de controlador es libre y la extensión del controlador generalmente no es accesible por otra rutina de controlador a menos que la extensión del controlador contenga el contexto que se comparte con el ISR del controlador.

Normalmente, una rutina ControllerControl realiza al menos lo siguiente:

  1. Novedades o inicializa el contexto que el controlador mantiene en la extensión del dispositivo del objeto de dispositivo de destino y en la extensión del controlador.

    Si el controlador usa DMA, su rutina ControllerControl normalmente es responsable de determinar si una solicitud de transferencia determinada debe dividirse en transferencias parciales debido a las limitaciones impuestas por el sistema o impuestas por el dispositivo sobre el tamaño de cada transferencia DMA. En estas circunstancias, la rutina ControllerControl también es responsable de llamar a AllocateAdapterChannel si el controlador tiene una rutina AdapterControl .

    Si el controlador usa PIO, su rutina ControllerControl también es responsable de dividir las solicitudes de transferencia, si su hardware lo requiere, en intervalos de transferencia parcial y para llamar a MmGetSystemAddressForMdlSafe con mdL en Irp-MdlAddress>.

  2. Programa su hardware para la operación de E/S solicitada

    Si se puede tener acceso a la extensión del dispositivo o controlador desde el ISR, la rutina ControllerControl debe usar una rutina SynchCritSection que se invoca mediante una llamada a KeSynchronizeExecution. Para obtener más información, consulte Uso de secciones críticas.

Si el controlador tiene una rutina Cancel, su rutina ControllerControl también debe comprobar el campo Irp-Cancel> para determinar si se debe cancelar el IRP actual y realizar una de las siguientes acciones:

Si Irp-Cancel> está establecido en TRUE, la rutina ControllerControl debe hacer lo siguiente:

  1. Establezca STATUS_CANCELLED para Estado y cero para Información en el bloque de estado de E/S del IRP.

  2. Llame a IoFreeController para liberar el objeto de controlador para que se pueda iniciar rápidamente la siguiente operación del dispositivo.

  3. Llame a IoStartNextPacket o desquee el siguiente IRP si el controlador administra su propia cola.

  4. Complete el IRP cancelado con IoCompleteRequest y el control de devolución.

Si Irp-Cancel> no está establecido en TRUE, la rutina ControllerControl debe hacer lo siguiente:

  1. Llame a IoSetCancelRoutine para restablecer el punto de entrada de rutina Cancel para irP a NULL. Adquiera el bloqueo de número de cancelación para esta llamada si el controlador usa la cola de dispositivos proporcionada por el administrador de E/S en el objeto de dispositivo.

  2. Programe el hardware para la operación de E/S solicitada mediante una rutina SynchCritSection que se invoca mediante una llamada a KeSynchronizeExecution. Para obtener más información, consulte Uso de secciones críticas.

Para obtener más información sobre el control de IRP cancelables, consulte Cancelación de IRP.

Para la mayoría de las operaciones de E/S controladas por interrupciones, excepto las operaciones superpuestas en diferentes dispositivos conectados al controlador o adaptador físico, una rutina ControllerControl debe devolver KeepObject porque la rutina DpcForIsr o CustomDpc completa la operación y el IRP.

Tan pronto como se realicen las operaciones de E/S para satisfacer la solicitud actual, la rutina que completará el IRP debe llamar a IoFreeController e IoStartNextPacket para que la siguiente solicitud se pueda procesar lo antes posible.

Si la propia rutina ControllerControl completa un IRP o si puede configurar una operación, como una búsqueda de disco, para un objeto de dispositivo de destino (disco) que se podría superponer con una operación para otro objeto de dispositivo, la rutina ControllerControl debe devolver DeallocateObject.