Partilhar via


Driver-Managed Filas de IRP

Exceto para controladores de sistema de arquivos, o gestor de E/S associa um objeto de fila de dispositivo (para enfileiramento de IRPs) a cada objeto de dispositivo criado por um controlador.

A maioria dos drivers de dispositivo chama as rotinas de suporte do gestor de E/S para usar a fila de dispositivo associada, que mantém IRPs sempre que solicitações de E/S de dispositivo para um objeto de dispositivo de destino chegam mais rápido do que o driver pode processá-las completamente. Com esta técnica, os IRPs são enfileirados numa rotina StartIo fornecida pelo driver.

Para um bom desempenho, a maioria dos drivers intermediários simplesmente passa IRPs para drivers de nível inferior tão rapidamente quanto são recebidos, de modo que os drivers intermediários quase nunca usam as filas de dispositivos associadas aos respetivos objetos de dispositivo.

No entanto, você pode projetar um driver para gerenciar filas internas de IRPs configurando explicitamente uma ou mais filas de dispositivos, filas interbloqueadas ou filas seguras para cancelamento. Essa abordagem pode ser particularmente útil se o driver controlar um dispositivo que realiza operações de E/S sobrepostas. Para esse dispositivo, pode ser difícil gerenciar o processamento simultâneo de dois ou mais IRPs para o mesmo objeto de dispositivo de destino usando apenas uma única fila.

A maneira mais simples de criar uma fila interna é usar a estrutura de fila IRP segura para cancelamento. Você pode implementar o mecanismo de fila de sua escolha em seu motorista. Em seguida, você pode usar IoCsqInitialize para registrar um conjunto de rotinas de retorno de chamada que lidam com a inserção e exclusão de IRP, bem como bloquear e desbloquear sua fila. A estrutura de fila IRP segura para cancelamento fornece as rotinas IoCsqInsertIrp, IoCsqRemoveIrp e IoCsqRemoveNextIrp que usam automaticamente as rotinas de retorno de chamada para inserir e remover IRPs com segurança da fila do driver. O sistema também utiliza as suas rotinas de retorno de chamada para remover de forma segura quaisquer IRPs que sejam cancelados.

Você também pode optar por configurar filas suplementares para IRPs no driver de um controlador de dispositivo para um conjunto de dispositivos físicos heterogêneos. Por exemplo, o controlador de porta SCSI usa objetos de fila de dispositivo para filas internas. Esse driver possui tanto uma rotina StartIo como configura objetos de fila de dispositivo como filas suplementares, além da fila de dispositivo associada ao objeto de dispositivo que ele cria para representar um HBA. O driver de porta SCSI usa as suas filas de dispositivos suplementares para manter os IRPs vinculados a unidades lógicas específicas nos barramentos SCSI controlados pelo HBA.

O driver do controlador de disquete do sistema é um exemplo de um driver que não tem rotina StartIo e usa uma fila intertravada. Esse driver configura uma fila intertravada duplamente vinculada na qual e a partir da qual o driver e seu thread dedicado ao dispositivo inserem e removem IRPs.

O Kernel define o tipo de objeto da fila de dispositivos. O componente de suporte executivo fornece rotinas para inserir e remover IRPs em filas intertravadas. Os drivers para Windows XP e versões posteriores do Windows podem usar filas para cancelamento seguras de IRP para lidar com o enfileiramento de IRP.

As seções a seguir explicam como usar filas de dispositivos, filas interbloqueadas e filas seguras para cancelamento:

Configurando e usando filas de dispositivos

Gerenciando filas de dispositivos

Configurando e usando filas interbloqueadas

Gerenciando filas intertravadas com um thread de Driver-Created

Cancel-Safe Filas de IRP