Обнаружение и распознавание устройств Plug and Play


В начале этой главы мы уже рассматривали пример, позволяющий получить общее представление о процессах, которые происходят в системе при установке новых устройств и разрешении аппаратных конфликтов. Однако этот пример имеет два существенных недостатка — он слишком прост и, самое главное, представляет информацию с точки зрения конечного пользователя. Теперь, когда мы ознакомились с основными концепциями Plug and Play, настало время обсудить, что же на самом деле происходит в системе при обнаружении и установке новых устройств, и какие компоненты требуются для успешного выполнения этой задачи.
Фактически подсистема Plug and Play выполняет следующие функции:

  •  обнаружение и энумерация устройств;
  •  выделение устройствам аппаратных ресурсов;
  •  динамическая загрузка, инициализация и выгрузка драйверов;
  •  уведомление других драйверов и приложений о доступности нового устройства;
  •  управление подачей электропитания при установке и удалении устройств.

После того как Windows обнаруживает новое устройство Plug and Play, драйвер устройства может быть сконфигурирован и загружен динамически, при минимальном вмешательстве пользователя (фактически в большинстве случаев такое вмешательство вообще не требуется). Некоторые шины, например, PCI и USB, в полной мере используют преимущества Plug and Play, и распознавание устройств, подключенных к таким шинам, происходит полностью автоматически. Как только новое устройство обнаружено, PnP Manager и шинный драйвер производят его энумерацию, после чего производится загрузка драйвера и запуск устройства. Если устройство подключено впервые, и системный реестр не содержит информации об этом устройстве, Windows установит и запустит драйверы для этого устройства.
Как уже упоминалось, программа Setup динамически исследует аппаратную конфигурацию компьютера и заносит информацию обо всех обнаруженных устройствах в реестр. Необходимую информацию программа Setup получает от самого устройства и от ассоциированных с ним INF-файлов.
В системах РпР подсистема РпР динамически отслеживает все переходы устройств между различными состояниями по мере того, как устройство подключается к системе, конфигурируется, запускается, останавливается и удаляется из системы. Все эти переходы схематично показаны на иллюстрации, приведенной на рис. 2.10.
Когда устанавливается новое устройство, система использует идентификатор устройства (device ID) для поиска INF-файлов, которые могут быть использованы для установки этого устройства. Windows далее использует эту информацию для создания параметров реестра в составе ключа HKEY_LOCAL_MACHINE, a затем копирует на диск необходимые драйверы. Если с новым устройством можно использовать несколько различных драйверов, то для определения драйвера, наиболее подходящего для данного устройства, Windows применяет так называемую систему приоритетного использования драйверов (driver-ranking schemes). Приоритеты драйверов определяются на основании наличия или отсутствия цифровой подписи и близости соответствия аппаратному идентификатору устройства (hardware ID, HW ID).



Рис. 2.10. Состояния устройств РnР

Таким образом, если вам требуется установить новое устройство, в первую очередь следует попытаться сделать это, полностью положившись на подсистему Plug and Play. Как правило, Windows автоматически обнаружит и сконфигурирует все поддерживаемые устройства. Схема действий пользователя зависит от типа устройства и определяется следующими правилами.

  •  Если устанавливается внешнее устройство Plug and Play, то просто подключите новое устройство, не выключая компьютера.
  •  Если требуется установить внутренний адаптер PCI или ISA Plug and Play, остановите систему, выключите компьютер и установите новое устройство. После перезагрузки Windows обнаружит устройство и автоматически запустит процедуры его установки.
  •  Если требуется установить наследуемое устройство, запустите Add Hardware wizard и попытайтесь обнаружить новое устройство средствами Windows Server 2003. Обратите внимание на то, что данная операция требует регистрации в системе от имени пользователя с административными правами.

Установка новых устройств происходит после регистрации пользователя в системе. Схема, иллюстрирующая процессы, которые происходят при установке драйверов нового устройства, приведена на рис. 2.11.



Рис. 2.11. Схема процесса установки драйверов устройств

Процессы, имеющие место при установке драйвера нового устройства, происходят в следующей последовательности:
1. Пользователь подключает новое устройство к компьютеру. Обратите внимание, что если шина, к которой подключено устройство, поддерживает уведомление о неожиданном подключении нового устройства (hot-plug notification), то вы можете не останавливать Windows и не выключать компьютер,
2. PnP Manager совместно с шинным драйвером производят энумерацию нового устройства. Шинный драйвер при поддержке шины получает уведомление о присутствии нового устройства, и, в свою очередь, уведомляет модуль PnP Manager режима ядра об изменении аппаратной конфигурации (в данном случае, о добавлении нового устройства). PnP Manager режима ядра запрашивает у шинного драйвера список физически присутствующих на шине устройств и сравнивает этот список с его предыдущей копией, чтобы определить, какое устройство было добавлено. Затем PnP Manager запрашивает у шинного драйвера информацию о новом устройстве (hardware ID, vendor ID, идентификаторы совместимых устройств).
3. PnP Manager режима ядра уведомляет PnP Manager режима пользователя о необходимости установки нового устройства.
4. PnP Manager режима пользователя создает новый процесс с использованием rundli32.exe и запускает модуль newdev.dll для установки нового устройства. Например, на рис. 2.12 показан вид окна программы-мастера Found New Hardware Wizard, предлагающего пользователю установить обнаруженное новое устройство (в данном случае, это — портативный накопитель Ziv, подключаемый к компьютеру через интерфейс USB).
5. DLL-библиотека, отвечающая за установку новых устройств, вызывает функции Setup API и функции диспетчера конфигурации PnP (CfgMgr API). Таким образом, Newdev.dll создает список драйверов, которые возможно использовать с данным устройством (рис. 2.13).
6. Инсталляторы класса (class installer) и ко-инсталляторы (co-installers), если они имеются, принимают участие в установке устройства, предоставляя дополнительные функциональные возможности по его конфигурированию.
7. Программа Setup передает управление ядру для загрузки драйверов устройства. Как только Setup определит наиболее подходящий драйвер для устройства, скопирует файлы драйвера, зарегистрирует интерфейсы и так далее, он уведомит пользователя об успешной установке нового устройства (рис. 2.14) и передаст управление модулю PnP Manager режима ядра для загрузки драйверов и запуска устройства.
8. PnP Manager загружает функциональный драйвер и необязательные драйверы фильтра.
9. Инсталляторы могут предоставлять дополнительные страницы свойств для конфигурирования параметров устройства.



Рис. 2.12. Мастер Found New Hardware Wizard предлагает пользователю установить драйверы для портативного накопителя Ziv


Рис. 2.13. Мастер Found New Hardware Wizard создает список драйверов, которые можно использовать с обнаруженным новым устройством



Рис. 2.14. Установка драйверов нового устройства успешно завершена



Рис. 2.15. Всплывающее сообщение, информирующее пользователя о появлении нового съемного накопителя



Рис. 2.16. Сообщение, информирующее пользователя о возможности безопасного удаления устройства

В частности, в рассматриваемом нами примере с портативным накопителем Ziv, после запуска драйверов в правом нижнем углу экрана появится всплывающее сообщение, информирующее о появлении в системе нового накопителя (рис. 2.15), который уже через несколько секунд будет готов к работе.
Обратите внимание, что удалять такой накопитель из системы необходимо с использованием функции Safe Removal, во избежание потери данных или даже порчи устройства. Для этого следует щелкнуть правой кнопкой мыши, указав курсором на значок, соответствующий съемному накопителю, выбрать из меню опцию Safely Remove this Device и дождаться появления всплывающего сообщения, подобного показанному на рис. 2.16.