#winapi #windows-10 #setupapi
#winapi #windows-10 #setupapi
Вопрос:
Я хотел бы программно установить пользовательский драйвер для определенного устройства на моем компьютере:
- Драйвер поставляется в виде INF-файла (вместе с некоторыми другими файлами).
- Устройство является одним из двух идентичных сетевых адаптеров на моем компьютере.
Насколько я знаю, единственный способ достичь этой цели — использовать Microsoft Setup API. Прочитав документацию, я бы предположил, что мне нужно выполнить два шага:
- Используйте «DiInstallDriver» для установки моего драйвера на основе .inf в хранилище драйверов (см. https://learn.microsoft.com/en-us/windows/win32/api/newdev/nf-newdev-diinstalldrivera ).
- Используйте «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
.(Внимание: принудительная установка драйвера может привести к замене более совместимого или более нового драйвера менее совместимым или более старым драйвером.)