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


Создание нового драйвера-примитива

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

Предыстория и преимущества примитивных драйверов

До Windows 10 версии 1903 некоторые типы программного обеспечения, которые использовали установку на основе INF, но не обязательно были привязаны к определенному аппаратному устройству, не полностью поддерживались ОС. Хотя эти компоненты программного обеспечения использовали INF-файлы в качестве манифеста для установки, ОС не знала об этом сценарии напрямую и не поддерживала его встроенную обработку.

Поскольку эти элементы программного обеспечения не были привязаны к аппаратному устройству, они будут устанавливаться во всей системе независимо от оборудования. В результате не было никакой гарантии, что эти компоненты программного обеспечения были правильно установлены, удалены или обработаны при обновлении ОС.

Начиная с Windows 10 версии 1903, платформа Plug and Play обрабатывает и управляет этим типом программного пакета как сущность верхнего уровня, что повышает надежность и гарантирует надлежащее поведение такого программного обеспечения, особенно во время сценариев обновления и сброса ОС.

Типы программного обеспечения, которые используют эту новую поддержку платформы, называются примитивными драйверами. Примитивные драйверы продолжают использовать установку на основе INF, а базовая платформа использует хранилище драйверов для отслеживания всех соответствующих файлов.

Базовая платформа Plug and Play затем корректно устанавливает, удаляет и поддерживает состояние драйвера при обновлении ОС.

По сути, эти INF управляются по-разному. Ранее [DefaultInstall] (а часто и [DefaultUninstall]) обрабатывались программой SetupAPI в стиле скрипта, где INF использовался в качестве манифеста и SetupAPI выполнял инструкции в соответствующих разделах от имени вызывающего объекта.

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

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

Требования INF для доступа к примитивным функциям драйвера

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

    • Необходимо указать директиву Provider .

    • Необходимо заполнить директиву Class .

    • Необходимо заполнить директиву ClassGuid .

  • Драйвер должен быть совместим с DCH.

  • Раздел [Изготовитель] не может присутствовать.

  • Разделы [DefaultInstall] должны быть украшены архитектурой, и не могут присутствовать неоконченные версии.

    • Правильно: [DefaultInstall.NTamd64]

    • Неправильно: [DefaultInstall]

  • [DefaultUninstall] может не присутствовать в INF-файле (см . устаревшую совместимость для исключения).

Примитивные драйверы, предназначенные только Windows 10 версии 1903 и более поздних

Примитивные драйверы, предназначенные только для Windows 10 версии 1903 и более поздних версий, должны использовать DiInstallDriver и DiUninstallDriver для правильной установки и удаления программного обеспечения в хранилище драйверов или из хранилища драйверов.

Драйверы также должны использовать Dirid 13 , чтобы правильно указать хранилище драйверов в качестве нужного назначения для установки.

Устаревшая совместимость

Хотя параметр [DefaultUninstall] запрещен в примитивных драйверах, создается исключение для обеспечения совместимости ОС нижнего уровня. В Windows введена директива INF, которая заставляет версию ОС, поддерживающую примитивные драйверы, игнорировать раздел [DefaultUninstall]. Если пакету драйверов требуется поддержка версий ОС нижнего уровня, добавьте следующий синтаксис, чтобы платформа правильно обрабатывала такие случаи:

[DefaultUninstall.NTamd64]
LegacyUninstall=1

Разделы [DefaultInstall] и [DefaultUninstall] по-прежнему должны быть украшены архитектурой; Однако, включив LegacyUninstall=1, Windows игнорирует раздел [DefaultUninstall] (в Windows 10 версии 1903 и более поздних). Таким образом, вы можете включить этот раздел в inf, где его можно использовать на нижнем уровне с устаревшим приложением установки и удаления, чтобы удалить пакет драйвера примитива.

Начиная с Windows 10 версии 1903, если вы передаете раздел [DefaultInstall] или [DefaultUninstall] в API InstallHInfSection в setupapi.dll, пакет драйвера будет проверен, чтобы определить, поддерживает ли он примитивную функциональность драйвера. Если он поддерживает примитивную функциональность драйвера, а не обрабатывает указанный раздел в устаревшем режиме, INF-файл передается в DiInstallDriver или DiUninstallDriver соответствующим образом. Таким образом, один установщик может использовать примитивные драйверы в совместимых версиях ОС и поддерживать поддержку предыдущих версий ОС.

Преобразование из INF драйвера устройства

Преобразование INF-файла, использующего [Manufacturer], в значение , использующее [DefaultInstall], требует внесения незначительных изменений в INF-файл. В отличие от раздела [Manufacturer], раздел [DefaultInstall] является одновременно точкой входа и разделом установки. Это концептуально объединяет раздел [Manufacturer], [Models] и [DDInstall] в один.

Следующий INF-код получит ошибку 1297 в InfVerif , так как он не устанавливается на каком-либо оборудовании:

[Manufacturer]
%Company% = Driver, NTx86, NTamd64

[Driver.NTx86]
%DeviceDesc% = InstallSection_32,

[Driver.NTamd64]
%DeviceDesc% = InstallSection_64,

[InstallSection_64]
CopyFiles = MyCopyFiles_64
AddReg = MyAddReg

[InstallSection_64.Services]
AddService = MyService,, MyService_Install

[InstallSection_32]
CopyFiles = MyCopyFiles_x86
AddReg = MyAddReg

[InstallSection_32.Services]
AddService = MyService,, MyService_Install

Приведенный выше INF-файл можно преобразовать в inf-файл на основе [DefaultInstall], как показано ниже.

[DefaultInstall.NTamd64]
CopyFiles = MyCopyFiles_64
AddReg = MyAddReg

[DefaultInstall.NTamd64.Services]
AddService = MyService,, MyService_Install

[DefaultInstall.NTx86]
CopyFiles = MyCopyFiles_x86
AddReg = MyAddReg

[DefaultInstall.NTx86.Services]
AddService = MyService,, MyService_Install