Поделиться через


Указание порядка загрузки драйвера

Для большинства систем физическая иерархия устройств на компьютере определяет порядок, в котором Windows и диспетчер PnP загружают драйверы. Windows и диспетчер PnP настраивают устройства, начиная с корневого устройства системы, а затем настраивают дочерние устройства корневого устройства (например, адаптер PCI), дочерние элементы этих устройств и т. д. Диспетчер PnP загружает драйверы для каждого устройства по мере настройки устройства, если драйверы не были загружены для другого устройства.

Параметры в INF-файле могут повлиять на порядок загрузки драйвера. В этом разделе описываются соответствующие значения, которые поставщики должны указывать в разделе service-install-section , на который ссылается директива INF AddService драйвера. В частности, в этом разделе рассматриваются записи StartType, BootFlags, LoadOrderGroup и Dependencies.

Драйверы должны соответствовать этим правилам для указания StartType:

  • Драйвер PnP не нужен в начале загрузки

    Драйвер PnP должен иметь начальный тип SERVICE_DEMAND_START (0x3), указывая, что диспетчер PnP может загрузить драйвер, когда диспетчер PnP находит устройство, которое обслуживает драйвер.

  • Драйвер для устройства, необходимого для запуска компьютера

    Если для запуска компьютера требуется устройство, драйверы для устройства должны иметь начальный тип SERVICE_BOOT_START (0x0).

  • Драйвер, который не запускается при загрузке, обнаруживает устройства, которые не отображаются в PnP списке.

    Для устройства, которое не может быть перечислено PnP, драйвер сообщает устройство диспетчеру PnP, вызывая IoReportRootDevice или IoReportDetectedDevice. Такой драйвер должен иметь начальный тип SERVICE_SYSTEM_START (0x01), чтобы Windows загрузит драйвер во время инициализации системы.

    Только драйверы, которые сообщают о не-PnP оборудовании, должны установить этот тип запуска. Если драйвер обслуживает как устройства PnP, так и устройства, отличные от PnP, он должен задать этот тип запуска.

  • Драйвер, отличный от PnP, который должен запускаться диспетчером управления службами

    Такой драйвер должен иметь начальный тип SERVICE_AUTO_START (0x02). Драйверы PnP не должны задавать этот тип запуска.

Драйвер PnP должен быть написан таким образом, чтобы его можно было загрузить, когда Windows настраивает устройство, которое обслуживает этот драйвер. И наоборот, драйвер должен быть выгружен в любой момент, когда диспетчер PnP определяет, что устройств, которые он обслуживает, больше нет. Ниже приведены только упорядочения загрузки драйверов PnP, от которых должны зависеть драйверы PnP:

  1. Драйверы дочернего устройства могут зависеть оттого, что драйверы родительского устройства загружены.

  2. Драйвер в стеке устройств может зависеть от того, что любые драйверы под ним загружены.

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

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

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

Если драйвер имеет явную зависимость порядка нагрузки от другого драйвера, эта зависимость должна быть реализована через связь родительского или дочернего объекта. Драйвер для дочернего устройства может зависеть от загрузки драйверов для родительского устройства перед загрузкой драйверов для дочернего устройства.

