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


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

Для большинства систем физическая иерархия устройств на компьютере определяет порядок загрузки драйверов 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, являются следующие:

  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, которые еще не загружены.

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

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

Использование 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).

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