Compartilhar via


Driver-Managed Filas de IRP

Com exceção dos drivers do sistema de arquivos, o gerenciador de E/S associa um objeto de fila de dispositivo (para enfileirar IRPs) a cada objeto de dispositivo criado por um driver.

A maioria dos drivers de dispositivos chama as rotinas de suporte do gerenciador de E/S para utilizar a fila do dispositivo associada, que armazena os IRPs sempre que as solicitações de E/S para um objeto de dispositivo alvo chegam mais rapidamente do que o driver consegue processá-las até a conclusão. Com essa técnica, os IRPs são enfileirados em uma rotina StartIo fornecida pelo driver.

Para um bom desempenho, a maioria dos drivers intermediários simplesmente passa os IRPs para drivers mais baixos assim que chegam, desse modo, os drivers intermediários raramente utilizam as filas de dispositivo associadas aos respectivos objetos de dispositivo.

No entanto, você pode criar um driver para gerenciar filas internas de IRPs configurando explicitamente uma ou mais filas de dispositivos, filas intertravadas ou filas de cancelamento seguro. Essa abordagem pode ser particularmente útil se o driver controlar um dispositivo que superpõe as operações de E/S. 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 filas IRP segura para cancelamento. Você pode implementar o mecanismo de enfileiramento de sua escolha em seu driver. 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 do IRP, bem como bloquear e desbloquear sua fila. A estrutura de fila segura para cancelamento de IRP fornece as rotinas IoCsqInsertIrp, IoCsqRemoveIrp e IoCsqRemoveNextIrp, que automaticamente utilizam rotinas de retorno de chamada para inserir e remover IRPs com segurança da fila do driver. O sistema também utiliza suas rotinas de retorno de chamada para remover com segurança qualquer IRP cancelado.

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 driver de porta SCSI usa objetos de fila de dispositivo para filas internas. Esse driver tem uma rotina StartIo e configura objetos de fila de dispositivo como filas complementares, além da fila de dispositivos associada ao objeto de dispositivo que ele cria para representar um HBA. O driver de porta SCSI usa suas filas de dispositivo suplementares para manter os IRPs associados a unidades lógicas específicas no barramento SCSI controlado 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 duplamente vinculada e intertravada, na qual e da qual o driver e seu thread dedicado ao dispositivo inserem e removem IRPs.

O Kernel define o tipo de objeto de fila do dispositivo. O componente de suporte executivo fornece rotinas para a inserção e remoção de IRPs em filas intertravadas. Drivers para Windows XP e versões posteriores do Windows podem usar filas IRP com segurança de cancelamento para gerenciar filas de IRP.

As seções a seguir explicam como usar filas de dispositivo, filas intertravadas e filas com cancelamento seguro:

Configurando e usando filas de dispositivos

Gerenciando filas de dispositivos

Configurando e usando filas intertravadas

Gerenciando filas intertravadas com um thread de Driver-Created

Cancel-Safe Filas de IRP