[Previous] [Next]

Мастер Установки/удаления новой аппаратуры

В главе 3 рассматривался вариант инсталляции Example.sys — драйвера "в-стиле-NT" (legacy driver) при помощи Мастера Установки нового оборудования и inf-файла.

Процесс установки драйвера для PnP устройства, которое предъявляет системе идентификационные коды, отличается тем, что Мастер Установки нового оборудования самостоятельно находит драйвер (если для данного типа оборудования драйвер уже устанавливался ранее хотя бы раз) либо предлагает пользователю выбрать более подходящий драйвер, который заявляет соответствующие коды в соответствующей установочной секции inf-файла.

Если установка успешно завершена Мастером Установки, процедуры драйвера DriverEntry и AddDevice должны, кроме того, подтвердить, что аппаратное обеспечение, которым их "пригласили" управлять, удовлетворяет требованиям выбранного драйвера, подтверждая правильность выбора именно этого варианта установки. Другими словами, не исключена ситуация, когда интерактивный выбор может довести установку до конца, но инициализация устройства все же завершится неудачей (потому что собственно программный код драйвера не "согласился" работать с предложенной аппаратурой в предложенных условиях).

Установка PnP устройств

В момент, когда подключается PnP устройство, в результате взаимодействия нескольких подсистем инициируется загрузка нового драйвера.

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

  1. PnP Менеджер режима ядра (см. документацию DDK по указателю на ключевую фразу "Device Installation Components") уведомляет PnP Менеджер пользовательского режима о том, что в системе обнаружено новое устройство со специфическими кодами PnP идентификации (кодами производителя, модели, версии и т.п.). PnP Менеджер пользовательского режима конструирует список возможных драйверов для нового устройства, в частности, проверяется системный файловый каталог inf-файлов на наличие подходящего inf-файла (по полученной от нового устройства информации). Инсталляционные inf-файлы для дополнительно доставляемых драйверов чаще всего попадают туда под новым именем oemXxx.inf, где Xxx — это целое число, начиная с 0.
  2. Если подходящий inf-файл не обнаружен, система откладывает все последующие действия до момента, пока в систему войдет пользователь с достаточным уровнем привилегий. Этому пользователю и предлагается диалог с Мастером Установки Оборудования (Add Hardware Wizard). Пользователь должен указать место (чаще всего, CD), где размещены файлы нового драйвера и его inf-файл.
  3. Как только выявлен приемлемый inf-файл, начинается его обработка при помощи библиотеки вызовов Configuration Manager API (CfgMgr API, см. документацию DDK по указателю на ключевую фразу "Device Installation Components"). Выполняется копирование файлов драйвера и модификация информации Системного Реестра. Эта работу делает, главным образом, PnP Менеджер режима ядра.
  4. На основе директив inf-файла PnP Менеджер режима ядра загружает все фильтр-драйверы нижнего уровня, затем функциональный драйвер и, наконец, верхние фильтр-драйверы, предназначенные для обслуживания нового устройства. Драйверу, который находится на вершине стека, затем направляются соответствующие PnP запросы (IRP пакеты с кодом IRP_MJ_PNP), включая IRP_MN_START_DEVICE.

Идентификаторы PnP устройств

Процесс автоматической установки PnP устройств сильно зависит от способности устанавливающего программного обеспечения локализовать нужный inf-файл и секции в нем, относящиеся к драйверу. Особое значение имеет в данном случае то, как указываются в inf-файле наименования классов и идентификаторы устройств.

Каждое устройство, спроектированное по спецификации PnP, должно иметь идентификатор, который однозначно определяет модель данного устройства. Этот идентификатор должен быть предоставлен шинному аппаратному обеспечению (а следовательно, и шинному драйверу) по поступлении запроса. Разумеется, шинный драйвер подает запрос сразу же, как только новое устройство подключено. Секция [Models] в inf-файле содержит значение hw_id, играющее роль идентификатора модели.

В примере инсталляционного inf-файла для драйвера Example.sys (глава 3) в роли такого идентификатора выступила строка "*svpBook\Example", что было приемлемо для не-PnP устройства. Значение, вводимое в поле hw_id для PnP устройств, должно придерживаться определенного формата, изменяющегося в зависимости от типа шины, к которой устройство подключается, но обычно идентификатор поступает в устанавливающий программный код в виде:

тип_шины\идентификатор_модели 

например:

PGI\VEN_1011&DEV_002&SUBSYS_00000000&REV_02 

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

PnP идентификаторы PCI устройств

Полный идентификатор для PnP PCI устройств имеет форму

PCI\Ven_vvvv&Dev_dddd&SubSys_ssssssss&Rev_rr 

Здесь vvvv является идентификатором поставщика (производителя), зарегистрированным в группе PCI Special Interest Group, dddd — идентификатор, присвоенный производителем данной PCI карте, ssssssss — идентификатор конструкции (subsystem ID), rr — номер версии разработки. Все упомянутые поля вводятся как шестнадцатеричные числа. Поле ssssssss обычно вводится как нулевое.

Кроме того, допустимо в inf-файлах представлять усеченные варианты идентификационной информации, например:

