Поделиться через


Написание процедур DPC

Основные обязанности подпрограмм DpcForIsr и CustomDpc обеспечивают оперативное выполнение следующей операции ввода-вывода устройства и завершения текущей процедуры IRP.

Дополнительная работа, выполняемая любой подпрограммой DpcForIsr или CustomDpc , зависит от дизайна драйвера и характера устройства. Например, подпрограмма DpcForIsr или CustomDpc также может выполнять любое из следующих действий:

  • Повторите операцию, которая прервалась по тайм-ауту или завершилась сбоем.

  • Вызовите IoAllocateErrorLogEntry, настройте пакет журнала ошибок для сообщения об ошибке ввода-вывода устройства и вызовите IoWriteErrorLogEntry.

    Дополнительные сведения об обработке ошибок ввода-вывода см. в разделе "Ошибки ведения журнала".

  • Если драйвер использует буферизованный ввод-вывод или если IRP указывает операцию управления устройством, перед завершением IRP передают данные, считываемые с устройства, на системный буфер в Irp-AssociatedIrp.SystemBuffer>.

  • Если драйвер использует прямые операции ввода-вывода и должен разбить большие передачи на небольшие части, сохраните состояние о каждой только что завершенной операции частичной передачи, вычислите следующий диапазон частичной передачи и используйте подпрограмму SynchCritSection , предоставляемую драйвером, чтобы программировать устройство для следующей операции частичной передачи.

    Даже драйвер, использующий буферный ввод-вывод, может потребоваться разделить запрос на передачу, если его устройство имеет ограниченные возможности передачи.

  • Если драйвер использует DMA на основе пакетов, вызовите FlushAdapterBuffers после каждой операции передачи устройства и вызовите FreeAdapterChannel или FreeMapRegisters при выполнении последовательности частичной передачи и выполняется полный запрос на передачу.

    Если запрошенная передача удовлетворена лишь частично одной операцией DMA, подпрограмма DpcForIsr или CustomDpc обычно отвечает за дополнительную настройку одной или более операций DMA до тех пор, пока все заданное количество байтов в IRP не будет полностью передано.

    Дополнительные сведения об использовании DMA см. в разделе "Объекты адаптера" и "DMA".

  • Если драйвер использует запрограммированный ввод-вывод (PIO), вызовите KeFlushIoBuffers в конце каждой операции передачи, если текущий IRP запрашивает чтение.

    Если запрошенная передача только частично удовлетворена одной операцией PIO, подпрограмма DpcForIsr или CustomDpc обычно отвечает за настройку одной или нескольких операций передачи, пока указанное в IRP число байтов не будет полностью передано.

    Дополнительные сведения об использовании ПИО см. в разделе "Использование прямого ввода-вывода".

  • Если драйвер, отличный от WDM, имеет подпрограмму ControllerControl , вызовите IoFreeController после завершения запрошенной операции.

Обратите внимание, что процедура DpcForIsr или CustomDpc обычно выполняет большую часть обработки ввода-вывода устройства драйвера для обработки IRP. Эти подпрограммы также разделяют некоторые обязанности по постановке IRP в очередь на устройство с диспетчерскими подпрограммами драйвера.

Рассмотрим следующие общие рекомендации по проектированию.

  • Любая подпрограмма DpcForIsr или CustomDpc должна вызывать IoStartNextPacket, сразу же, как это станет безопасно: то есть, не вызывая конфликта ресурсов или состояния гонки ресурсов с подпрограммой StartIo драйвера или любой другой рутиной, которую может вызвать StartIo.

  • Если драйвер управляет собственной очередью IRPs, его подпрограмма DpcForIsr или CustomDpc должна уведомить драйвер, как только он будет безопасно вывести следующий IRP и настроить устройство для следующего запроса.

Подпрограмма DpcForIsr или CustomDpc должна вызывать IoStartNextPacket или уведомлять соответствующую подпрограмму драйвера при запуске обработки ввода-вывода устройства для следующего запроса. В зависимости от драйвера и его устройства это может произойти, прежде чем подпрограмма DpcForIsr или CustomDpc завершает текущий IRP с IoCompleteRequest или может произойти непосредственно до завершения текущей процедуры IRP и возврата управления.