[Previous] [Next]

Инсталляция и запуск драйвера Example.sys

Существует несколько способов инсталляции и запуска данного драйвера. Следует отметить, что в других случаях выбор может быть не столь разнообразен, в частности, WDM драйверы рекомендуется инсталлировать при помощи Мастера Установки нового оборудования и inf файла.

Инсталляция внесением записей в Системный Реестр

Метод инсталляции путем внесения записей в Системный Реестр (Registry) не требует никаких вспомогательных программных средств — только редактор Системного Реестра. Редактирование Системного Реестра, предлагаемое ниже, не является критичным для работоспособности операционной системы.

Модификация Системного Реестра Windows 98

Как ни удивительно это будет узнать, но данный драйвер (собранный как версия checked для Windows 2000) устанавливается, запускается и работает под Windows 98 SE. Для запуска драйвера следует переписать его бинарный файл Example.sys в директорию C:\Windows\System32\Drivers и создать файл (назовем его Example98.reg) со следующими записями:

REGEDIT4
[HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Example]
"ErrorControl"=dword:00000001
"Type"=dword:00000001
"Start"=dword:00000002
"ImagePath"="\\SystemRoot\\System32\\Drivers\\Example.sys"

После этого следует войти в редактор Системного Реестра (Пуск — Выполнить — regedit) и произвести импорт созданного файла. Импорт данного файла в Реестр Windows 98 можно выполнить, если дважды кликнуть мышкой на этом файле в стандартной программе Проводник (после этого последует предложение импортировать файл в реестр Windows 98, на которое следует ответить утвердительно).

В результате импорта в Системном Реестре будет создан новый подраздел \Example в ветви HKLM\System\CurrentControlSet\Services. В этот подраздел будут занесены параметры ErrorControl, ImagePath, Start и Туре, значение которых обсуждается ниже.

Параметр Туре определяет драйвер режима ядра (значение 1).

Параметр ImagePath определяет местонахождение файла загружаемого модуля (в нашем случае — C:\Windows\System32\Drivers\Example.sys).

Параметр Start определяет момент загрузки сервиса — автостарт после загрузки системы (значение 2).

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

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

Модификация Системного Реестра Windows 2000, XP, Server2003

Файлы импорта в Системный Реестр Windows NT должны быть в формате UNICODE, поэтому их невозможно создать простым текстовым редактором (например, Notepad), как это можно было сделать в случае Windows 98.

Для модификации Системного Реестра Windows 2000, XP, Server 2003 необходимо выполнить модификацию Системного Реестра вручную непосредственно в Реестре. Для этого необходимо войти в редактор Системного Реестра (Пуск — Выполнить — regedit32 для Windows 2000 и Пуск — Выполнить — regedit для Windows XP, Server 2003) и найти там подраздел HKLM\System\CurrentControlSet\Services. В этом подразделе следует создать вложенный подраздел \Example и внести в него следующие параметры и их значения:

После того как указанные данные будут внесены в Системный Реестр, можно выполнить экспорт подраздела HKLM\System\CurrentControlSet\Services\Example во внешний файл (например, ExampleNT.reg) и в следующий раз (например, на другом компьютере) выполнять импорт этого файла в Системный Реестр вместо набора вручную.

Смысл вносимых параметров тот же, что и в случае Windows 98.

Запуск драйвера

После того как выполнена описанная модификация Системного Реестра и файл Example.sys был размещен в директории C:\Windows\System32\Drivers\, необходимо выполнить перезагрузку операционной системы (как в случае Windows 98, так и в случае Windows 2000, XP, Server 2003) для того, чтобы драйвер был загружен и начал работу.

Инсталляция с использованием INF файла

Для такого способа инсталляции драйвера потребуется создать текстовый файл (назовем его Example.inf), в котором будет представлена информация для работы Мастера Установки нового оборудования. В данном файле имеет значение даже то, куда поставлена запятая. Поэтому его следует повторить в точности. (Более подробно составление inf-файлов обсуждается в документации DDK, файл справки install.chm, и в главе 12.)

