Использование Avc.sys

После загрузки и инициализации WindowsAvc.sysAvc.sys использует стандартные команды единиц av/C и subunit для обнаружения активных дочерних элементов на всех устройствах AV/C, подключенных к шине IEEE 1394 (включая любые виртуальные подразделения, если компьютер является виртуальным блоком AV/C). Avc.sys затем создает идентификаторы устройств для всех активных подсоединений. Далее Avc.sys использует стандартные механизмы Plug and Play (PnP) для загрузки соответствующего драйвера подсоединия для каждой из них. Загружаемый драйвер подсоединия выбирается на основе INF-файла, устанавливающего драйвер подсоединия, и идентификатора устройства подсоединия, созданного Avc.sys и описанного в разделе Идентификаторы устройств AV/C. Идентификатор устройства создается на основе сведений об единице устройства AV/C в сочетании с полями SubunitType и SubunitID в подъедините. Драйвер, поддерживающий подсоединие, может быть зависящим от поставщика или универсальным для типа подсоединения. Например, драйвером подсоединителя для большинства видеокамер DV является предоставленный Корпорацией Майкрософт Msdv.sys.

Драйверы subunit взаимодействуют с Avc.sys с помощью стандартного механизма на основе IRP, используемого всеми драйверами на основе архитектуры WDM. Драйвер подсоединения взаимодействует со своей подсоединием AV/C, выделяя и отправляя IRP вниз по стеку драйверов в драйвер протокола AV/C, Avc.sys. Чтобы выполнять запросы ввода-вывода, добавьте файл заголовка Avc.h, который поставляется вместе с пакетом драйверов Microsoft Windows (WDK).

Драйвер подсоединия выделяет и инициализирует IRP для обработки Avc.sys. Драйвер подсоединия задает для элемента Parameters.DeviceIoControl.IoControlCode IRP значение IOCTL, соответствующее требуемой операции AV/C.

Avc.sys регистрирует один из двух интерфейсов устройств в зависимости от того, какой стек драйверов подсоединения был загружен для поддержки (одноранговый или виртуальный). Эти интерфейсы определяют функциональные возможности, которые Avc.sys экспортировать для драйверов подсоединений, других драйверов и приложений для использования. Avc.sys затем изменит состояние интерфейса на включено или отключено в соответствии с состоянием PnP драйвера.

Avc.sys регистрирует новый экземпляр GUID_AVC_CLASS, если он был загружен, чтобы обеспечить поддержку внешних подъединиц AV/C (одноранговый стек). Этот интерфейс поддерживает только следующий код элемента управления вводом-выводом (IOCTL):

IOCTL_AVC_CLASS, в свою очередь, поддерживает несколько кодов функций. Дочерние драйверы экземпляров Avc.sys для поддержки одноранговых вложенных элементов гарантированно имеют доступ к этому интерфейсу через родительский объект устройства.

Интерфейс GUID_AVC_CLASS поддерживает все коды функций IOCTL_AVC_CLASS, хотя некоторые из них имеют ограничения на их использование, как описано на справочных страницах для каждой функции.

Avc.sys регистрирует новый экземпляр GUID_VIRTUAL_AVC_CLASS, если он был загружен, чтобы обеспечить поддержку виртуальных субъединиц AV/C (виртуальный стек). Этот интерфейс поддерживает четыре кода управления вводом-выводом (IOCTL):

Интерфейс GUID_VIRTUAL_AVC_CLASS не поддерживает каждый код функции IOCTL_AVC_CLASS. Справочная страница для каждого кода функции указывает, поддерживается ли он для GUID_VIRTUAL_AVC_CLASS экземпляров Avc.sys.

IOCTL_AVC_CLASS IRP поддерживаются только в режиме ядра (обычно для обмена данными между драйверами) через IRP_MJ_INTERNAL_DEVICE_CONTROL. Поэтому приложения не могут напрямую обращаться к функциям, предоставляемым IOCTL_AVC_CLASS кодом IOCTL.

Последние три кода IOCTL поддерживаются как в режиме ядра, так и в пользовательском режиме через IRP_MJ_DEVICE_CONTROL. Это означает, что приложения могут отправлять эти ioCTL непосредственно вAvc.sys.

Код IOCTL IOCTL_AVC_CLASS всегда должен сопровождаться блоком запросов ввода-вывода (IRB), который дополнительно описывает выполняемую операцию AV/C. Заголовок IRB содержит номер функции, который определяет структуру остальной части IRB. Структура и размер IRB зависят от функции. Avc.sys использует две пользовательские IRB:

Выбор того, какой IRB должен использовать драйвер подсоединения, зависит от нужной функции. Дополнительные сведения о кодах функций IOCTL_AVC_CLASS, поддерживаемыхAvc.sys, см. в разделе Коды функций драйвера протокола AV/C.

Основной функцией AV/C, используемой драйверами подсоединения, является AVC_FUNCTION_COMMAND, использующая структуру AVC_COMMAND_IRB. AVC_FUNCTION_COMMAND отправляет запросы AV/C и получает соответствующие ответы AV/C. Сведения о создании команд AV/C обрабатываются Avc.sys, но драйвер подсоединения должен предоставлять код операции AV/C и операнды каждой команды.