Compartilhar via


Qual tipo de DPC você deve usar?

Dependendo do design de um driver, ele pode ter qualquer um dos seguintes:

  • Um único DpcForIsr para concluir todas as operações de E/S controladas por interrupção

  • Um conjunto de uma ou mais rotinas CustomDpc .

  • Um DpcForIsr e um conjunto de rotinas CustomDpc específicas da operação

Se um driver tem uma única rotina DpcForIsr , um conjunto de rotinas CustomDpc ou ambas, depende da natureza de seu dispositivo subjacente e do conjunto de solicitações de E/S que ele deve dar suporte.

A maioria dos drivers de dispositivo de nível mais baixo tem uma única rotina DpcForIsr para concluir o processamento de E/S para cada IRP que requer uma ou mais operações em seus respectivos dispositivos. Usar um único DpcForIsr para concluir operações de E/S controladas por solicitação e interrupção em um dispositivo que faz uma operação por vez é relativamente fácil. O ISR desse driver só precisa chamar IoRequestDpc para cada operação de E/S controlada por interrupção.

Poucos drivers de nível mais baixo têm rotinas CustomDpc , a menos que seus dispositivos exijam mais de um DPC para concluir um conjunto variado de operações de E/S controladas por interrupção.

Usar um único DpcForIsr para concluir operações de E/S sobrepostas controladas por interrupção em um dispositivo que pode fazer operações simultâneas é possível com design cuidadoso, mas pode ser relativamente difícil. Além de ou em vez de enfileirar um DpcForIsr, um ISR pode enfileirar um conjunto de rotinas CustomDpc específicas da operação e fornecidas pelo driver chamando KeInsertQueueDpc.

Por exemplo, considere alguns dos desafios de design envolvidos na escrita de um driver serial. Como o driver de um dispositivo completo duplex, um driver serial não pode contar com uma correspondência um-para-um entre a ordem em que os IRPs são enfileirados para uma rotina StartIo e a sequência de interrupções de seu dispositivo em um sistema multitarefa multiprocessador. Além disso, os drivers serial devem lidar com solicitações de tempo limite e solicitações assíncronas geradas pelo usuário para cancelar operações solicitadas anteriormente, limpar dados armazenados em buffer e assim por diante.

Consequentemente, um driver serial pode manter filas internas para as operações de leitura, gravação, limpeza e espera que os aplicativos de porta COM no modo de usuário podem solicitar. Ele também pode manter contagens de referência ou usar algum outro mecanismo de acompanhamento, como um conjunto de sinalizadores, para os IRPs em suas filas internas. Seu ISR chamaria KeInsertQueueDpc com qualquer um dos vários objetos DPC alocados e inicializados pelo driver, cada um associado a uma rotina CustomDpc fornecida pelo driver.