Продолжим наш анализ работы с драйверами, начатый в статье «Человеческое лицо драйвера», опубликованной в Windows IT Pro/RE № 5 за 2007 г., и попробуем разобраться, каким же образом можно управлять драйверами и какими именно программами и методами следует пользоваться.

Перечисление драйверов

Прежде всего необходимо узнать, какие драйверы установлены в системе, какие загружены в данный момент и какие могут быть загружены. Первый и самый простой способ узнать это — утилита msinfo32. Окно со списком драйверов, выводимое этой утилитой, показано на экране 1.

Экран 1. Утилита msinfo32

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

Как ни странно, оказывается, у многих известных утилит есть функциональность, о которой никто не знает. Например, всем известный диспетчер устройств. Ни для кого не секрет, что с его помощью можно узнать, какой драйвер за какое устройство отвечает. Но кроме того, можно посмотреть список драйверов, не соответствующих требованиям PnP. Для этого в меню «Вид» следует выбрать пункт «Показать скрытые устройства», и в дереве появится соответствующий раздел (см. экран 2).

 Экран 2. Менеджер устройства, не соответствующего требованиям PnP

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

Следующий механизм, который помогает нам в решении поставленной задачи, — утилита командной строки sc.exe. Эта утилита по-другому называется консолью управления службами service control manager (SCM), которая управляет и драйверами. В нашем случае с ее помощью можно получить список драйверов как локальной системы, так и удаленных систем. При наличии соответствующих прав, конечно. Простой вызов sc query type=driver позволит вам быстро получить искомое. Эта утилита очень удобна и проста в применении и, кроме того, позволяет проводить опрос не только локально, но и по корпоративной сети. Стоит отметить, что в Windows NT 4.0 для управления драйверами у SCM был графический интерфейс, а в последующих версиях его не стало.

Мир WMI

Теперь коснемся обширной темы под названием WMI. Прежде всего, для того чтобы попробовать WMI в действии, вам потребуется набор инструментов для работы с WMI, который можно найти на сайте Microsoft. Если говорить просто, то WMI — это набор классов объектов, позволяющих управлять операционной системой, а также диагностировать ее (см. экран 3). В рамках данной статьи мы коснемся только двух из них — это Win32_SystemDriver и Win32_PrinterDriver. Последний нужен нам по той причине, что драйверы принтеров — это тоже драйверы, и их перечисление входит в поставленные в начале статьи задачи, но они являются драйверами пользовательского режима, а класс Win32_SystemDriver перечисляет только драйверы режима ядра.

Экран 3. Использование WMI

Класс Win32_SystemDriver позволяет увидеть все установленные драйверы, их текущее состояние, настройки запуска и многое другое, а также останавливать, запускать, управлять ими, если они поддерживают подобные действия. Для того чтобы посмотреть все драйверы и связанную с ними информацию, достаточно выполнить простой WQL-запрос:

select * from Win32_SystemDriver.

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

Указанные классы можно применять, используя механизмы исполнения сценариев сscript/wscript. Однако в Windows XP и Windows Server 2003 появилась утилита wmic, которая позволяет упростить этот процесс. Так, для просмотра списка драйверов на локальной системе достаточно ввести в командной строке команду

wmic sysdriver

Вы увидите аналогичный результат. Кроме того, результаты вывода также можно отфильтровать, например

wmic sysdriver get name, description

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

wmic /NODE:machine sysdriver

get name, description

С принтерами ситуация, к сожалению, несколько иная. Используя пространство имен wmic, можно лишь получить список принтеров и имя драйвера, поскольку псевдоним printer отображен в классе win32_printer. Но и тут есть решение. Утилита позволяет создать новый псевдоним и настроить его для использования какого-либо класса и WQL-запроса. В нашем случае я создал псевдоним printerDrivers следующим образом:

wmic alias create

friendlyname=printerDrivers,

target=»select * from

win32_PrinterDriver»

Этот псевдоним знает все, что необходимо, о драйверах принтеров, установленных в системе.

И мир PowerShell

Следующий механизм, который стоит упомянуть, — PowerShell. Он появился сравнительно недавно. Этот механизм будет реализован в будущей серверной операционной системе Windows Server 2008, а дистрибутивы для существующих систем можно найти на сайте Microsoft. PowerShell — это в некотором смысле расширенная версия wmic. Хотя, конечно, это сравнение несколько грубовато, поскольку данный инструмент имеет намного больше возможностей. Из него прямо из сценария или командной строки можно обращаться к классам WMI, COM-объектам и классам .NET. В принципе для управления клиентскими системами устанавливать оболочку на них необходимости нет. Достаточно установить ее на системе администратора. В нашем случае пример получения списка драйверов с использованием технологии PowerShell показан в листинге 1. Этот метод сходен с использованием командной оболочки wmic, поскольку также применяет WMI для получения данных.

Листинг 1. Запрос списка драйверов уровня ядра из PowerShell

Autoruns

Пришло время рассказать об очень полезных утилитах от Марка Русиновича, известного специалиста по операционной системе Windows. Одна из его утилит — Autoruns. Эта утилита, имеющая как графический интерфейс, так и вариант для командной строки, предоставляет информацию не только о драйверах, но и обо всех автоматически запускаемых модулях. В рамках данной статьи мы коснемся лишь раздела драйверов. Здесь можно увидеть список драйверов, имеющихся в реестре, а также посмотреть соответствующие разделы реестра и параметры драйверов. Кроме того, имеется специальный режим, который позволит выбрать драйверы Microsoft и подписанные драйверы (см. экран 4). Эти драйверы, возможно, стоит заменить или хотя бы проверить при помощи утилиты Driver Verifier.

