Программирование драйверов Windows

       

Процедура ControllerControl


Существуют устройства, которые поддерживает более одной функции, но в отдельный момент времени может быть задействована только одна из них. При некотором воображении можно представить себе один контроллер, который реализует операции ввода/вывода для нескольких подключенных к нему дополнительных устройств, реализующих функции. Соответственно, необходимо создать абстракцию синхронизации доступа к этому котроллеру со стороны подключенных устройств-функций.

В Windows NT эта абстракция реализована в виде объектов контроллера, которые создается вызовом IoAllocateController. Как правило, процедура, запускающая операцию ввода/вывода, выполняет запрос "владения" объектом контроллера при помощи вызова IoAllocateController, одновременно устанавливая процедуру, которая получит управление, как только запрос на владение будет удовлетворен. Эта callback процедура известна в литературе под именем ControllerControl. По завершении обработки запроса ввода/вывода драйвер освобождает контроллер вызовом IoFreeController.

Следует обратить внимание, что использовать абстракцию объекта контроллера полезно не столько для возможности запуска разных процедур ControllerControl (она может быть единственной), сколько для разделения доступа из них к общим для данного устройства ресурсам (как драйверным, так и аппаратным), а также для разделения этих обращений во времени.

Объекты контроллера в модели WDM не поддерживаются, то есть разработчики DDK ограничили применение этой абстракции только драйверами "в-стиле-NT" (legacy драйверами).



Содержание раздела