Управление сервисами и драйверами windows. Управление драйверами устройства. Управление загрузочными драйверами с помощью профилей выбора

Порядок загрузки драйверов и сервисов в Windows



Тем, кому интересно внутреннее устойство операционной системы Windows, предлагаю небольшое исследование. Мы попробуем выяснить, что отвечает за порядок загрузки драйверов и сервисов в Windows и можно ли этот порядок изменить.

Прежде всего посмотрим текущий порядок запуска системы с помощью программы LoadOrder от Sysinternals. Программа покажет нам, что и в каком порядке загружается при запуске операционной системы.

Как видно из рисунка, сначала загружаются драйверы устройств, необходимые для запуска системы, а потом различные Windows-сервисы. Поскольку между загрузкой сервисов и загрузкой драйверов есть некоторые различия, рассматривать их будем по отдельности.

Драйверы

В качестве подопытного возьмем драйвер Microsoft ACPI (Advanced Configuration and Power Interface), который отвечает за обнаружение аппаратного обеспечения и управление питанием. Задача ACPI - обеспечить взаимодействие между операционной системой и аппаратным обеспечением, поэтому драйвер ACPI загружается в самом начале.

Программа Loadorder предоставляет довольно ограниченную информацию о порядке загрузки, поэтому за более точными данными идем в реестр. У каждого драйвера и Windows-сервиса есть свой раздел в ветви реестра HKLM\SYSTEM\CurrentControlSet\Services. Названы разделы по имени драйвера\сервиса, соответственно нам нужен раздел ACPI.

За порядок загрузки драйвера отвечают три параметра реестра. Основной параметр Start - определяет тип запуска драйвера. Вот правила, по которым драйверы устанавливают значение своего параметра Start:

Драйверы, которые должны загружаться системным загрузчиком при запуске операционной системы , указывают значение Start равное 0 (запуск при загрузке системы ). Пример - драйверы системных шин и драйвер файловой системы, используемый при загрузке системы;
Драйвер, который не требуется непосредственно для загрузки системы , указывает в Start значение, равное 1 (запуск системой ). Пример - стандартный драйвер видеокарты (VgaSave);
Драйвер, не обязательный для загрузки системы , устанавливает значение Start равным 2 (автозапуск ). Пример - драйвер многосетевого UNC-npoвайдера (Multiple UNC Provider, MUP), поддерживающий UNC-имена удаленных ресурсов (типа );
Драйверы, не обязательные для работы операционной системы (например, драйверы сетевых адаптеров), указывают значение Start равным 3 (запуск по требованию ).

Также драйверы устройств могут использовать параметры Group и Tag для контроля порядка своей загрузки при запуске системы. Параметр Group драйверы\сервисы используют, чтобы указать группу, к которой они принадлежат, а порядок загрузки групп определяется параметром List , находящимся в разделе HKLM\SYSTEM\ CurrentControlSet\Control\ServiceGroupOrder\.

Кстати, параметр Group указывать не обязательно. Если драйвер\сервис не входит в какую либо группу, то он загружается в самом конце очереди.

Драйвер может еще больше детализировать порядок своей загрузки с помощью параметра Tag, который указывает конкретную позицию драйвера в группе. Диспетчер ввода-вывода сортирует драйверы в группе по значениям этого параметра, а драйверы, не имеющие параметра Tag, перемещаются в конец списка драйверов группы.

Посмотрев на порядок загрузки, можно подумать что сначала загружаются драйверы с меньшими значениями Tag, потом - с большими, но это не совсем так. Приоритет значений параметров Tag в рамках группы определяется в разделе HKLM\SYSTEM\CurrentControlSet\Control\GroupOrderList.

Для примера откроем двоичный параметр Boot Bus Extender, который соответствует одноименной группе, к которой относится и драйвер ACPI. Параметр представляет из себя набор двойных слов (по 4 байта каждое). Первое слово (выделено красным) задает общую длину переменной (количество двойных слов), в нашем примере 06. Остальные двойные слова как раз и являются тэгами. Драйверу ACPI соответствует тэг, равный 01 (выделен зеленым).