; Example.Inf - install information file
;  Created 2 feb 2003 by SVP
[Version]
Signature="$Chicago$"
Class=Unknown
Provider=%SVPBook%
DriverVer=02/22/2003,1.0.0.2

[Manufacturer]
%SVPBook%=SVP.Science

[SVP.Science]
%Example%=Example.Install, *svpBook\Example

[DestinationDirs]
Example.Files.Driver=10,System32\Drivers  ; куда копировать для Win98
Example.Files.Driver.NTx86=10,System32\Drivers ; куда копировать для NT

[SourceDisksNames]
1="Example build directory",,,       ;  первая цифра -- единица

[SourceDisksFiles]
Example.sys=1,drv\w98   ; где находится новый драйвер для Win98

[SourceDisksFiles.x86]
Example.sys=1,drv\nt   ; где находится новый драйвер для NT
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Windows 98
[Example.Install]
CopyFiles=Example.Files.Driver
AddReg=Example.AddReg

[Example.AddReg]
HKR,,DevLoader,,*ntkern
HKR,,NTMPDriver,,Example.sys
[Example.Files.Driver]
Example.sys
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Windows 2000, XP, Server 2003
[Example.Install.NTx86]
CopyFiles=Example.Files.Driver.NTx86

[Example.Files.Driver.NTx86]
Example.sys,,,%COPYFLG_NOSKIP%

[Example.Install.NTx86.Services]
AddService = Example, %SPSVCINST_ASSOCSERVICE%, Example.Service

[Example.Service]
DisplayName    = %Example.ServiceName%
ServiceType    = %SERVICE_KERNEL_DRIVER%
StartType      = %SERVICE_AUTO_START%
ErrorControl   = %SERVICE_ERROR_NORMAL%
ServiceBinary  = %10%\System32\Drivers\Example.sys
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Strings
[Strings]
SVPBook="Introduction to Driver Programming"
Example="Example driver: checked build"
Example.ServiceName="Example NTDDK driver (V.001)"

SPSVCINST_ASSOCSERVICE=0x00000002
COPYFLG_NOSKIP=2	; Do not allow user to skip file
SERVICE_KERNEL_DRIVER=1
SERVICE_AUTO_START=2
SERVICE_DEMAND_START=3 ;  см. п. 11.1.10
SERVICE_ERROR_NORMAL=1

Для проведения инсталляции рекомендуется воспользоваться дискетой. По крайней мере, не следует проводить инсталляцию из директорий на жестком диске, имеющих в названии пробелы и символы кириллицы, например, "С:\Пример драйвера\".

В корневой каталог дискеты следует поместить данный файл, Example.inf, a также создать директорию a:\drv со вложенными поддиректориями a:\drv\w98 и a:\drv\nt, куда следует поместить по одной копии файла драйвера Example.sys. (В том случае, если решено устанавливать драйвер из директории на жестком диске, то указанная структура информации должна быть также соблюдена).

Теперь (когда уже создан inf-файл) можно приступать к установке драйвера при помощи Мастера Установки нового оборудования (Пуск — Настройка — ...). При его работе важно выполнить следующие действия:

  1. Следует самостоятельно выбрать устанавливаемое устройство (а не пользоваться услугами автоматического обнаружения).
  2. В Windows 98 следует указать тип устройства "? Другие устройства".
  3. Выбрать установку драйвера с диска, после чего следует указать диск 'a:' (либо директорию на жестком диске, где находится Example.inf, поддиректории \drv\nt и \drv\w98 и две копии Example.sys, как было указано выше).

После идентификации inf файла Мастер Установки нового оборудования самостоятельно скопирует файл Example.sys из соответствующей директории drv\w98 или drv\nt (в нашем случае эти файлы идентичны) в \System32\Drivers внутри системной директории. Мастер Установки произведет модификацию записей в Системном Реестре, в результате чего драйвер будет загружаться после загрузки системы (когда она произойдет в следующий раз).

