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


Написание мини-драйвера Stream

Цель main разработки драйвера класса потока заключается в обработке операционной системы, которая включает в себя сложности поддержки многопроцессорных компьютеров, и поддержку семантики потоковой передачи ядра. Для этого требуется, чтобы мини-диск обрабатывал только часть операций, относящихся к конкретному устройству, которые он должен выполнить. Драйвер класса выделяет память для мини-накопителя, ведет учет всех ресурсов ядра NT, которые могут потребоваться мини-driver, и (при необходимости) обрабатывает все проблемы синхронизации.

Драйвер класса взаимодействует с мини-диском через набор обратных вызовов, предоставляемых мини-диском. Большая часть работы по написанию мини-драйвера потоковой передачи выполняется при написании этих обратных вызовов.

В этой документации каждый тип процедур, предоставляемых мини-driver, называется StrMiniXxx. В зависимости от того, сколько различных функций может выполнять базовое оборудование, может потребоваться предоставить одну или несколько версий каждой подпрограммы.

Драйвер потоковой передачи обычно может поддерживать несколько разных потоков данных. Например, DVD-проигрыватель создает аудио- и видеопоток. В контексте потоковой передачи ядра каждый поток данных представлен закреплением.

Драйвер класса stream отслеживает каждый контакт на мини-накопителе. В терминологии драйвера класса каждый тип закрепления является потоком. Потоки, как и типы контактов, могут иметь несколько экземпляров. Так как потоки могут получать запросы ввода-вывода, драйвер должен предоставлять обратные вызовы для каждого потока.

Ниже приведены процедуры, которые может потребоваться предоставить мини-накопителю. Они более подробно описаны ниже и в справочном руководстве.

Подпрограммы, которые предоставляет каждый мини-диск

StrMiniCancelPacket

StrMiniReceiveDevicePacket

StrMiniRequestTimeout

StrMiniEvent

StrMiniInterrupt

Подпрограммы, которые предоставляет мини-driver для каждого отдельного потока

StrMiniReceiveStreamDataPacket

StrMiniReceiveStreamControlPacket

StrMiniEvent

StrMiniClock

Мини-диск может использовать один и тот же обратный вызов для нескольких разных потоков. Обратный вызов может определить поток, от имени которого он был вызван из параметров.

Мини-драйвер должен, как и все драйверы WDM, также предоставлять подпрограмму DriverEntry . Задача main подпрограммы DriverEntry мини-driver заключается в регистрации мини-драйвера класса.

Драйвер класса получает все запросы ввода-вывода от имени мини-драйвера. Чтобы получить сведения, необходимые для выполнения запроса, драйвер класса создает блок запросов потока (SRB) и передает его одной из подпрограмм Пакета StrMiniXXX. Драйвер класса отправляет запросы ввода-вывода на устройство в целом в подпрограмму StrMiniReceiveDevicePacket . Он передает запросы к отдельным потокам в StrMiniReceiveStreamDataPacket (для потоковых запросов на чтение и запись ядра) или StrMiniReceiveStreamControlPacket (для других запросов).

Как правило, драйвер класса помещает свои запросы в очередь и передает их по одному в мини-диск. При необходимости мини-диск может выполнять собственную синхронизацию; затем мини-диск отвечает за запросы очередей, которые он не может немедленно обработать. Дополнительные сведения см. в разделе Синхронизация мини-накопителей .

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

При возникновении аппаратного прерывания операционная система отправляет сигнал драйверу класса, который затем вызывает подпрограмму StrMiniInterrupt мини-драйвера для обработки прерывания.