Приоритетность тега определяется не значением тега, а его положением: чем выше расположен тэг, тем выше его приоритет в группе, и тем выше приоритет драйвера, которому этот тэг соответствует. А поскольку 01 выше остальных тегов, то и драйвер ACPI загружается первым в группе.

Сервисы

Порядок загрузки Windows-сервисов несколько отличается от порядка загрузки драйверов. В качестве примера возьмем сервис aвтоматического обновления (wuauserv). Он не особо критичен для работы системы и поэтому грузится в последнюю очередь.

Опять идем в реестр. Параметры запуска сервиса находятся в разделе HKLM\SYSTEM\CurrentControlSet\Services\wuauserv. Я выделил два основных параметра, отвечающих за порядок загрузки данного сервиса.

Windows-сервисы запускаются диспетчером управления сервисами (Service Control Manager, SCM) в соответствии со значением параметра Start . Параметр этот для сервисов может принимать следующие значения:

Авто запуск (2) - сервис запускается автоматически, сразу после запуска основного SCM-процесса Services.exe;
Запуск по требованию (3) - сервис запускается при необходимости, по требованию какого либо сервиса или программы;
Отключено (4) - сервис отключен и не запускается ни при каких условиях.

Значения 0 (запуск при загрузке системы) и 1 (запуск системой) для сервисов не могут быть указаны, только для драйверов устройств.

Кроме того, начиная с Windows Vista\Server 2008 для сервисов появился еще один режим запуска - отложенный автозапуск. Отвечает за него параметр DelayedAutoStart = 1 , который который указывает SCM произвести автоматический старт данного сервиса с задержкой. SCM запускает службы, для которых выбран отложенный запуск, после загрузки сервисов, отмеченных для автозапуска.

Режимом запуска сервисов можно управлять не только из реестра, но и в графическом режиме, из консоли Службы (Services).

Так же как и драйверы, Windows-сервисы могут использовать параметр Group в своем разделе реестра, чтобы указать группу, к которой они принадлежат. Сейчас, для наглядности, возьмем наш сервис wuauserv, находящийся в самом конце списка загрузки. С помощью ключа Group поместим его в группу Event Log, перезагрузимся и посмотрим порядок загрузки в Loadorder. Как видите, порядок изменился и wuauserv поднялся с последнего места, загрузившись сразу после своего одногруппника - службы eventlog. Правда порядок размещения внутри группы изменить уже не получится, т.к. Tag для сервисов не используется.

И еще один параметр, который косвенно влияет на порядок загрузки сервисов - DependOnService . Он указывает, от каких сервисов зависит данный сервис. Соответственно сервис не загружается, пока не будут загружены сервисы, перечисленные в DependOnService.

Зависимости работают следующим образом - если сервисы находятся в одной группе, то зависимый сервис перемещается в конец списка и запускается после сервисов, от которых зависит. Если же группы разные, то сервис просто не запустится, а SCM выдаст ошибку.

Более наглядно это показано в оснастке Службы, где на вкладке Зависимости (Dependency) указаны как сервисы, от которых зависит данный сервис, так и сервисы, зависящие от него.

Вот мы и выяснили, в каком порядке загружаются драйверы и сервисы в Windows и как этот порядок можно изменить. Но прежде чем бросаться править реестр помните, что порядок загрузки драйверов и сервисов определяется автоматически, и не стоит вносить в него изменения без веской причины. Всего один неправильно выставленный параметр может привести к полной неработоспособности системы, и не факт что ее удасться восстановить. Поэтому, прежде чем приступить к редактированию реестра, обязательно сделайте его резервную копию, а также желательно иметь под рукой загрузочный носитель.

В предыдущей части этого цикла мы рассмотрели два подхода ("let Windows decide" и "let me decide"), которые можно использовать для управления внештатными драйверами при выполнении установки Lite Touch с помощью MDT 2010. В этой части мы завершим разговор о проблеме управления драйверами, здесь будут даны некоторые советы, хитрости и одна история. Первая история предоставлена мне одним из читателей, Тимом Лорсом (Tim Lors) и она является отличным наглядным примером тех проблем, с которыми вы можете столкнуться при попытках управления драйверами во время установки:

