Compartir a través de


Configuración y uso de colas de dispositivos

Un controlador configura un objeto de cola de dispositivos mediante una llamada a KeInitializeDeviceQueue en la inicialización del controlador o del dispositivo. Después de iniciar sus dispositivos, el controlador inserta IRP en esta cola llamando a KeInsertDeviceQueue o KeInsertByKeyDeviceQueue. En la ilustración siguiente se muestran estas llamadas.

configurar y usar colas de dispositivos.

Como se muestra en esta ilustración, el controlador debe proporcionar el almacenamiento de un objeto de cola de dispositivos, que debe ser residente. Los controladores que configuran un objeto de cola de dispositivos suelen proporcionar el almacenamiento necesario en la extensión de dispositivo de un objeto de dispositivo creado por el controlador, pero el almacenamiento puede estar en una extensión de controlador si el controlador usa un objeto de controlador o en un grupo no paginado asignado por el controlador.

Si el controlador proporciona almacenamiento para el objeto de cola de dispositivos en una extensión de dispositivo, llama a KeInitializeDeviceQueue después de crear el objeto de dispositivo y antes de iniciar el dispositivo. En otras palabras, el controlador puede inicializar la cola desde su rutina AddDevice o cuando controla una solicitud de IRP_MN_START_DEVICE PnP. En la llamada a KeInitializeDeviceQueue, el controlador pasa un puntero al almacenamiento que proporciona para el objeto de cola del dispositivo.

Después de iniciar sus dispositivos, el controlador puede insertar un IRP en su cola de dispositivos llamando a KeInsertDeviceQueue, que coloca el IRP en la cola de la cola o KeInsertByKeyDeviceQueue, que coloca el IRP en la cola según un valor SortKey determinado por el controlador, como se muestra en la ilustración anterior.

Cada una de estas rutinas de soporte técnico devuelve un valor booleano que indica si el IRP se insertó en la cola. Cada una de estas llamadas también establece el estado del objeto de cola de dispositivos en Ocupado si la cola está vacía actualmente (No ocupado). Sin embargo, si la cola está vacía (no ocupada), ninguna rutina KeInsertXxxDeviceQueue inserta el IRP en la cola. En su lugar, establece el estado del objeto de cola de dispositivos en Ocupado y devuelve FALSE. Dado que el IRP no se ha puesto en cola, el controlador debe pasarlo a otra rutina de controlador para su posterior procesamiento.

Al configurar colas de dispositivos complementarias, siga esta guía de implementación:

Cuando una llamada a KeInsertXxxDeviceQueue devuelve FALSE, el autor de la llamada debe pasar el IRP en el que intentó poner en cola para su posterior procesamiento a otra rutina de controlador. Sin embargo, la llamada a KeInsertXxxDeviceQueue cambia el estado del objeto de cola del dispositivo a Ocupado, por lo que el siguiente IRP que se insertará en la cola a menos que el controlador llame primero a KeRemoveXxxDeviceQueue .

Cuando el estado del objeto de cola de dispositivos está establecido en Ocupado, el controlador puede quitar de la cola un IRP para su posterior procesamiento o restablecer el estado a Not-Busy llamando a una de las siguientes rutinas de soporte técnico:

  • KeRemoveDeviceQueue para quitar el IRP en la cabeza de la cola

  • KeRemoveByKeyDeviceQueue para quitar un IRP elegido según un valor SortKey determinado por el controlador

  • KeRemoveEntryDeviceQueue para quitar un IRP determinado en la cola o para determinar si un IRP determinado está en la cola

    KeRemoveEntryDeviceQueue devuelve un valor booleano que indica si el IRP estaba en la cola del dispositivo.

Llamar a cualquiera de estas rutinas para quitar una entrada de una cola de dispositivos que está vacía, pero Ocupado cambia el estado de la cola a No ocupado.

Cada objeto de cola de dispositivos está protegido por un bloqueo de número ejecutivo integrado (no se muestra en la figura Uso de un objeto de cola de dispositivos). Como resultado, un controlador puede insertar IRP en la cola y quitarlos de una manera segura para varios procesadores de cualquier rutina de controlador que se ejecute en menos o igual que IRQL = DISPATCH_LEVEL. Debido a esta restricción IRQL, un controlador no puede llamar a ninguna rutina KeXxxDeviceQueue desde sus rutinas ISR o SynchCritSection , que se ejecutan en DIRQL.

Consulte Administración de prioridades de hardware y bloqueos de número para obtener más información. Para conocer los requisitos de IRQL para una rutina de soporte técnico específica, consulte la página de referencia de la rutina.