Экран 4. Параметры Autoruns

LoadOrder

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

Драйверы можно запускать и останавливать, если они поддерживают соответствующие возможности. Делать это можно несколькими способами. Самый простой из них — использование SCM:

  1. Команды net stop и net start. Например, net stop beep & net start beep
  2. Утилита sc: sc stop beep & sc start beep

Более сложный метод — WMI. Для того чтобы им воспользоваться, нужно написать больший объем кода. Например, используя утилиту wmic, можно приведенные выше операции выполнять так:

wmic sysdriver where name=’beep’call PauseService

Если использовать PowerShell, это будет немного сложнее, поскольку придется напрямую работать с классами WMI. Однако общий принцип достаточно прозрачен. Пример использования на практике можно увидеть в листинге 2.

Листинг 2. Запуск/остановка драйвера с использованием PowerShell

Драйверы-фильтры

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

Оказывается — да, возможны. И бывает, что приходится переустанавливать систему, чтобы побороть нежелательные эффекты после установки того или иного программного обеспечения.

Все это может происходить из-за так называемых драйверов-фильтров. Только не подумайте сразу, что драйверы-фильтры — это плохо. Нет, ни в коем случае. Это очень полезный механизм, однако им, как и любым другим инструментом, необходимо правильно пользоваться. Бывает так, что драйвер по той или иной причине начинает сбоить, и тогда возникает необходимость найти его и попробовать отключить, дабы он не мешал нормальной работе системы.

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

Основываясь на данных, описанных в статье «Человеческое лицо драйвера», можно получить информацию о том, какие цепочки существуют и какие драйверы в них присутствуют. Алгоритм поиска достаточно прост.

  • Определить активные устройства системы.
  • Найти для них функциональные драйверы. Они описаны в подразделах найденных устройств в разделе HKLMSYSTEMCURRENTCONTROLSETENUM реестра, в параметре Driver, который в свою очередь является ссылкой на раздел HKLMSYSTEMCURRENTCONTROLSETSERVICES.
  • Найти фильтры функционального драйвера. Они описаны тут же, в параметрах UpperFilters и LowerFilters.
  • По параметру ClassGIUD, находящемуся тут же, следует найти GUID класса устройства. Его параметры находятся по этой ссылке в разделе HKLMSYSTEMCURRENTCONTROLSETCONTROLCLASS.
  • В этом ключе найти UpperFilters и LowerFilters, описывающие драйверы-фильтры класса.

Используя WMI и Excel, я написал программу, при помощи которой можно изучить положение вещей с драйверами и цепочками драйверов в конкретной системе. В случае возникновения непонятных проблем стоит в первую очередь посмотреть на эти списки и проверить, а все ли драйверы и их цепочки действительно похожи на те, что вы ожидаете, и при необходимости отключить некоторые из них. Дополнительная информация и пояснения об используемых в статье инструментах приведены во врезках «Литература» и «Краткая справка об инструментах».

Андрей Вернигора (eosfor@gmail.com ) — администратор баз данных и системный администратор на одном из предприятий компании «Укртранснафта». Имеет сертификат MCP


Краткая справка об инструментах

WMI

Во всех последних операционных системах в полной мере поддерживается механизм WMI (Windows Management Instrumentation), позволяющий как управлять удаленными системами, так и просматривать параметры их настройки. Все эти действия можно производить из командной строки, используя скрипты на vbscript или javascript. Также существует компонент WMI Tools, который позволяет изучать пространство имен при помощи визуальных средств.

WQL

Язык запросов к объектам WMI, являющийся подмножеством языка SQL.

PowerShell

Windows PowerShell — это новая командная оболочка Windows, разработанная в первую очередь для системных администраторов. Она включает интерактивную командную строку и среду исполнения сценариев, которые можно использовать вместе или по отдельности.

SCM (service control manager)

Компонент операционной системы, управляющий функционированием сервисов и драйверов.

Driver Verifier

Утилита Driver Verifier — это средство для проверки драйверов на корректность поведения в той или иной ситуации. Утилита позволяет выполнять следующие проверки.

  • Выделение ресурсов из пула.
  • Проверка работоспособности при повышенной нагрузке на память.
  • Проверка параметров.
  • Имитация сбоев при распределении пула.
  • Освобождение пула.
  • Обнаружение утечек пула.
  • Проверка выгрузки драйвера.

Более подробно об использовании утилиты рассказано на сайте Microsoft по адресу: http://support.microsoft.com/kb/244617.

Классы Win32_SystemDriver и Win32_PrinterDriver

Класс Win32_SystemDriver имеет следующую структуру

class Win32_SystemDriver : Win32_BaseService

{

boolean AcceptPause;

boolean AcceptStop;

string Caption;

string CreationClassName;

string Description;

boolean DesktopInteract;

string DisplayName;

string ErrorControl;

uint32 ExitCode;

datetime InstallDate;

string Name;

string PathName;

uint32 ServiceSpecificExitCode;

string ServiceType;

boolean Started;

string StartMode;

string StartName;

string State;

string Status;

string SystemCreationClassName;

string SystemName;

uint32 TagId;};

 

Класс Win32_PrinterDriver имеет следующую структуру

class Win32_PrinterDriver : CIM_Service

{

string Caption;

string ConfigFile;

string CreationClassName;

string DataFile;

string DefaultDataType;

string DependentFiles[];

string Description;

string DriverPath;

string FilePath;

string HelpFile;

string InfName;

datetime InstallDate;

string MonitorName;

string Name;

string OEMUrl;

boolean Started;

string StartMode;

string Status;

string SupportedPlatform;

string SystemCreationClassName;

string SystemName;

uint16 Version;

};