"Более года назад я написал программный сценарий, который устанавливает все драйверы на ПК WinXP. Проблема, с которой я столкнулся при выборе драйверов, не была связана с ОС. Это была неспособность производителя должным образом реализовать PnP между inf файлами их драйверов и самим аппаратным оборудованием. Если говорить точнее, inf файл указывал на то, что он является лучшим драйвером для определенного аппаратного устройства, когда, на самом деле, он не работает с таким устройством. Единственным способом подбора подходящего драйвера в такой непростой ситуации оказалось сравнение идентификационных номеров PnP аппаратного оборудования со списком известных проблемных драйверов, и если я находил совпадения, я вручную выбирал подходящий драйвер на основе дополнительных критериев " обычно номер модели ПК. Самым распространенным дополнительным критерием, необходимым для "let me decide" выбора, был номер модели ПК, но иногда включал версию BIOS и PnP subset ID, а в некоторых редких случаях это был способ проб и ошибок. Конечно, способ проб и ошибок довольно сложный, поскольку, когда Windows устанавливала тот драйвер, который считала самым подходящим, приходилось изолировать нерабочий драйвер от Windows, или система просто переустанавливала его. Обратите внимание, что такая ситуация возникала в среде, содержащей почти 10 000 ПК более чем 25 различных моделей".

Большинство ИТ специалистов, с которыми я разговаривал, говорили мне, что драйверы являются одной из основных головных болей, и вышеописанная история только служит тому подтверждением. Поэтому, посвятив последние четыре части этой теме, я хочу закончить обсуждение драйверов некоторыми советами и хитростями, которые помогут облегчить вам жизнь.

Поиск драйверов

Первой трудностью является поиск внештатных драйверов, которые могут потребоваться вашим системам. Некоторые производители облегчают эту задачу, другие – нет, и компания Dell является представителем первой группы, поскольку предоставляет драйверы для каждой настольной системы в виде.cab файла под каждую операционную систему. Для загрузки этих.cab файлов перейдите на сайт http://www.delltechcenter.com/ и в прокручивающемся меню слева выберите Home, Microsoft, Microsoft System Center, SCCM " System Center Configuration Manager, Dell Business Client Operating System Deployment, Dell Business Client Operating System Deployment " The .CAB Files и вы увидите страницу, показанную на рисунке 1:

Рисунок 1: Загрузка драйверов для клиентских систем Dell в виде.cab файлов

После загрузки.cab файла вы можете извлечь его в папку, затем сослаться на эту папку при импорте драйверов в свой установочный ресурс.

Другие производители также предоставляют инструменты для загрузки драйверов, но, на мой взгляд, эти инструменты не столь просты и удобны, как подход компании Dell. Вот несколько примеров таких инструментов и ссылок на них:

Извлечение INF файлов из EXE

Иногда производители систем поставляют драйверы устройств в форме.exe файлов, а не.cab файлов. В этом случае, отличным набором инструментов является WinRAR , который позволяет вам извлекать файлы драйверов из.exe файла в папку. Помните, для того чтобы импортировать драйвер, MDT требуется.inf файл и соответствующие файлы драйвера " невозможно импортировать.exe файл, как драйвер.

Предотвращение включения драйверов

Чтобы не позволить включение импортированного вами драйвера (например, если ваши проверки показали, что драйвер после установки вызывает проблемы), просто откройте свойства драйвера и очистите поле Enable This Driver (рисунок 2):

Рисунок 2: Можно запрещать или разрешать включение драйвера

Обратите внимание, что вышеуказанный драйвер был предназначен для 32- и 64-битной версии Windows. Если вы обнаружили, что он не работает под 64-bit Windows, вы можете оставить драйвер включенным, но убрать флажок с x64, что не позволит включить его во время установки 64-bit Windows.

При желании вы даже можете отключать все драйверы в папке путем отключения папки (рисунок 3):

