Criando filas de E/S
Os objetos de fila da estrutura representam filas de E/S, que são contêineres para as solicitações de E/S recebidas por um driver. Cada driver pode criar uma ou mais filas de E/S para cada dispositivo. O objeto de fila de estrutura define um conjunto de funções de retorno de chamada de evento que o driver pode fornecer e um conjunto de métodos de objeto que o driver pode chamar.
Quando a estrutura recebe uma solicitação de E/S direcionada a um dos dispositivos do driver, a estrutura coloca a solicitação na fila de E/S apropriada. Se o driver registrar um ou mais manipuladores de solicitação, a estrutura poderá notificar o driver sempre que uma solicitação de E/S estiver disponível. Como alternativa, o driver pode sondar a fila de E/S para solicitações.
A maioria dos drivers cria filas de E/S em sua função de retorno de chamada EvtDriverDeviceAdd . Para criar uma fila de E/S para um dispositivo, o driver chama o método WdfIoQueueCreate do objeto de fila da estrutura (que cria um objeto de fila de estrutura). O driver fornece uma estrutura WDF_IO_QUEUE_CONFIG para o método . Essa estrutura contém informações de configuração sobre a fila, como o método de expedição da fila e ponteiros para solicitar manipuladores que a estrutura chama quando as solicitações estão disponíveis na fila. A estrutura também indica se a fila será gerenciada por energia e se o driver dá suporte a buffers de comprimento zero para as solicitações de E/S da fila.
Se o driver definir o membro DefaultQueue da estrutura WDF_IO_QUEUE_CONFIG como TRUE, a fila se tornará a fila de E/S padrão do dispositivo. Se o driver criar uma fila de E/S padrão, a estrutura colocará todas as solicitações de E/S do dispositivo nessa fila, a menos que você crie filas adicionais para receber algumas das solicitações. Um driver pode obter um identificador para a fila de E/S padrão de um dispositivo chamando o método WdfDeviceGetDefaultQueue .
Se você quiser usar mais de uma fila de E/S para um dispositivo, o driver poderá chamar WdfIoQueueCreate para criar quantos objetos de fila forem necessários. Se um driver criar várias filas, ele poderá chamar WdfDeviceConfigureRequestDispatching, que instrui a estrutura a direcionar diferentes tipos de solicitações para filas diferentes. Por exemplo, você pode especificar que todas as solicitações de leitura serão entregues a uma fila e todas as solicitações de gravação serão entregues a outra fila.
Se o driver criar um conjunto de filas de E/S e chamar WdfDeviceConfigureRequestDispatching para direcionar cada tipo de solicitação que o driver pode receber para uma fila específica, o driver não precisará de uma fila padrão.
Se um driver não fornecer uma fila de E/S para solicitações de um tipo específico e se o driver for um driver de função, a estrutura concluirá solicitações desse tipo com uma conclusão status valor de STATUS_INVALID_DEVICE_REQUEST. Se o driver for um driver de filtro e tiver chamado WdfFdoInitSetFilter, a estrutura encaminhará automaticamente essas solicitações para o driver mais baixo na pilha de driver. Assim, por exemplo, um driver de filtro que não processa solicitações de leitura não precisa fornecer uma fila de E/S que recebe solicitações de leitura.
Para obter exemplos de como os drivers podem usar filas de E/S, consulte Usos de exemplo de filas de E/S.