Фильтрация конкретных распределителей
Фильтры, требующие выделения для встроенной памяти или других методов хранения, зависящих от устройств, могут предоставить определенный распределител, поддерживая свойства и методы распределителя. Дополнительные сведения см. в разделе 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 синхронизирует эту очередь с помощью отмены блокировки спина.