Обработка перекрывающихся операций ввода-вывода

Подпрограмма DpcForIsr или CustomDpc драйвера, который перекрывает операции на своем устройстве, не может полагаться на соответствие "один к одному" между входными запросами в подпрограмму StartIo и вызовами ISR IoRequestDpc или KeInsertQueueDpc. DpcForIsr или CustomDpc такого драйвера не могут обязательно использовать входные указатели на контекст, предоставленный IRP и ISR, или указатель CurrentIrp в объекте целевого устройства для завершения только этого IRP.

В любой момент один и тот же объект DPC не может быть помещен в очередь дважды. Если ISR вызывает IoRequestDpc или KeInsertQueueDpc несколько раз перед выполнением соответствующего DpcForIsr или CustomDpc , подпрограмма DPC выполняется только один раз, когда IRQL на процессоре падает ниже DISPATCH_LEVEL. С другой стороны, если ISR вызывает IoRequestDpc или KeInsertQueueDpc , а соответствующий DpcForIsr или CustomDpc выполняется на другом процессоре, подпрограмма DPC может выполняться одновременно на двух процессорах.

Таким образом, любой драйвер, перекрывающий операции ввода-вывода, управляемые прерыванием, на своем устройстве должен иметь следующее:

  • Подпрограмма DpcForIsr или CustomDpc , которая может выполнять некоторые поддерживаемые драйвером количество невыполненных запросов при каждом вызове.

  • ISR, который никогда не перезаписывает сведения о контексте, передаваемые в подпрограмму DpcForIsr или CustomDpc , пока эта подпрограмма не будет использовать сведения контекста и не завершит IRP, к которому относится контекстная информация.

  • Подпрограмма SynchCritSection, которая обращается к области контекста ISR от имени подпрограммы DpcForIsr или CustomDpc.