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

       

Инсталляция с использованием 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-файл) можно приступать к установке драйвера при помощи Мастера Установки нового оборудования (Пуск — Настройка — ...). При его работе важно выполнить следующие действия:

  • Следует самостоятельно выбрать устанавливаемое устройство (а не пользоваться услугами автоматического обнаружения).


  • В Windows 98 следует указать тип устройства "? Другие устройства".


  • Выбрать установку драйвера с диска, после чего следует указать диск '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, весьма важные для разработчика драйверов.
    <


    br>

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

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