Compartilhar via


Driver-Managed filas IRP

Exceto para drivers do sistema de arquivos, o gerenciador de E/S associa um objeto de fila de dispositivos (para enfileirar IRPs) a cada objeto de dispositivo que um driver cria.

A maioria dos drivers de dispositivo chama as rotinas de suporte do gerenciador de E/S para usar a fila de dispositivos associada, que contém IRPs sempre que as solicitações de E/S do dispositivo para um objeto de dispositivo de destino chegam mais rápido do que o driver pode processá-los 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 tão rápido quanto eles entram, de modo que os drivers intermediários quase nunca usam 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 com segurança de cancelamento. Essa abordagem pode ser particularmente útil se o driver controla um dispositivo que se sobrepõe às 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 fila IRP com segurança de cancelamento. Você pode implementar o mecanismo de enfileiramento de sua escolha no 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 IRP cancel-safe 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 usa suas rotinas de retorno de chamada para remover com segurança todos os IRPs cancelados.

Você também pode optar por configurar filas complementares 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 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 interligada duplamente vinculada na qual e do 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 inserir e remover IRPs em filas interligadas. Drivers para Windows XP e versões posteriores do Windows podem usar filas IRP com segurança de cancelamento para lidar com filas IRP.

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

Configurando e usando filas de dispositivos

Gerenciando filas de dispositivos

Configurando e usando filas interligadas

Gerenciando filas interligadas com um thread de Driver-Created

Filas IRP com segurança de cancelamento