Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Фильтры, требующие выделения для локальной памяти или других методов хранения, зависимых от устройств, могут предоставлять конкретный распределитель, поддерживая свойства и методы распределителя. Дополнительные сведения см. в разделе KSPROPERTY_STREAM_ALLOCATOR.
Фильтр получает IRP_MJ_CREATE типа KSCREATE_REQUEST_ALLOCATOR с указанием параметров обрамления для распределителя. Подпрограмма создания распределителя минидрайвера проверяет запрос на создание путем вызова KsValidateAllocatorCreateRequest. Если вызов выполнен успешно, эта подпрограмма возвращает указатель на соответствующую KSALLOCATOR_FRAMING структуру.
Если фильтр не может удовлетворить требования к обрамлению, он возвращает код ошибки в качестве ответа на IRP. В противном случае фильтр присоединяет указатель структуры к члену FsContext объекта файла и обслуживает соответствующие запросы распределителя.
Если буферы, передаваемые в интерфейс потоковой передачи, необходимо изменить на месте фильтром, клиент пользовательского режима устанавливает флаг KSALLOCATOR_REQUIREMENTF_INPLACE_MODIFIER для соответствующей структуры KSALLOCATOR_FRAMING.
Существует два интерфейса, доступных для распределителя. Во-первых, все распределители должны поддерживать KSMETHODSETID_StreamAllocator на основе IRP. Распределители, использующие этот механизм, ограничены максимальным количеством выделенных фреймов. Запросы на выделение кадров, превышающие этот предел, будут отложены.
Во-вторых, минидрайвер может поддерживать доступ к таблице функций, если тип пула выделения можно обслуживать на уровне DISPATCH_LEVEL. Предоставление доступа к таблице функций является необязательным. Это можно сделать, поддерживая свойства в KSPROPSETID_StreamAllocator.
Интерфейс DISPATCH_LEVEL работает следующим образом:
Когда запрос на выделение отправляется в распределитель, он возвращает указатель на кадр, если тот доступен. Если нет, он сразу возвращает NULL.
Когда запрос на освобождение отправляется в распределитель, распределитель сигнализирует о событии "освободить фрейм" потока, уведомляя клиента о доступности свободного фрейма. Кроме того, если имеются ожидающие завершения IRP-запросы на выделение, распределитель должен запланировать рабочий элемент (если текущий IRQL не PASSIVE_LEVEL) и завершить запрос с использованием свободной страницы.
Интерфейс DISPATCH_LEVEL и интерфейс на основе IRP могут конкурировать за свободные кадры. KS синхронизирует эту очередь с помощью блокировки прерывания спина.