Инсталятор драйвера на базе inf файла
От: V-ctor  
Дата: 03.11.06 11:27
Оценка:
Есть самодельное PCI-устройство, мною же написан драйвер (W2k/XP) (sys и inf)
Есть задача ставить драйвер автоматически, чтобы не лазить в диспетчере устроств.

Самое очевидное решение какое я увидел это проделать такое с помощью devcon от MS.
Там есть ключ install, но вот беда , точнее 2 варианта
1)если я вызываю инсталл (предварительно устройство не обнаружено системой никак)
devcon install inf_fil.inf PCI\VEN_1999

то почему-то драйвер не встает, а появляецо неизвестное устройство для которого не найдены драйвера
setupapi при этом говорит

#-199 Выполнение "C:\Work\GoldSphere\Driver\devcon.exe" с командной строкой: devcon.exe install GSDriver.inf PCI\VEN_1999
#I060 Установка выбранного драйвера.
#-019 Поиск идентификаторов аппаратуры: pci\ven_1999
#-166 Функция установки устройства: DIF_SELECTBESTCOMPATDRV.
#W059 Ошибка при подборе наиболее совместимого драйвера. Ошибка 0xe0000228: Для этого устройства отсутствую совместимые драйверы.
#W157 Ошибка установщика по умолчанию. Ошибка 0xe0000228: Для этого устройства отсутствую совместимые драйверы.
#-166 Функция установки устройства: DIF_INSTALLDEVICEFILES.
#I125 Установка пустого драйвера для "ROOT\MyClass\0000".
#E122 Не удалось установить устройство. Ошибка 0xe0000203: Для элемента или информационного пакета устройства не выбран драйвер.
#E157 Ошибка установщика по умолчанию. Ошибка 0xe0000203: Для элемента или информационного пакета устройства не выбран драйвер.
#I060 Установка выбранного драйвера.
#I125 Установка пустого драйвера для "ROOT\MyClass\0000".
#I121 Установка устройства "ROOT\MyClass\0000" успешно завершена.

2)а если перед командой инсталл я дам команду рескан (предварительно устройство не обнаружено системой никак), типа такого
devcon rescan
devcon install inf_fil.inf PCI\VEN_1999
то вначале он находит неизвестное PCI устройство, потом ставит для него драйвер , НО!!! также как и в первом варианте появляется неизвестное устройство!

