Контакты KS
Мини-диск предоставляет KSPIN_DESCRIPTOR структуру для каждого типа контактов, которые необходимо создать. Структура дескриптора закрепления называется фабрикой контактов. Каждая фабрика контактов может создавать экземпляры одного или нескольких экземпляров контактов определенного типа. Фабрика контактов содержит несколько массивов, описывающих тип контакта, создаваемого этим дескриптором.
Мини-диск указывает одну или несколько категорий KS, к которым относятся контакты, созданные этим дескриптором, в элементе Categories KSPIN_DESCRIPTOR. KS использует категории для подключения экземпляров контактов при построении графа фильтра. Свойство KSPROPERTY_TOPOLOGY_CATEGORIES запрашивает массив функциональных категорий, поддерживаемых драйвером.
Мини-накопитель предоставляет INF-файл, который регистрирует одно или несколько имен закрепленных устройств. При установке операционная система загружает имена и соответствующие категории в системный реестр. Затем клиенты могут выполнять вызовы create-file с этими именами устройств для создания экземпляров контактов.
Клиенты пользовательского режима вызывают функцию Win32 CreateFile с именем устройства. Например, "\\.\filters\audio\default renderer" может быть ссылкой на звуковое устройство, настроенное для вывода по умолчанию. Клиенты в режиме ядра вызывают ZwCreateFile из режима ядра. После того как подпрограмма создания файла возвращает дескриптор файла, клиенты KS взаимодействуют с экземплярами контактов через свойства KS.
В структурах дескриптора контактов мини-диск размещает массивы KSPIN_INTERFACE структур и KSPIN_MEDIUM структур, которые указывают интерфейсы и среды, поддерживаемые этой фабрикой контактов. KSPIN_DESCRIPTOR также указывает допустимые диапазоны данных для контактов, созданных этой фабрикой. Это делается путем предоставления указателя на массив структур KSDATARANGE . Мини-диск также указывает направления передачи данных и потока обмена данными для новых контактов, созданных этой фабрикой контактов.
Мини-driver позволяет обнаруживать во время выполнения фабрики контактов, поддерживая набор свойств KSPROPSETID_Pin .
Чтобы создать закрепленное подключение, вызовите подпрограмму KsCreatePin . В этом вызове мини-диск передает указатель на структуру типа KSPIN_CONNECT , описывающую запрошенное подключение. При создании закрепления фильтр видит новый контакт как объект файла, подчиненный объекту файла для этого фильтра.
Мини-накопитель вызывает KsValidateConnectRequest со структурами дескрипторов, указанными в результирующем IRP_MJ_CREATE. Эта подпрограмма проверяет эти структуры и возвращает указатель на структуру соединения и объект корневого файла.
Мини-накопители используют элементы потока данных и взаимодействияструктур KSPIN_DESCRIPTOR для определения следующих особенностей закрепления:
Исходный контакт IRP и контакт приемника IRP
Пин-код источника IRP выдает irp; их получает контакт приемника IRP . Клиент пользовательского режима отправляет запросы ввода-вывода непосредственно в контакт приемника IRP через соответствующий дескриптор файла. Клиенты используют KSPROPERTY_PIN_COMMUNICATION для проверка, в какой тип закрепления передаются данные.
Контакт источника данных и контакт приемника данных
Контакт источника данных — это выходной контакт на фильтре; контакт приемника данных — это входной контакт. Свойство быть источником данных или приемником не зависит от того, является источником или приемником IRP. Например, клиент может подключить источник данных, контакт приемника IRP к приемнику данных, а также контакт источника IRP. Клиенты используют KSPROPERTY_PIN_DATAFLOW, чтобы проверка, в какой тип закрепления передаются данные.
При завершении соединения дескриптор исходного контакта должен быть закрыт перед уничтожением базового файлового объекта. Если исходный контакт зависит от ресурсов, предоставляемых контактом приемника, он отвечает за уведомление источника о прекращении подключения.
Клиент взаимодействует с пин-кодом потоковой передачи ядра, вызывая подпрограмму DeviceIoControl (описанную в документации по Microsoft Windows SDK) с помощью IRP_MJ_DEVICE_CONTROL. Вызывающий объект идентифицирует свой запрос с помощью кода элемента управления вводом-выводом, который он помещает в Parameters.DeviceIoControl.IoControlCode в структуре расположения стека ввода-вывода.
Для поддержки запросов мини-диск предоставляет указатель на структуру KSDISPATCH_TABLE в вызове KsAllocateObjectHeader.
Запросы на запись содержат указатель на массив KSSTREAM_HEADER структур, которые, в свою очередь, содержат указатели на потоковые данные. Запросы на чтение содержат указатель на массив пустых структур заголовков, в которые должны возвращаться данные чтения.