Рисунок 3: Можно отключать пользовательскую папку в установочном ресурсе

Управление загрузочными драйверами с помощью профилей выбора

Также можно использовать профили выбора для управления драйверами во время стадии загрузки Windows PE в установке LTI. Для этого откройте свойства вашего установочного ресурса и выберите закладку Windows PE x64 Components или Windows PE x86 Components для управления драйверами архитектуры той ОС, которую вы устанавливаете (рисунок 4):

По умолчанию выбран All Drivers And Packages профиль выбора, но только сетевые драйверы и драйверы устройств хранения из этого профиля выбора включены в образ загрузки Windows PE. При необходимости можно создавать собственный профиль выбора, который будет включать специфичные для аппаратных средств WinPE драйверы для ваших целевых систем.

Использование нескольких групп драйверов для установки по марке и модели

В предыдущей части мы посмотрели, как определять одну группу драйверов под названием DriverGroup001 и использовать ее для управления драйверами во время установки на основе марки и модели целевых компьютеров. Кит Гарнер (Keith Garner), специалист по развертыванию систем в Xtreme Consulting Group, выложил отличный пост , который дает дополнительную информацию по этой теме, и показывает вам, как можно организовать драйверы более эффективно, а затем использовать несколько групп драйверов для управления тем, как они включаются во время установки.

Еще одним полезным постом является этот пост об использовании псевдонимов моделей , написанный Майклом Мерголо, старшим консультантом в Microsoft Consulting Services.

Добавление драйверов в образ

Можно использовать DISM.exe команду для добавления драйверов в автономные образы, просто смонтируйте образ и используйте команду DISM с /add-driver опцией (смотрите для дополнительной информации об использовании DISM.exe).

Для добавления драйверов в хранилище драйверов (то есть, предварительное представление драйверов, чтобы они были доступны, когда Windows определяет устройства, нуждающиеся в драйверах), можно использовать PnPutil.exe команду. Эта команда может быть полезной, если вы, например, использовали Microsoft Update Catalog для загрузки.cab файла драйверов для принтера и хотите предварительно представить эти драйверы на своем эталонном компьютере, чтобы во время установки эти драйверы были доступны. Дополнительную информацию об этой команде можно найти и .

Обслуживание конфигурации драйверов во время создания образа Windows

Наконец, если вы создаете эталонный образ и устанавливаете его на идентичные аппаратные средства, вы можете обеспечить более быстрый способ первой загрузки для пользователей путем настройки PersistAllDeviceInstalls параметров в своем файле ответа для sysprepping подготовки своего эталонного компьютера. Подробности смотрите

Устройства и драйверы для них делятся на две категории: с поддержкой PnP и без. Для большинства PnP-устройств драйвер есть на CD с Windows Server 2003. При установке нового устройства система автоматически находит для него драйвер и выделяет для него ресурсы (запросы на прерывание IRQ и каналы прямого доступа к памяти DNA). В случае если системе не удается найти подходящий драйве, она запросит его у пользователя, а устройство в консоли Диспетчер задач будет помечено восклицательным знаком в желтом треугольнике. Если системе вообще не удается определить тип устройства, тогда запрос на драйвер не выдается, а устройство помечается знаком вопроса в желтом треугольнике как неизвестное.

Для обновления конфигурации устройств служит оснастка Диспетчер устройств. Ее можно использовать в двух видах: с деревом устройств, с деревом ресурсов для устройств (настраивать ресурсы вручную не рекомендуется). Оснастку Диспетчер устройств для редактирования конфигурации можно использовать только на локальном компьютере, на удаленном компьютере она работает в режиме только для чтения. Для получения подробной сводки об устройствах и драйверах, можно использовать утилиту командной строки DriverQuery.

Администраторы компьютера могут устанавливать любые устройства и драйверы. Обычные пользователи могут устанавливать драйвера в следующих случаях: драйвер имеет цифровую подпись, файлы драйвера уже есть на компьютере и для дальнейшей установки не требуется дополнительного вмешательства пользователя, причем необходимо соблюдение всех трех условий одновременно (эти условия, как правило, справедливы для принтеров, USB-устройств и для шины IEE1394).