[2006/11/03 16:07:56 760.19 Driver Install]
#-019 Поиск идентификаторов аппаратуры: pci\ven_1999&dev_0002&subsys_00000080&rev_00,pci\ven_1999&dev_0002&subsys_00000080,pci\ven_1999&dev_0002&cc_070780,pci\ven_1999&dev_0002&cc_0707
#-018 Поиск совместимых идентификаторов: pci\ven_1999&dev_0002&rev_00,pci\ven_1999&dev_0002,pci\ven_1999&cc_070780,pci\ven_1999&cc_0707,pci\ven_1999,pci\cc_070780,pci\cc_0707
#-198 Обработана командная строка: C:\WINDOWS\system32\services.exe
#I022 Найдено "PCI\VEN_1999&DEV_0002" в C:\WINDOWS\inf\oem36.inf; Устройство: "GoldSphere Trunk"; Драйвер: "GoldSphere Trunk"; Поставщик: "My Company"; Изготовитель: "My Company"; Секция: "GSDriver_DDI"
#I087 Нет доверия к узлу драйвера, ранг изменен с 0x00002001 на 0x0000a001.
#I023 Действительная секция установки: [GSDriver_DDI.NT]. Ранг: 0x0000a001. Дата драйвера: 01/01/1601.
#I022 Найдено "PCI\VEN_1999&DEV_0002" в C:\WINDOWS\inf\oem37.inf; Устройство: "GoldSphere Trunk"; Драйвер: "GoldSphere Trunk"; Поставщик: "My Company"; Изготовитель: "My Company"; Секция: "GSDriver_DDI"
#I087 Нет доверия к узлу драйвера, ранг изменен с 0x00002001 на 0x0000a001.
#I023 Действительная секция установки: [GSDriver_DDI.NT]. Ранг: 0x0000a001. Дата драйвера: 01/01/1601.
#-166 Функция установки устройства: DIF_SELECTBESTCOMPATDRV.
#I063 Установка выбранного драйвера из секции [GSDriver_DDI] в "c:\windows\inf\oem36.inf".
#I320 GUID класса устройства остается равным {FF646F80-8DEF-11D2-9449-00105A075F6B}.
#I060 Установка выбранного драйвера.
#I058 Выбран наиболее совместимый драйвер.
#-166 Функция установки устройства: DIF_INSTALLDEVICEFILES.
#I124 Выполняется только копирующая установка "PCI\VEN_1999&DEV_0002&SUBSYS_00000080&REV_00\4&BC67B8D&0&00F0".
#-011 Установка секции [GSDriver_DDI.NT] из "c:\windows\inf\oem36.inf".
#E358 Неподписанный или неправильно подписанный файл "c:\windows\inf\oem36.inf" для драйвера "GoldSphere Trunk" заблокирован (серверная установка). Ошибка 1168: Элемент не найден.
#E122 Не удалось установить устройство. Ошибка 1168: Элемент не найден.
#E157 Ошибка установщика по умолчанию. Ошибка 1168: Элемент не найден.
[2006/11/03 16:08:00 600.2]
#-199 Выполнение "C:\WINDOWS\system32\rundll32.exe" с командной строкой: rundll32.exe newdev.dll,ClientSideInstall \\.\pipe\PNP_Device_Install_Pipe_0.{FD92C582-E411-42DC-AD61-F9FDA1A499D1}
#I060 Установка выбранного драйвера.
#-019 Поиск идентификаторов аппаратуры: pci\ven_1999&dev_0002&subsys_00000080&rev_00,pci\ven_1999&dev_0002&subsys_00000080,pci\ven_1999&dev_0002&cc_070780,pci\ven_1999&dev_0002&cc_0707
#-018 Поиск совместимых идентификаторов: pci\ven_1999&dev_0002&rev_00,pci\ven_1999&dev_0002,pci\ven_1999&cc_070780,pci\ven_1999&cc_0707,pci\ven_1999,pci\cc_070780,pci\cc_0707
#I022 Найдено "PCI\VEN_1999&DEV_0002" в C:\WINDOWS\inf\oem36.inf; Устройство: "GoldSphere Trunk"; Драйвер: "GoldSphere Trunk"; Поставщик: "My Company"; Изготовитель: "My Company"; Секция: "GSDriver_DDI"
#I087 Нет доверия к узлу драйвера, ранг изменен с 0x00002001 на 0x0000a001.
#I023 Действительная секция установки: [GSDriver_DDI.NT]. Ранг: 0x0000a001. Дата драйвера: 01/01/1601.
#I022 Найдено "PCI\VEN_1999&DEV_0002" в C:\WINDOWS\inf\oem37.inf; Устройство: "GoldSphere Trunk"; Драйвер: "GoldSphere Trunk"; Поставщик: "My Company"; Изготовитель: "My Company"; Секция: "GSDriver_DDI"
#I087 Нет доверия к узлу драйвера, ранг изменен с 0x00002001 на 0x0000a001.
#I023 Действительная секция установки: [GSDriver_DDI.NT]. Ранг: 0x0000a001. Дата драйвера: 01/01/1601.
#-166 Функция установки устройства: DIF_SELECTBESTCOMPATDRV.
#I063 Установка выбранного драйвера из секции [GSDriver_DDI] в "c:\windows\inf\oem36.inf".
#I320 GUID класса устройства остается равным {FF646F80-8DEF-11D2-9449-00105A075F6B}.
#I060 Установка выбранного драйвера.
#I058 Выбран наиболее совместимый драйвер.
[2006/11/03 16:08:07 180.182]
#-199 Выполнение "C:\Work\GoldSphere\Driver\devcon.exe" с командной строкой: devcon.exe install GSDriver.inf PCI\VEN_1999
#I060 Установка выбранного драйвера.
#-019 Поиск идентификаторов аппаратуры: pci\ven_1999&dev_0002&subsys_00000080&rev_00,pci\ven_1999&dev_0002&subsys_00000080,pci\ven_1999&dev_0002&cc_070780,pci\ven_1999&dev_0002&cc_0707
#-018 Поиск совместимых идентификаторов: pci\ven_1999&dev_0002&rev_00,pci\ven_1999&dev_0002,pci\ven_1999&cc_070780,pci\ven_1999&cc_0707,pci\ven_1999,pci\cc_070780,pci\cc_0707
#I022 Найдено "PCI\VEN_1999&DEV_0002" в c:\work\goldsphere\driver\gsdriver.inf; Устройство: "GoldSphere Trunk"; Драйвер: "GoldSphere Trunk"; Поставщик: "My Company"; Изготовитель: "My Company"; Секция: "GSDriver_DDI"
#I087 Нет доверия к узлу драйвера, ранг изменен с 0x00002001 на 0x0000a001.
#I023 Действительная секция установки: [GSDriver_DDI.NT]. Ранг: 0x0000a001. Дата драйвера: 01/01/1601.
#-166 Функция установки устройства: DIF_SELECTBESTCOMPATDRV.
#I063 Установка выбранного драйвера из секции [GSDriver_DDI] в "c:\work\goldsphere\driver\gsdriver.inf".
#I320 GUID класса устройства остается равным {FF646F80-8DEF-11D2-9449-00105A075F6B}.
#I060 Установка выбранного драйвера.
#I058 Выбран наиболее совместимый драйвер.
#-124 Выполняется только копирующая установка "PCI\VEN_1999&DEV_0002&SUBSYS_00000080&REV_00\4&BC67B8D&0&00F0".
#E360 Неподписанный или неправильно подписанный файл "c:\work\goldsphere\driver\gsdriver.inf" для драйвера "GoldSphere Trunk" будет установлен (Политика=Игнорировать). Ошибка 0xe000022f: INF стороннего производителя не содержит информации о подписи.
#-024 Копирование файла "c:\work\goldsphere\driver\GSDriver.sys" в "C:\WINDOWS\System32\Drivers\GSDriver.sys".
#E360 Неподписанный или неправильно подписанный файл "c:\work\goldsphere\driver\GSDriver.sys" для драйвера "GoldSphere Trunk" будет установлен (Политика=Игнорировать). Ошибка 0xe000022f: INF стороннего производителя не содержит информации о подписи.
#-166 Функция установки устройства: DIF_REGISTER_COINSTALLERS.
#I056 Совместные установщики зарегистрированы.
#-166 Функция установки устройства: DIF_INSTALLINTERFACES.
#-011 Установка секции [GSDriver_DDI.NT.Interfaces] из "c:\work\goldsphere\driver\gsdriver.inf".
#I054 Интерфейсы установлены.
#-166 Функция установки устройства: DIF_INSTALLDEVICE.
#I123 Выполняется полная установка "PCI\VEN_1999&DEV_0002&SUBSYS_00000080&REV_00\4&BC67B8D&0&00F0".
#E360 Неподписанный или неправильно подписанный файл "c:\work\goldsphere\driver\gsdriver.inf" для драйвера "GoldSphere Trunk" будет установлен (Политика=Игнорировать). Ошибка 0xe000022f: INF стороннего производителя не содержит информации о подписи.
#I121 Установка устройства "PCI\VEN_1999&DEV_0002&SUBSYS_00000080&REV_00\4&BC67B8D&0&00F0" успешно завершена.
[2006/11/03 16:08:07 180.186]
#-199 Выполнение "C:\Work\GoldSphere\Driver\devcon.exe" с командной строкой: devcon.exe install GSDriver.inf PCI\VEN_1999
#I060 Установка выбранного драйвера.
#-019 Поиск идентификаторов аппаратуры: pci\ven_1999
#-166 Функция установки устройства: DIF_SELECTBESTCOMPATDRV.
#W059 Ошибка при подборе наиболее совместимого драйвера. Ошибка 0xe0000228: Для этого устройства отсутствую совместимые драйверы.
#W157 Ошибка установщика по умолчанию. Ошибка 0xe0000228: Для этого устройства отсутствую совместимые драйверы.
#-166 Функция установки устройства: DIF_INSTALLDEVICEFILES.
#I125 Установка пустого драйвера для "ROOT\MyClass\0000".
#E122 Не удалось установить устройство. Ошибка 0xe0000203: Для элемента или информационного пакета устройства не выбран драйвер.
#E157 Ошибка установщика по умолчанию. Ошибка 0xe0000203: Для элемента или информационного пакета устройства не выбран драйвер.
#I060 Установка выбранного драйвера.
#I125 Установка пустого драйвера для "ROOT\MyClass\0000".
#I121 Установка устройства "ROOT\MyClass\0000" успешно завершена.


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