PCI\Ven_vvvv&Dev_dddd&SubSys_ssssssss
PCI\Ven_vvvv&Dev_dddd&Rev_rr
PCI\Ven_vvvv&Dev_dddd
PCI\Ven_vvvv&Dev_dddd&Rev_rr&CC_ccss
PCI\Ven_vvvv&Dev_dddd&CC_ccsspp
PCI\Ven_vvvv&Dev_dddd&CC_ccss
PCI\Ven_vvvv&CC_ccsspp
PCI\Ven_vvvv&CC_ccss
PCI\Ven_vvvv
PCI\CC_ccsspp
PCI\CC_ccss  

Здесь cc является кодом базового класса из конфигурационного пространства PCI устройства, ss — код подкласса, pp — идентификатор программного интерфейса.

PnP идентификаторы SCSI устройств

Полный идентификатор для PnP SCSI устройств имеет форму

SCSI\ttttvvvvvvvvpppppppppppppppprrrr 

Здесь tttt является типо-кодом устройства, vvvvvvvvявляется 8-символьным идентификатором поставщика (производителя), pppppppppppppppp— 16 символьный идентификатор устройства, rrrr — номер версии разработки.

Кроме того, допустимо в inf-файлах представлять усеченные варианты идентификационной информации, например:

SCSI\ttttvvvvvvvvpppppppppppppppp
SСSI\ttttvvvvvvvv
SCSI\vvvvvvvvppppppppppppppppr
vvvvvvvvppppppppppppppppr
gggg 

Здесь gggg является одним из групповых типов (generic type) классов, приведенных в таблице 12.11.

Таблица 12.11. Типы SCSI u IDE устройств

SCSI код Устройство Тип Групповой тип
DIRECT_ACCESS_DEVICE (0)

Дисковое

Disk GenDisk
SEQUENTIAL_ACCESS_DEVICE (1) Последовательное Sequential  
PRINTER_DEVICE (2) Принтер Printer GenPrinter
PROCESSOR_DEVICE (3) Сканнеры, принтеры и т.п. Processor  
WRITE_ONCE_READ_MULTIPLE_DEVICE (4) Worm Worm GenWorm
READ_ONLY_DIRECT_ACCESS_DEVICE (5) CD ROM CdRom GencdRom
SCANNER_DEVICE (6) Сканирующее Scanner GenScanner
OPTICAL_DEVICE (7) Оптические диски Optical GenOptical
MEDIUM_CHANGER (8) Устройство со сменными носителями Changer ScsiChanger либо
GenChanger (для IDE)
COMMUNICATION_DEVICE (9) Сетевое Net ScsiNet

Для SCSI диска, имеющего полный установочный PnP идентификатор SCSI\DiskSEAGATE_ST39102LW____0004, шинный драйвер сконструирует также и следующий список идентификаторов:

SCSI\DiskSEAGATE_ST39102LW____0004
SCSI\DiskSEAGATE_
SCSI\DiskSEAGATE_ST39102LW____0
DiskSEAGATE_ST39102LW____0004
GenDisk 

PnP идентификаторы IDE устройств

Идентификаторы IDE устройств схожи с идентификаторами для SCSI устройств. Для IDE допустимо в inf-файлах представлять следующие варианты идентификационной информации, например:

IDE\ttttv_vrrrrrrrr
IDE\v_vrrrrrrrr
IDE\ttttv_v
v_vrrrrrrrr
gggg 

Здесь tttt является типо-кодом устройства (см. таблицу 12.11), v_v является 40-символьным идентификатором поставщика (производителя), rrrrrrrr — 8-сим-вольный номер версии разработки. В случае, если идентификатор поставщика короче 40 символов, то он дополняется символами подчеркивания. Пример для третьего варианта представления PnP идентификационной информации в inf-файле:

IDE\CdRomALPS_DC544______________________________

PnP идентификаторы USB устройств

Полный идентификатор для PnP USB устройств имеет форму

USB\Vid_vvvv&Pid_dddd&Rev_rr

Здесь vvvv является идентификатором поставщика (производителя), зарегистрированным в Комитете USB производителей, dddd — идентификатор, присвоенный производителем данной модели устройства, rr — номер версии разработки. Все упомянутые поля вводятся как шестнадцатеричные числа.

Кроме того, допустимо в inf-файлах представлять усеченные варианты идентификационной информации, например:

USB\Vid_vvvv_&Pid_dddd
USB\Class_cc&SubClass_ss&Prot_pp
USB\Class_cc&SubClass_ss
USB\Class_cc

Здесь cc является кодом базового класса из полученного дескриптора устройства или дескриптора интерфейса данного USB устройства, ss — код подкласса, pp — идентификатор протокола.

PnP идентификаторы устройств IEEE-1394 (FireWire)

Полный идентификатор для PnP USB устройств имеет форму

1394\VendorName&ModelName
1394\UnitSpecId&UnitSwVersion 

Здесь VendorName является наименованием поставщика (производителя), ModelName — идентификатор, присвоенный производителем данной модели устройства, UnitSpecId и UnitSwVersion — идентификаторы программных спецификаций, получаемые из конфигурационных ПЗУ подключаемых устройств, например:

1394\MICROSOFT&1394_DIAGNOSTIC_DEVICE
1394\031887&040892