Какой тип DPC следует использовать?
В зависимости от конструкции драйвера он может иметь любой из следующих компонентов:
Один DpcForIsr для выполнения всех операций ввода-вывода, управляемых прерыванием.
Набор из одной или нескольких подпрограмм CustomDpc .
Как DpcForIsr , так и набор процедур CustomDpc для конкретных операций
Независимо от того, есть ли у драйвера одна подпрограмма DpcForIsr , набор процедур CustomDpc или и то, и другое, зависит от характера базового устройства и набора запросов ввода-вывода, которые он должен поддерживать.
Большинство драйверов устройств самого низкого уровня имеют одну подпрограмму DpcForIsr для завершения обработки ввода-вывода для каждого IRP, для которого требуется одна или несколько операций на соответствующих устройствах. Использование одного DpcForIsr для выполнения операций ввода-вывода, управляемых прерыванием, для каждого запроса на устройстве, которое выполняет по одной операции за раз, относительно просто. Для каждой операции ввода-вывода, управляемой прерыванием, необходимо вызывать ioRequestDpc такого драйвера.
Немногие драйверы самого низкого уровня имеют подпрограммы CustomDpc , если их устройствам не требуется более одного DPC для выполнения разнообразных операций ввода-вывода, управляемых прерываниями.
Использование одного DpcForIsr для выполнения перекрывающихся операций ввода-вывода, управляемых прерыванием, на устройстве, которое может выполнять параллельные операции, возможно при тщательном проектировании, но может быть относительно сложным. В дополнение к DpcForIsr или вместо очереди, ISR может ставить в очередь набор процедур CustomDpc , предоставляемых драйвером, путем вызова KeInsertQueueDpc.
Например, рассмотрим некоторые проблемы проектирования, связанные с написанием серийного драйвера. Как драйвер полнодуплексного устройства последовательный драйвер не может полагаться на соответствие "один к одному" между порядком, в котором irP помещаются в очередь в подпрограмму StartIo , и последовательностью прерываний с устройства в многозадачной многопроцессорной системе. Кроме того, последовательные драйверы должны обрабатывать запросы времени ожидания и асинхронные запросы, созданные пользователем, для отмены ранее запрошенных операций, для очистки буферизованных данных и т. д.
Следовательно, последовательный драйвер может поддерживать внутренние очереди для операций чтения, записи, очистки и ожидания, которые могут запрашивать приложения com-портов пользовательского режима. Он также может поддерживать количество ссылок или использовать другой механизм отслеживания, например набор флагов, для IRP во внутренних очередях. Его ISR будет вызывать KeInsertQueueDpc с любым из нескольких выделенных драйвером и инициализированных объектов DPC, каждый из которых связан с предоставленной драйвером подпрограммой CustomDpc .