И еще такой вопрос, кто-нибудь пробовал изучать работу того же devcon? Можно его из под студии собрать что бы потрасировать полноценно. А то только как драйвер — очень не удобно.
Просто есть идея сделать там приписку что бы он мог тупо прибивать это ненавистный ROOT\MyClass\xxxx, а то щас он може прибить токо все устройства класса MyClass.

Я конечно читал уже обсуждения подобных проблем, но что-то ответов там для себя не нашел.
Может есть другие примеры кроме devcon (ибо его функционал конечно избыточен)? С нуля если честно вникать не хотелось во все эти тонкости, хотя видимо придется
Re: Инсталятор драйвера на базе inf файла
От: Геннадий Майко США  
Дата: 03.11.06 13:47
Оценка:
Здравствуйте, V-ctor, Вы писали:

VC>Есть самодельное PCI-устройство, мною же написан драйвер (W2k/XP) (sys и inf)

VC>Есть задача ставить драйвер автоматически, чтобы не лазить в диспетчере устроств.

VC>Самое очевидное решение какое я увидел это проделать такое с помощью devcon от MS.

VC>Там есть ключ install, но вот беда , точнее 2 варианта
VC>1)если я вызываю инсталл (предварительно устройство не обнаружено системой никак)
VC>devcon install inf_fil.inf PCI\VEN_1999
--
Самое очевидное решение — это устанавливать драйвер PCI устройства с помощтю корректно
написанного для него *.inf файла. При установке платы в систему, после появления диалога Hardware Wizzard,
Вы указываете путь к этому *.inf файлу и система копирует нужные файлы в нужные места и запускает
драйвер и co-installers самостоятельно.