Для запуска данного драйвера сразу после установки Мастером Установки не требуется перезагрузки системы. (Но для других драйверов под Windows 98 это может потребоваться.)

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

Результаты работы Мастера Установки с записями Системного Реестра следует искать в разделе HKLM\System\CurrentControlSet\Services\Class\Unknown (для Win98) и в разделе HKLM\System\CurrentControlSet\Services\Unknown\Example (для Windows 2000/XP/Server 2003).

Следует отметить, что информацию о драйвере Example.sys после установки можно увидеть в Настройках Системы (Система/Диспетчер Устройств в Windows NT, либо Система/Устройства в Windows 98), однако многие информационные поля там не будут определены (в случае Windows NT таких полей будет меньше). Это объясняется тем, что информация, для которой указано "неизвестна" должна поступать из файла драйвера, для чего в нем должны быть предусмотрены информационные ресурсы, обычно размещающиеся в .rc файле проекта. В данном проекте такого файла нет, поэтому не вся желаемая информация предоставляется системным службам.

Возникает вопрос, почему драйвер, предназначенный для NT, запускается и работает под Windows 98?! Ответ прост. В Windows 98 установлен модуль ntkern.vxd, который так выполняет свою работу, что драйверам NT кажется, что они имеют дело с NT-системой, К сожалению, возможности его не безграничны, иначе Windows 98 была бы Windows NT.

Другой вопрос, который может возникнуть после описанной процедуры: почему мы смогли установить драйвер, в сущности, "никакого" устройства?! Ответ также несложен. Поскольку к системе могут подключаться устройства, не поддерживающие PnP (legacy devices), которые не могут быть автоматически обнаружены и которые не могут быть подключены (загружены их драйверы) иначе, чем по указанию администратора системы, то фирма Microsoft обязана предоставить способ установки драйверов "по желанию". Что и произошло в нашем случае.

При установке драйвера под операционной системой Windows2000/XP/Server 2003 может появиться сообщение следующего вида (рисунок 3.1).

Данное сообщение, выдаваемое операционной системой, связано с тем, что фирма Microsoft для повышения ответственности разработчиков за качество своих драйверов ввела программу тестирования и подписания вновь присоединяемых к дистрибутиву Windows драйверов. Для получения цифровой подписи драйвер должен пройти тестирование в специальной лаборатории Microsoft (соответственно, она действует только на конкретный бинарный .sys файл, при перекомпиляции цифровую подпись следует получать заново). Разумеется, "потренировать" свой драйвер перед такой процедурой вполне можно — для этого Microsoft поставляет соответствующие программные средства. В данном случае для инсталляции драйвера Example.sys следует выбрать кнопку "Все равно продолжить".

Рис. 3.1
Предупреждение о том, что драйвер не подписан

По завершении инсталляции в окне Диспетчера Устройств (свойства устройства) можно увидеть сообщения об установленном драйвере, в частности, в форме, представленной на рисунке 3.2 (в графе "Цифровая подпись" для данного драйвера указано, что она отсутствует).

Рис. 3.2
Свойства драйвера в окне Диспетчера Устройств

Следует также удостовериться при помощи перечисленных в главе 2 программ, поступила ли информация и драйвере (и в достаточном ли объеме) в операционную систему. Программа DeviceTree предоставляет информацию, показанную на рисунке 3.3. На нем показаны коды IRP_MJ_Xxx, для которых драйвер зарегистрировал собственные процедуры обработки, а также более общая информация о драйвере, в частности, операционная система сама установила для него флаг LEGACY_DRIVER.

Рис. 3.3
Общие свойства драйвера в окне DeviceTree, поддерживаемые IRP_MJ_Xxx

Более подробно вопросы составления inf файлов для установки драйверов будут рассмотрены в главе 12.