Чтобы повысить важность задания правильного значения StartType , в следующем списке описывается, как Windows и диспетчер PnP используют записи StartType в INF-файлах:

  1. При запуске системы загрузчик операционной системы загружает драйверы типа SERVICE_BOOT_START перед передачей управления в ядро. Эти драйверы находятся в памяти, когда ядро получает управление.

    Драйверы начального запуска загружаются до настройки большинства устройств, поэтому их порядок загрузки не может быть определен иерархией устройств. Драйверы начальной загрузки могут использовать записи INF LoadOrderGroup для упорядочивания своей загрузки. Операционная система игнорирует записи зависимостей INF для драйверов начальной загрузки.

  2. Диспетчер PnP вызывает подпрограммы DriverEntry драйверов SERVICE_BOOT_START, чтобы драйверы могли обслуживать загрузочные устройства.

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

  3. После загрузки всех загрузочных драйверов и запуска загрузочных устройств диспетчер PnP настраивает остальные устройства PnP и загружает их драйверы.

    Диспетчер PnP проходит дерево устройств и загружает драйверы для devnodes, которые еще не запущены (т. е. все не запускаемые devnodes из предыдущего шага). По мере того как запускается каждое устройство, диспетчер PnP перечисляет дочерние элементы устройства, если они есть.

    По мере настройки этих устройств диспетчер PnP загружает драйверы для устройств независимо от значений StartType драйверов (за исключением случаев, когда StartType SERVICE_DISABLED) перед началом работы с устройствами. Многие из этих драйверов являются драйверами SERVICE_DEMAND_START.

    Диспетчер PnP игнорирует записи реестра, созданные в результате записей зависимостей INF и записей LoadOrderGroup для драйверов, загруженных на этом шаге. Порядок загрузки основан на иерархии физических устройств.

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

  4. Диспетчер PnP загружает драйверы StartType SERVICE_SYSTEM_START, которые еще не загружены.

    Эти драйверы обнаруживают и сообщают о своих не PnP устройствах. Диспетчер PnP обрабатывает записи реестра, которые являются результатом записей INF LoadOrderGroup для этих драйверов. Он игнорирует записи реестра, созданные из-за записей зависимостей INF для этих драйверов.

  5. Диспетчер управления службами загружает драйверы StartType SERVICE_AUTO_START, которые еще не загружены.

    Диспетчер управления службами обрабатывает сведения о базе данных службы в отношении зависимых групп и зависимых служб. Эти сведения зависят от записей зависимостей в записях INF AddService . Помните, что сведения о зависимостях обрабатываются только для драйверов, отличных от PnP, так как все необходимые драйверы PnP были загружены на предыдущем шаге запуска системы. Диспетчер управления службами игнорирует сведения INF LoadOrderGroup .

    Дополнительные сведения о диспетчере управления службами см. в документации по пакету SDK для Microsoft Windows.

Использование BootFlags для изменения типа запуска драйвера при загрузке в зависимости от сценария загрузки.

Операционная система может повысить StartType драйвера до драйвера начальной загрузки в зависимости от значения BootFlags, указанного в INF драйвера. В INF-файле можно указать одно или несколько (ORed) следующих числовых значений, выраженных как шестнадцатеричное значение:

  • Если драйвер должен быть повышен до драйвера, запускаемого при сетевой загрузке системы, задайте значение 0x1 (CM_SERVICE_NETWORK_BOOT_LOAD).
  • Если драйвер должен быть повышен при загрузке с виртуального жесткого диска, укажите 0x2 (CM_SERVICE_VIRTUAL_DISK_BOOT_LOAD)
  • Если драйвер должен быть повышен при загрузке с USB-диска, укажите 0x4 (CM_SERVICE_USB_DISK_BOOT_LOAD).
  • Если драйвер следует повысить при загрузке из хранилища SD, укажите 0x8 (CM_SERVICE_SD_DISK_BOOT_LOAD)
  • Если драйвер должен быть повышен при загрузке с диска на контроллере USB 3.0, укажите 0x10 (CM_SERVICE_USB3_DISK_BOOT_LOAD).
  • Если необходимо повысить привилегии драйвера при загрузке с включенной функцией измеряемой загрузки, укажите 0x20 (CM_SERVICE_MEASURED_BOOT_LOAD).
  • Если драйверу необходимо быть активированным при загрузке с включённым средством проверки, укажите 0x40 (CM_SERVICE_VERIFIER_BOOT_LOAD).
  • Если драйвер должен быть загружен во время загрузки WinPE, укажите 0x80 (CM_SERVICE_WINPE_BOOT_LOAD).

Дополнительные сведения о продвижении начального типа драйвера при загрузке в зависимости от сценария загрузки см. в директиве INF AddService.