Было бы очень интересно взглянуть на Ваш inf_fil.inf файл. В частности, очень подозрительно выглядит строка
PCI\VEN_1999 — во-первых, я не смог найти компанию с Vendor Id == 0x1999, а во-вторых,
задавая такую строку, Вы пытаетесь поставить драйвер, который подходит для всех
устройст этой компании (кстати, что это за компания?)

Проверяли ли Вы его синтаксис *.inf файла с помощью chkinf?

Можете попробовать так же сгенерировать новый *.inf файл с помощью geninf и сравнить оба файла.

С уважением,
Геннадий Майко.
Re[2]: Инсталятор драйвера на базе inf файла
От: V-ctor  
Дата: 03.11.06 14:17
Оценка:
Здравствуйте, Геннадий Майко, Вы писали:

ГМ>Здравствуйте, V-ctor, Вы писали:


VC>>Есть самодельное PCI-устройство, мною же написан драйвер (W2k/XP) (sys и inf)

VC>>Есть задача ставить драйвер автоматически, чтобы не лазить в диспетчере устроств.

VC>>Самое очевидное решение какое я увидел это проделать такое с помощью devcon от MS.

VC>>Там есть ключ install, но вот беда , точнее 2 варианта
VC>>1)если я вызываю инсталл (предварительно устройство не обнаружено системой никак)
VC>>devcon install inf_fil.inf PCI\VEN_1999
ГМ>--
ГМ>Самое очевидное решение — это устанавливать драйвер PCI устройства с помощтю корректно
ГМ>написанного для него *.inf файла. При установке платы в систему, после появления диалога Hardware Wizzard,
ГМ>Вы указываете путь к этому *.inf файлу и система копирует нужные файлы в нужные места и запускает
ГМ>драйвер и co-installers самостоятельно.
Ну да всеверно, щас таки делаем, но хочется автоматизировать процесс путем запуска одного какого-то файла

ГМ>Было бы очень интересно взглянуть на Ваш inf_fil.inf файл.

Да нет проблем, вроде прикрепил
ГМ>В частности, очень подозрительно выглядит строка
ГМ>PCI\VEN_1999 — во-первых, я не смог найти компанию с Vendor Id == 0x1999, а во-вторых,
Ну ее потмоу наверно и нет, что я где-то читал/видел/слышал (шас уж не помню), что ее могут пользовать "безымянные" производители
Т.е. я просто нагло захапал этот номер под свои платки, не платя денег PCISIG, у нас продукт не попсовый ставится взакрытые сервера, поэтому конфликтов не ожидается.
ГМ>задавая такую строку, Вы пытаетесь поставить драйвер, который подходит для всех
ГМ>устройст этой компании (кстати, что это за компания?)
Вообще это я привел для краткости, у меня всего одна плата, реально я использую более сложную строку типа
"PCI\VEN_1999&DEV_0002"

