Установка драйвера для определенного устройства

#winapi #windows-10 #setupapi

#winapi #windows-10 #setupapi

Вопрос:

Я хотел бы программно установить пользовательский драйвер для определенного устройства на моем компьютере:

  • Драйвер поставляется в виде INF-файла (вместе с некоторыми другими файлами).
  • Устройство является одним из двух идентичных сетевых адаптеров на моем компьютере.

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

  1. Используйте «DiInstallDriver» для установки моего драйвера на основе .inf в хранилище драйверов (см. https://learn.microsoft.com/en-us/windows/win32/api/newdev/nf-newdev-diinstalldrivera ).
  2. Используйте «DiInstallDevice», чтобы применить мой драйвер к устройству (см. https://learn.microsoft.com/en-us/windows/win32/api/newdev/nf-newdev-diinstalldevice ).

Будет ли это правильным / самым простым способом сделать это?

Если да, то вот следующий вопрос: для DiInstallDevice требуются два параметра, которые я не знаю, как получить:

  • DeviceInfoData: это должно указывать на сетевой адаптер, который я хочу изменить. Как мне это получить?
  • DriverInfoData: вероятно, это должно указывать на драйвер, который я установил на шаге 1? Как мне это получить?

PS: Сделать все это вручную очень просто: откройте диспетчер устройств, щелкните правой кнопкой мыши сетевой адаптер, выберите «Обновить драйвер», выберите файл .imf с диска -> готово! Но в этом случае мне нужно сделать это программно.

PPS: DevCon — это не вариант. Это позволяет обмениваться драйвером только на основе идентификатора оборудования. И этот идентификатор одинаков для обоих моих сетевых адаптеров (поскольку они абсолютно идентичны). Таким образом, это изменило бы драйвер обоих устройств.

Ответ №1:

Вам не нужно вызывать два метода, DiInstallDriver не только предварительно устанавливает драйвер в хранилище драйверов, но и устанавливает драйвер на устройствах, присутствующих в системе, которую поддерживает драйвер.

Вы можете обратиться к следующим документам: Функции, упрощающие установку драйвера Кажется, UpdateDriverForPlugAndPlayDevices это самый простой способ.

Для DiInstallDevice , эта функция должна использоваться только в том случае, если оба следующих параметра верны:

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

UpdateDriverForPlugAndPlayDevices или DiInstallDriver — это самый простой способ для приложения установки установить новый драйвер, который наилучшим образом подходит для устройств в системе. … Основная операция UpdateDriverForPlugAndPlayDevices аналогична операции DiInstallDriver . Однако UpdateDriverForPlugAndPlayDevices поддерживает дополнительные параметры установки.

Вы можете указать HardwareId сетевой адаптер для UpdateDriverForPlugAndPlayDevices . Если вы хотите установить свой драйвер .inf независимо от того, какой лучший драйвер уже существует на вашем компьютере, вам также необходимо указать InstallFlags as INSTALLFLAG_FORCE .(Внимание: принудительная установка драйвера может привести к замене более совместимого или более нового драйвера менее совместимым или более старым драйвером.)