Начиная с Windows 2000 драйвера для устройств имеют цифровую подпись, которая показывает, что файл не был изменен в процессе использования. Некоторые драйвера могут не иметь цифровой подписи. В случае если драйвер не подписан, можно настроить три варианта действия системы: Пропускать (устанавливать драйвер, даже если нет подписи. Доступен только для администратора), Предупреждать (спрашивать у пользователя устанавливать ли драйвер), Блокировать (не устанавливает драйвера без цифровой подписи).

В оснастке Диспетчер устройств можно обновлять драйвера для выбранного устройства (например, если производитель выпустил новую версию). В случае если после установки нового драйвера в работе устройства возникли проблемы, то можно вернуться к предыдущей версии драйвера, нажав на кнопку Откатить. Также драйвера для устройств можно удалять (если это PnP-устройство, удаление драйвера повлечет удаление самого устройства, если драйвер устройства был добавлен вручную, оно останется в системе, но без сконфигурованного драйвера. В случае если у устройства есть дополнительные свойства, с помощью которых можно осуществлять его настройку, доступ к ним будет осуществляться с такими же правами, что и к Диспетчеру задач. Ограничить доступ к таким настройкам также можно с помощью групповой политики.

При возникновении неполадок в работе устройств можно использовать следующие средства: возврат предыдущей версии драйвера (если система загружается), загрузка последней удачной конфигурации (сработает в случае если неполадка случилась до последнего удачного входа в систему), безопасный режим (загружается минимальный набор драйверов и подсистем (после загрузки можно отключить в Диспетчере устройств), консоль восстановления (применяется в случае если все вышеперечисленное не дает эффекта, позволяет управлять устройствами и драйверами из командной строки, но необходимо знать имя устройства или файл драйвера). При возникновении ошибок устройств в Диспетчере устройств отображаются коды состояний, позволяющие определить тип ошибки. Описание кодов можно найти в справочной системе Windows.

Тем, кому интересно внутреннее устойство операционной системы , предлагаю небольшое исследование. Мы попробуем выяснить, что отвечает за порядок загрузки драйверов и сервисов в и можно ли этот порядок изменить.

Прежде всего посмотрим текущий порядок запуска системы с помощью программы LoadOrder от Sysinternals. Программа покажет нам, что и в каком порядке загружается при запуске операционной системы.

Как видно из рисунка, сначала загружаются драйверы устройств, необходимые для запуска системы, а потом различные -сервисы. Поскольку между загрузкой сервисов и загрузкой драйверов есть некоторые различия, рассматривать их будем по отдельности.

Драйверы

В качестве подопытного возьмем драйвер Microsoft ACPI (Advanced Configuration and Power Interface), который отвечает за обнаружение аппаратного обеспечения и управление питанием. Задача ACPI - обеспечить взаимодействие между операционной системой и аппаратным обеспечением, поэтому драйвер ACPI загружается в самом начале.

Программа Loadorder предоставляет довольно ограниченную информацию о порядке загрузки, поэтому за более точными данными идем в реестр. У каждого драйвера и Windows-сервиса есть свой раздел в ветви реестра HKLM\SYSTEM\CurrentControlSet\Services. Названы разделы по имени драйвера\сервиса, соответственно нам нужен раздел ACPI.

За порядок загрузки драйвера отвечают три параметра реестра. Основной параметр Start - определяет тип запуска драйвера. Вот правила, по которым драйверы устанавливают значение своего параметра Start:

Драйверы, которые должны загружаться системным загрузчиком при запуске операционной системы, указывают значение Start равное 0 (запуск при загрузке системы). Пример - драйверы системных шин и драйвер файловой системы, используемый при загрузке системы;
Драйвер, который не требуется непосредственно для загрузки системы, указывает в Start значение, равное 1 (запуск системой). Пример - стандартный драйвер видеокарты (VgaSave);
Драйвер, не обязательный для загрузки системы, устанавливает значение Start равным 2 (автозапуск). Пример - драйвер многосетевого UNC-npoвайдера (Multiple UNC Provider, MUP), поддерживающий UNC-имена удаленных ресурсов (типа \\Computer\Share);
Драйверы, не обязательные для работы операционной системы (например, драйверы сетевых адаптеров), указывают значение Start равным 3 (запуск по требованию).

Также драйверы устройств могут использовать параметры Group и Tag для контроля порядка своей загрузки при запуске системы. Параметр Group драйверы\сервисы используют, чтобы указать группу, к которой они принадлежат, а порядок загрузки групп определяется параметром List, находящимся в разделе HKLM\SYSTEM\ CurrentControlSet\Control\ServiceGroupOrder\.

Кстати, параметр Group указывать не обязательно. Если драйвер\сервис не входит в какую либо группу, то он загружается в самом конце очереди.

Драйвер может еще больше детализировать порядок своей загрузки с помощью параметра Tag , который указывает конкретную позицию драйвера в группе. Диспетчер ввода-вывода сортирует драйверы в группе по значениям этого параметра, а драйверы, не имеющие параметра Tag, перемещаются в конец списка драйверов группы.

Посмотрев на порядок загрузки, можно подумать что сначала загружаются драйверы с меньшими значениями Tag, потом - с большими, но это не совсем так. Приоритет значений параметров Tag в рамках группы определяется в разделе HKLM\SYSTEM\CurrentControlSet\Control\GroupOrderList.

Для примера откроем двоичный параметр Boot Bus Extender, который соответствует одноименной группе, к которой относится и драйвер ACPI. Параметр представляет из себя набор двойных слов (по 4 байта каждое). Первое слово (выделено красным) задает общую длину переменной (количество двойных слов), в нашем примере 06. Остальные двойные слова как раз и являются тэгами. Драйверу ACPI соответствует тэг, равный 01 (выделен зеленым).

Приоритетность тега определяется не значением тега, а его положением : чем выше расположен тэг, тем выше его приоритет в группе, и тем выше приоритет драйвера, которому этот тэг соответствует. А поскольку 01 выше остальных тегов, то и драйвер ACPI загружается первым в группе.

Сервисы

Порядок загрузки Windows-сервисов несколько отличается от порядка загрузки драйверов. В качестве примера возьмем сервис aвтоматического обновления (wuauserv). Он не особо критичен для работы системы и поэтому грузится в последнюю очередь.

Опять идем в реестр. Параметры запуска сервиса находятся в разделе HKLM\SYSTEM\CurrentControlSet\Services\wuauserv. Я выделил два основных параметра, отвечающих за порядок загрузки данного сервиса.

Windows-сервисы запускаются диспетчером управления сервисами (Service Control Manager, SCM) в соответствии со значением параметра Start . Параметр этот для сервисов может принимать следующие значения:

Авто запуск (2) - сервис запускается автоматически, сразу после запуска основного SCM-процесса Services.exe;
Запуск по требованию (3) - сервис запускается при необходимости, по требованию какого либо сервиса или программы;
Отключено (4) - сервис отключен и не запускается ни при каких условиях.

Значения 0 (запуск при загрузке системы) и 1 (запуск системой) для сервисов не могут быть указаны, только для драйверов устройств.

Кроме того, начиная с Windows Vista\Server 2008 для сервисов появился еще один режим запуска - отложенный автозапуск. Отвечает за него параметр DelayedAutoStart = 1, который который указывает SCM произвести автоматический старт данного сервиса с задержкой.SCM запускает службы, для которых выбран отложенный запуск, после загрузки сервисов, отмеченных для автозапуска.

Режимом запуска сервисов можно управлять не только из реестра, но и в графическом режиме, из консоли Службы (Services).

Так же как и драйверы, Windows-сервисы могут использовать параметр Group в своем разделе реестра, чтобы указать группу, к которой они принадлежат. Сейчас, для наглядности, возьмем наш сервис wuauserv, находящийся в самом конце списка загрузки. С помощью ключа Group поместим его в группу Event Log, перезагрузимся и посмотрим порядок загрузки в Loadorder. Как видите, порядок изменился и wuauserv поднялся с последнего места, загрузившись сразу после своего одногруппника - службы eventlog. Правда порядок размещения внутри группы изменить уже не получится, т.к. Tag для сервисов не используется.

И еще один параметр, который косвенно влияет на порядок загрузки сервисов - DependOnService . Он указывает, от каких сервисов зависит данный сервис. Соответственно сервис не загружается, пока не будут загружены сервисы, перечисленные в DependOnService.

Зависимости работают следующим образом - если сервисы находятся в одной группе, то зависимый сервис перемещается в конец списка и запускается после сервисов, от которых зависит. Если же группы разные, то сервис просто не запустится, а SCM выдаст ошибку.

Более наглядно это показано в оснастке Службы, где на вкладке Зависимости (Dependency) указаны как сервисы, от которых зависит данный сервис, так и сервисы, зависящие от него.

Поскольку Windows– многозадачная система, она исключает для прикладных программ такие вольности, как прямое обращение к портам ввода/вывода или обработка аппаратных прерываний. Взаимодействие с аппаратурой на низком уровне может выполняться только системными программами, работающими в привилегированном режиме. Основную роль здесь играют драйверы устройств.

В Windowsиспользуется многоуровневая структура драйверов, в которой высокоуровневые драйверы могут играть роль фильтров, выполняющих специальную обработку данных, полученных от драйвера низкого уровня или передаваемых такому драйверу. В качестве примера можно привести отделение драйвера, управляющего шиной, от драйверов конкретных устройств, подключенных к шине. Еще один пример – драйвер, выполняющий шифрацию/дешифрацию данных при работе с файловой системойNTFS. Структура драйверов всех уровней подчинена единым стандартам, известным какWDM(WindowsDiverModel), однако высокоуровневые драйверы, в отличие от низкоуровневых, не занимаются обработкой аппаратных прерываний.

Как ни странно, в WindowsNTнизкоуровневые драйверы – это еще не самый нижний уровень управления устройствами. Еще ближе к аппаратуре лежит так называемый уровеньHAL(HardwareAbstractionsLevel, уровень аппаратных абстракций). Его роль – скрыть от остальных модулей ОС, в том числе и от драйверов, некоторые детали работы с аппаратурой, зависящие от конкретных шин, типа материнской платы, способа подключения. Например, HALпредоставляет драйверам возможность обращаться к регистрам устройств по их логическим номерам, не зная при этом, подключен ли регистр к порту процессора или отображен на память.

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

    Драйверы GDI(GraphicDeviceInterface) представляют собой высокоуровневые драйверы графических устройств (мониторов, принтеров, плоттеров). Эти драйверы выполняют трансляцию графических вызововWindows(таких, как «провести линию», «залить область», «выдать текст», «выбрать текущий шрифт, текущее перо, текущую заливку») в команды, выполняющие соответствующие действия на конкретном устройстве. Выдача этих команд на устройство выполняется уже другим, низкоуровневым драйвером. Благодаря наличию драйверовGDIодна и та же программа может выдавать графическое изображение на разные устройства. Яркий пример этого – имеющийся в различных редакторах режим предварительного просмотра, который отображает страницы на экране точно в том виде, как они будут напечатаны.

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

    Драйверы виртуализации устройств (VxD-драйверы) служат для того, чтобы разделять устройства между процессами, создавая иллюзию, что процесс монопольно владеет устройством. На самом деле драйвер организует очередь заявок от процессов, переключает устройство в нужный для очередного процесса режим и т.п. Примером может служить драйвер виртуализации монитора. Консольное приложение (например, программаMS-DOS) работает со всем экраном в текстовом режиме. Но если такое приложение запущено в окнеWindows, тоVxD-драйвер имитирует текстовый режим в графике. Для этого драйвер должен перехватывать попытки программы обратиться напрямую к адресам видеопамяти и преобразовывать координаты знакомест текстового режима в координаты соответствующих позиций в окне.