ГМ>Проверяли ли Вы его синтаксис *.inf файла с помощью chkinf?

Мда что-то он попросил перл, а у меня его не оказалось ну я как-то и позабросил эту идею, другими словами нет не проверял понадеялсо на средство которое его сгенерировало

ГМ>Можете попробовать так же сгенерировать новый *.inf файл с помощью geninf и сравнить оба файла.

Я генерил inf с помощью нумеги. Должно все работать, ведь если ставлю ручками то все работает чудесно.

ГМ>С уважением,

ГМ>Геннадий Майко.
Re[2]: Инсталятор драйвера на базе inf файла
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 03.11.06 14:18
Оценка:
Здравствуйте, Геннадий Майко, Вы писали:

ГМ>Проверяли ли Вы его синтаксис *.inf файла с помощью chkinf?


Кстати, о chkinf. Я был очень удивлен, обнаружив в DDK утилиту, требующую PERL 8-O
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[3]: Инсталятор драйвера на базе inf файла
От: V-ctor  
Дата: 03.11.06 14:28
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Здравствуйте, Геннадий Майко, Вы писали:


ГМ>>Проверяли ли Вы его синтаксис *.inf файла с помощью chkinf?


ЕМ>Кстати, о chkinf. Я был очень удивлен, обнаружив в DDK утилиту, требующую PERL 8-O

Т.е. у вас тоже он требует перл? Я просто слегонца не в курсе как с ним бороться и поленился заморачиваться

Что-то файл у меня там не прикрепился, щас снова попробую.
Re[3]: Инсталятор драйвера на базе inf файла
От: V-ctor  
Дата: 03.11.06 15:04
Оценка:
Не пойму прикрепил я файл или нет? Ни разу раньше не прикреплял.
Сервер пишет что он там, а ссылки из форума не вижу
Re[4]: Инсталятор драйвера на базе inf файла
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 03.11.06 15:12
Оценка:
Здравствуйте, V-ctor, Вы писали:

VC>Т.е. у вас тоже он требует перл?


Что значит "у вас"? Если в батнике безусловно прописан запуск перлового интерпретатора — он может у одних требовать, а у других — нет?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[3]: Инсталятор драйвера на базе inf файла
От: Геннадий Майко США  
Дата: 03.11.06 15:15
Оценка:
Здравствуйте, V-ctor,

VC>>>Самое очевидное решение какое я увидел это проделать такое с помощью devcon от MS.

VC>>>Там есть ключ install, но вот беда , точнее 2 варианта
VC>>>1)если я вызываю инсталл (предварительно устройство не обнаружено системой никак)
VC>>>devcon install inf_fil.inf PCI\VEN_1999
ГМ>>--
ГМ>>Самое очевидное решение — это устанавливать драйвер PCI устройства с помощтю корректно
ГМ>>написанного для него *.inf файла. При установке платы в систему, после появления диалога Hardware Wizzard,
ГМ>>Вы указываете путь к этому *.inf файлу и система копирует нужные файлы в нужные места и запускает
ГМ>>драйвер и co-installers самостоятельно.
VC>Ну да всеверно, щас таки делаем, но хочется автоматизировать процесс путем запуска одного какого-то файла
--
В свое время мы написали процедуру инсталляции PCI драйвера (на основе devcon с небольшой модификацией — пример devcon всегда устанавливает драйвер в ROOT из-за флага DICD_GENERATE_ID при вызове функции SetupDiCreateDeviceInfo; поэтому мы самостоятельно генерировали строку full device instance ID для этой функции, чтобы установить драйвер в ветку PCI устройств). Но при старте драйвера мы не получали PCI ресурсы, скорее всего из-за того, что при установке драйвера мы не могли точно указать SPDRP_LOCATION_INFORMATION (см. SetupDiSetDeviceRegistryProperty функцию) в registry, поэтому сразу же после инсталляции дайвера нам нужно было его перестартовать (аналогично примеру из devcon), чтобы все в конце-концов работало корректно.