В процессе установки драйвера при помощи Мастера установки система выполняет резервное копирование файлов, отражающих ее состояние перед установкой драйвера. Результаты этой работы сохраняются в директории \System Volume Information\RpNn на одном из логических дисков (Nn — это номер резервной точки). В том случае, если инсталляция драйвера приведет к нестабильной работе системы, можно восстановить ее состояние на момент сохранения данной резервной точки (reserve point) через запуск системной утилиты Пуск — Программы — Стандартные — Служебные — Восстановление Системы. Эта же утилита позволит администратору выполнить принудительное создание резервной копии, если в том имеется необходимость. Более подробно эти вопросы освещены в обстоятельной книге Ольги Кокоревой "Реестр Windows XP", рассматривающей многие аспекты организации Системного Реестра Windows NT, весьма важные для разработчика драйверов.

В большинстве случаев драйвер, установленный с помощью Мастера установки, можно отключить и включить (задействовать) снова, даже не выполняя при этом перезагрузку системы. Если между отключением и включением выполнить подмену бинарного файла драйвера (например, на новую версию), то в результате таких манипуляций в работу вступит новая версия драйвера. Разумеется, чтобы обеспечить такую возможность, драйвер должен иметь корректно написанные процедуры завершения работы и выгрузки. Подмену файла WDM драйвера РпР устройства вполне успешно можно выполнять в то время, когда отключены все PnP устройства, обслуживаемые таким драйвером. Однако выполнение установки новых версий драйвера только с помощью Мастера установки дает следующее небольшое преимущество: средствами системы можно восстанавливать предыдущую версию драйвера (если она существовала). Для этого необходимо в окне — см. рисунок 3.2 — выбрать пункт "Откатить".

Инсталляция с использованием программы Monitor

Как было сказано в главе 2, для запуска драйверов "в-стиле-NT" под управлением Windows NT предназначена программа Monitor, разработанная CompuWare Corporation и входящая в состав пакета Driver Studio (в том числе, в 30-дневную trial версию).

Эта программа прекрасно подходит для загрузки, запуска, остановки и удаления драйвера Example.sys. Интуитивно понятный графический интерфейс этой программы практически не требует дополнительных пояснений. Для запуска драйвера не следует перезагружать систему и самостоятельно модифицировать Системный Реестр, что удобно для проведения быстрых автономных тестов.

Если перед запуском драйвера из программы Monitor предварительно запустить программу DebugView, то все отладочные сообщения, которые были введены даже в функции DriverEntry, будут отображены в рабочем окне DebugView и могут быть сохранены в файле протокола (LOG-файле).

Более подробно режимы ознакомительного тестирования драйвера Example.sys при помощи собственного приложения пользовательского режима будут рассмотрены ниже.

Инсталляция с использованием сервисов SCM Менеджера

В операционной системе Windows NT имеется компонент, называемый Service Control Manager (SCM Менеджер). Удобство предоставляемых им услуг состоит в том, что, используя его функции в приложениях пользовательского режима, можно динамически запускать и выгружать драйверы, требующиеся только данному конкретному приложению, не прибегая к вызову Мастера Установки нового оборудования. Таким образом, приложение само определяет время присутствия драйвера в операционной системе.

Достаточно подробное описание программирования приложений с использованием функций SCM имеется в документации MSDN (практически, единственное место ее соприкосновения с потребностями собственно разработки драйверов), поставляемой отдельно или в составе пакетов Microsoft Visual Studio.

Работа с сервисами SCM менеджера начинается с вызова функции OpenSCManager (это имя можно рассматривать как "точку входа" в документацию MSDN по программированию с применением SCM функций) и завершается вызовом функции CloseServiceHandle.

Пример работы с функциями SCM будет рассмотрен ниже, в примере консольного приложения для тестирования драйвера Example.sys.

Следует отметить, что не все типы драйверов могут быть загружены и запущены средствами SCM функций.