¿Qué tipo de DPC debe usar?
Dependiendo del diseño de un controlador, puede tener cualquiera de las siguientes opciones:
Un único DpcForIsr para completar todas las operaciones de E/S controladas por interrupciones
Un conjunto de una o varias rutinas CustomDpc .
Tanto un DpcForIsr como un conjunto de rutinas CustomDpc específicas de la operación
Si un controlador tiene una sola rutina DpcForIsr , un conjunto de rutinas CustomDpc o ambas, depende de la naturaleza de su dispositivo subyacente y del conjunto de solicitudes de E/S que debe admitir.
La mayoría de los controladores de dispositivos de nivel más bajo tienen una sola rutina DpcForIsr para completar el procesamiento de E/S para cada IRP que requiera una o varias operaciones en sus respectivos dispositivos. El uso de un solo DpcForIsr para completar operaciones de E/S controladas por interrupciones en un dispositivo que realiza una operación a la vez es relativamente fácil. Este isr de controlador solo necesita llamar a IoRequestDpc para cada operación de E/S controlada por interrupciones.
Algunos controladores de nivel más bajo tienen rutinas customDpc a menos que sus dispositivos requieran más de un DPC para completar un conjunto variado de operaciones de E/S controladas por interrupciones.
El uso de un solo DpcForIsr para completar operaciones de E/S superpuestas y controladas por interrupciones en un dispositivo que puede realizar operaciones simultáneas es posible con un diseño cuidadoso, pero puede ser relativamente difícil. Además de o en lugar de poner en cola un DpcForIsr, un ISR puede poner en cola un conjunto de rutinas CustomDpc específicas de la operación proporcionadas por el controlador mediante una llamada a KeInsertQueueDpc.
Por ejemplo, considere algunos de los desafíos de diseño implicados en la escritura de un controlador serie. Como controlador de un dispositivo dúplex completo, un controlador serie no puede confiar en una correspondencia uno a uno entre el orden en que los IRP se ponen en cola en una rutina StartIo y la secuencia de interrupciones de su dispositivo en un sistema multiprocesador y multiprocesador. Además, los controladores serie deben controlar las solicitudes de tiempo de espera y las solicitudes generadas por el usuario asincrónicas para cancelar las operaciones solicitadas anteriormente, para purgar los datos almacenados en búfer, etc.
Por lo tanto, un controlador serie puede mantener colas internas para las operaciones de lectura, escritura, purga y espera que las aplicaciones de puerto COM en modo de usuario pueden solicitar. También podría mantener recuentos de referencias o usar algún otro mecanismo de seguimiento, como un conjunto de marcas, para los IRP en sus colas internas. Su ISR llamaría a KeInsertQueueDpc con cualquiera de los objetos DPC asignados por el controlador e inicializados, cada uno asociado a una rutina CustomDpc proporcionada por el controlador.