Честно говоря, мы забросили идею автоматизации процесса установки драйвера из-за того, что слишком много условий нужно было бы отслеживать в таком приложении — стартуется ли она без установки платы или с уже установленым устройством; установлен ли уже наш или какой-то другой драйвер для нашего устройства; работает ли уже этот драйвер или нет и т.д. Гораздо проще оказалось поручить все это системе.

Почитайте так же статью "Writing a Device Installation Application" в MSDN, может быть, имеет смысл устанавливать драйверы так, как там рекомендуется?

С уважением,
Геннадий Майко.
Re[5]: Инсталятор драйвера на базе inf файла
От: V-ctor  
Дата: 03.11.06 20:53
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Здравствуйте, V-ctor, Вы писали:


VC>>Т.е. у вас тоже он требует перл?


ЕМ>Что значит "у вас"? Если в батнике безусловно прописан запуск перлового интерпретатора — он может у одних требовать, а у других — нет?

Ну может разные ДДК. Тогда какой и где брать перл для этого?
Re[4]: Да все нормально делается в виде инсталятора ....
От: dachny  
Дата: 06.11.06 07:46
Оценка:
вот для примера скрипт инсталятора для Innosetup

; Copyright © 2002-2006 Alexander V Sagaidachny FGUP "SNIIGG&MS"

[Setup]
AppName=.......
AppVerName=...
AppPublisher=....
AppPublisherURL=....
AppSupportURL=...
AppUpdatesURL=....
AppVersion=5.2.0.61
CreateAppDir=no
LicenseFile=License.txt
Compression=lzma/ultra
SolidCompression=yes
DisableProgramGroupPage=yes
MinVersion=5.0,5.0
PrivilegesRequired=admin
AppCopyright=....
TouchDate=2006-02-15
Uninstallable=no
WizardImageFile=SetupModern.bmp
WizardSmallImageFile=SetupModernSmall.bmp
VersionInfoVersion=5.2.0.61
VersionInfoCompany= ...


[Files]
Source: "xxxxx.inf"; DestDir: "{win}\inf"; Flags: ignoreversion;
Source: "xxxxx.sys"; DestDir: "{sys}\drivers"; Flags: ignoreversion ; AfterInstall: InstallDrv


[Code]

function CM_Connect_Machine(  notNeed0: Integer ; var hMachine: Integer ): Integer ;
external 'CM_Connect_MachineA@setupapi.dll stdcall';


function CM_Locate_DevNode_Ex(  var DevInst: Integer ;
                                notNeed0: Integer ;
                                Flags: Integer ;
                                hMachine: Integer ): Integer ;
external 'CM_Locate_DevNode_ExA@setupapi.dll stdcall';


function CM_Reenumerate_DevNode_Ex(  DevInst: Integer ;
                            Flags: Integer ;
                            hMachine: Integer ): Integer ;
external 'CM_Reenumerate_DevNode_Ex@setupapi.dll stdcall';

function CM_Disconnect_Machine(hMachine: Integer ): Integer ;
external 'CM_Disconnect_Machine@setupapi.dll stdcall';


function UpdateDriverForPlugAndPlayDevices( hwndParent: HWND;
                                            HardwareId: String;
                                            FullInfPath: String;
                                            InstallFlags: Integer;
                                            var bRebootRequired: Boolean): Boolean;
external 'UpdateDriverForPlugAndPlayDevicesA@newdev.dll stdcall';

function SetupCopyOEMInf( SourceInfFileName:String ;
                          notNeed0: Integer ;
                          OEMSourceMediaType:Integer;
                          notNeed1: Integer;
                          oemPath: String;
                          oemPathSize: Integer;
                          notNeed4: Integer;
                          notNeed5: Integer ): Boolean;
external 'SetupCopyOEMInfA@setupapi.dll stdcall';



var
  needRest: Boolean;
  thePath:  String;
  res:     Boolean;
  theHNWD: Integer;
  oemPath:  String;
  hMachine: Integer;
  DevInst: Integer;
  
  ProgressPage: TOutputProgressWizardPage;

  


