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


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

Используйте примитивный драйвер для обработки и управления программным обеспечением, которое устанавливается с использованием 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.

    • Директива поставщика должна быть заполнена.

    • Директива 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=1windows, игнорирует раздел [DefaultUninstall] (в Windows 10 версии 1903 и более поздних версиях). Таким образом, вы можете включить этот раздел в INF, где его можно использовать вниз с устаревшим приложением установки и удаления, чтобы удалить примитивный пакет драйвера.

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

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

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