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


Фильтрация конкретных распределителей

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

Фильтр получает IRP_MJ_CREATE типа KSCREATE_REQUEST_ALLOCATOR с указанием параметров кадрирования для распределителя. Подпрограмма создания распределителя minidriver проверяет запрос на создание, вызывая KsValidateAllocatorCreateRequest. Если вызов выполнен успешно, эта подпрограмма возвращает указатель на соответствующую структуру KSALLOCATOR_FRAMING .

Если фильтр не может удовлетворить требования к кадру, он возвращает код сбоя в ответ на IRP. В противном случае фильтр прикрепляет указатель на структуру к элементу FsContext файлового объекта и обслуживает полученные запросы распределителя.

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

Есть два интерфейса, доступных для распределителя. Во-первых, все распределители должны поддерживать KSMETHODSETID_StreamAllocator на основе IRP. Распределители, использующие этот механизм, ограничены максимальным количеством выделенных кадров. Запросы на выделение кадров, превышающие это ограничение, будут помечены как ожидающие.

Во-вторых, мини-накопитель может поддерживать доступ к таблицам функций, если тип пула распределения можно обслуживать в DISPATCH_LEVEL. Предоставление доступа к таблице функций является необязательным. Это можно сделать, поддерживая свойства в KSPROPSETID_StreamAllocator.

Интерфейс DISPATCH_LEVEL работает следующим образом:

Когда запрос на выделение отправляется в распределитель, распределитель возвращает указатель на кадр, если он доступен. В противном случае он немедленно возвращает значение NULL.

Когда свободный запрос отправляется распределителю, распределителй сообщает о событии "свободный кадр" потока, уведомляя клиента о доступности свободного кадра. Кроме того, если есть запросы на выделение, ожидающие завершения, распределителю необходимо запланировать рабочий элемент (если текущий IRQL не PASSIVE_LEVEL) и завершить запрос с помощью свободного кадра.

Как интерфейс DISPATCH_LEVEL, так и интерфейс на основе IRP могут бороться за свободные кадры. KS синхронизирует эту очередь с помощью отмены блокировки спина.