procedure InstallDrv();
begin
    Sleep(2000);
    
    ProgressPage := CreateOutputProgressPage('Installing',    'Please wait while Setup installs .....on your PC');
    ProgressPage.SetText('Register drivers...', '');
    ProgressPage.SetProgress(0, 10);
    ProgressPage.Show;
 
    
    CM_Connect_Machine( 0, hMachine);
    CM_Locate_DevNode_Ex( DevInst , 0, 0, hMachine);
    CM_Reenumerate_DevNode_Ex( DevInst , 0,  hMachine);
    CM_Disconnect_Machine ( hMachine );
     
    ProgressPage.SetProgress(1, 10);


    Sleep(500);

    ProgressPage.SetProgress(2, 10);


    thePath := ExpandConstant('{win}') + '\inf\xxxxx.inf';
    theHNWD := StrToInt ( ExpandConstant('{wizardhwnd}') );
    
    needRest := false;
    res := UpdateDriverForPlugAndPlayDevices( theHNWD, 'PCI\VEN_xxxx&DEV_xxxx', thePath, 1, needRest);
    
    ProgressPage.SetProgress(5, 10);


    if res = false then
      begin
         SetLength( oemPath, 260);
         res := SetupCopyOEMInf( thePath,
                                  0,
                                  1,
                                  0,
                                  oemPath,
                                  260,
                                  0,
                                  0 );
      end;
     
    ProgressPage.SetProgress(10, 10);

      ProgressPage.SetText('Register drivers...Done', '');
    
    Sleep(500);


    ProgressPage.Hide;


end;


function NeedRestart(): Boolean;
begin
    Result := needRest;
end;


а вот инф файл


[Version]
Signature="$Windows 95$"
Provider="........."

Class=NewDeviceClass
ClassGUID=........
DriverVer=......

[ClassInstall32]
Addreg=Class_AddReg

[Class_AddReg]
HKR,,,,"......."
HKR,,Icon,,"-5"

[Manufacturer]
"..............."=Mfg0

[Mfg0]
"...................."=xxxxxxxx_DDI, PCI\VEN_xxxx&DEV_xxxx

[xxxxxxxx_DDI.NT.Services]
Addservice = xxxxxxxx, 0x00000002, xxxxxxxx_AddService

[xxxxxxxx_AddService]
DisplayName    = ".........................."
ServiceType    = 1                  ; SERVICE_KERNEL_DRIVER
StartType      = 3                  ; SERVICE_DEMAND_START
ErrorControl   = 1                  ; SERVICE_ERROR_NORMAL
ServiceBinary  = %10%\System32\Drivers\xxxxxxxx.sys


обрати внимание что копирование инф происходит непосредственно в windows\inf
и бинарник драйвера в sistem32\drivers тоже копируется инсталатором

В самом инфе нет указаний на копирование каких либо файлов

В фукцию SetupCopyOEMInf передаетсяся путь инффайла windows\inf\твойинф.inf
и тогда она генерирует не файлы oemXX.inf и oemXX.pnf а только один файл твойинф.pnf
тоесть у тебя в папке windows\inf\ получается пара твойинф.pnf и твойинф.inf
И винда думает что твой дров ето часть дистрибутива винды и не намекает на вское там полписывание драйверов

код
    CM_Connect_Machine( 0, hMachine);
    CM_Locate_DevNode_Ex( DevInst , 0, 0, hMachine);
    CM_Reenumerate_DevNode_Ex( DevInst , 0,  hMachine);
    CM_Disconnect_Machine ( hMachine );


провоцирует винду поискать новые устройства

проверено на 2000 XP и 2003
Re[5]: Да все нормально делается в виде инсталятора ....
От: Геннадий Майко США  
Дата: 06.11.06 08:37
Оценка:
Здравствуйте, dachny,

Неплохой скрипт, полностью повторяющий некоторые рекомендации из уже упоминавшейся статьи "Writing a Device Installation Application": cчитая, что устройство уже вставлено в систему, попытаться пересканировать устройства и переинсталировать драйвер с помощью функции UpdateDriverForPlugAndPlayDevices. Если это не удалось, считать, что железяки нет в еще в системе, и предустановить драйвер с помощью функции SetupCopyOEMInf. Добавив еще корректную обработку ошибок, проверку In-Progress Installations, сутацию Reinstalling an Unplugged Device — вообще будет красота

Я же описывал проблемы с использованием функций инсталяции устройства более низкого уровня (когда devnode создается "руками"), как описано в исходных кодах devcon.

С уважением,
Геннадий Майко.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.