Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: 1 2 [Все]   Вниз
  Печать  
Автор Тема: Предустановка драйвера  (Прочитано 41009 раз)
0 Пользователей и 1 Гость смотрят эту тему.
ilya1492
Гость
« : 04-08-2005 11:57 » 

Задача:
Есть драйвер некоего USB устройста с соответствующим .inf файлом.
необходимо выполнить программно предустановку драйвера с тем, чтобы
при первом подключении устройства Windows не требовала путь к драйверу.
Т.е. выполнить тоже, что и при выборе пункта Install стандартного
контекстного меню.
Драйвер работает как под Win98 так и под ХР (не подписан Майкрософтом)

Пробовал разные варианты с SetupInstallFromInfSection - ничего не получилось.
UpdateDriverForPlugAndPlayDevices работает только при подключеном устройстве

Кто-нить подскажет хоть в каком направлении копать? А то уже замучался.
Записан
dachny
Гость
« Ответ #1 : 05-08-2005 05:52 » 

Надо САМОМУ (хоть гейтс и запрещает но НАДО) скопировать *.inf в windows\inf\ a *.sys в windows\system32\drivers\
и еще в *.inf файле не должно быть инструкций на копирование файлов

а затем вызвать SetupCopyOEmInf
Записан
ilya1492
Гость
« Ответ #2 : 05-08-2005 06:37 » 

Цитата
Надо САМОМУ (хоть гейтс и запрещает но НАДО) скопировать *.inf в windows\inf\ a *.sys в windows\system32\drivers\
и еще в *.inf файле не должно быть инструкций на копирование файлов
а затем вызвать SetupCopyOEmInf

Спасибо, прверил данную методику, в принципе работает, но не совсем как надо:
все равно выскакивает окошко Found New Hardware Wizard, хотя теперь если выбрать "Установить автоматически" то драйвер устанавливатеся и не просит пути.

А можно как-то сделать чтобы New Hardware Wizard не выдавал лишних диалогов?
Записан
dorador
Гость
« Ответ #3 : 17-08-2005 09:04 » 

аналогичная проблема с PCI устройством : тоже появляется окно визарда и работает выбор автоматической установки, а хочется полный автомат (без диалога).
похоже, проблема не решаемая Жаль
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #4 : 25-08-2005 15:51 » 

Попробуйте 12 главу книги "Windows Driver Model" Walter Oney посмотреть, раздел "Defining a Device Class" ...
 она еще про 98 написана но разницы быть не должно больной...
там что то написано про библиотеки - установщики драйверов/классов... но честно говоря сам не лазил - без понятия.
но там есть фраза касательно ClassInstall32 секции inf файлов:
"SilentInstall, if present and not equal to 0, causes the PnP manager to install devices of this class without presenting any dialogs to the end user."
- дает надежду)
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
dorador
Гость
« Ответ #5 : 26-08-2005 14:28 » 

к сожалению не помогло  Так больше нельзя...
хотя и Оуни и MSDN говорят что окна появляться не должны
странно это...
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #6 : 26-08-2005 14:46 » 

Раздел "Device Installation: Writing a Device Installation Application" DDK-XP-SP1:
...
Может так попробовать?через SetupCopyOEMInf
Хотя судя по всему - просто Тупое копирование...
второй вариант... попробовать заранее создать все ключи реестра которые создаются при первой инсталяции драйверов. быть может поможет?
их можно отследить какой нибудь утилиткой.
« Последнее редактирование: 26-08-2005 15:00 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
dorador
Гость
« Ответ #7 : 26-08-2005 15:16 » 

SetupCopyOEMInf я применяю - куда ж без нее?
она из inf создает pnf, система это видит и после установки устройства начинает обрабатывать, но окно визарда выдает все равно
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #8 : 26-08-2005 15:22 » 

а за реестром последить не пробовал?
кстати... это ведь только при первом подключении запрос выдаваться должен?
а что делаешь чтобы ситуацию обратно вернуть?
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
dorador
Гость
« Ответ #9 : 29-08-2005 08:27 » 

а за реестром последить не пробовал?
кстати... это ведь только при первом подключении запрос выдаваться должен?
а что делаешь чтобы ситуацию обратно вернуть?
что пишется в реестр я знаю, вручную заносить не пробовал - считаю что это неправильно, хотя может попробую для эксперимента
а чтобы система воспринимало устройство как новое делаю следующее (WinXP)
1. удаляю inf и соотвествующий pnf файлы из каталога windows\inf
2. в реестре удаляю ветки
 HKLM\System\CurrentControlSet\Control\Class\ далее GUID из inf-файла
 HKLM\System\CurrentControlSet\Enum\ далее PCI или USB и устройство по вендору и девайсу
 HKLM\System\CurrentControlSet\Service\ далее имя драйвера

Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #10 : 29-08-2005 10:39 » 

а чтобы система воспринимало устройство как новое делаю следующее (WinXP)
1. удаляю inf и соотвествующий pnf файлы из каталога windows\inf
2. в реестре удаляю ветки
 HKLM\System\CurrentControlSet\Control\Class\ далее GUID из inf-файла
 HKLM\System\CurrentControlSet\Enum\ далее PCI или USB и устройство по вендору и девайсу
 HKLM\System\CurrentControlSet\Service\ далее имя драйвера
Цитата
Так в чем же дело? впринципе это и есть ответ на вопрос...
последовательность такая: винда находит новое устройство по PNP определяет его вендор и девайсИД.
по нему лезет в в ключ Enum, - там прописан соответствующий class устройства и сервис(драйвер который надо подгрузить). и GUID тоже.

и пока оно там не найдется - само ничего не случится...в смысле кнопка "применить" останется:)
если не хочется руками в реестре добавлять, или reg- файл написать...
тогда - апликуха, в которой соотвутствующими функциями создаются эти ключи - значения полей должны быть стандартны..
думаю так все инсталяторы и устроены...
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
dorador
Гость
« Ответ #11 : 29-08-2005 12:40 » 

неясно как генерятся значения некоторых параметров в этих ключах
и в разных виндах ветки могут быть разными (в 98 точно другие, в win2k не знаю)
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #12 : 30-08-2005 09:30 » 

а что именно не понятно из того что генерить по ключам надо?
там половину полей опустить можно...а вторая половина - вроде бы все банально из inf файла берется.
например для моего PCI
============================
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\PCI\VEN_XXXX&DEV_XXXX&SUBSYS_XXXXXXXX&REV_XX]

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\PCI\VEN_XXXX&DEV_XXXX&SUBSYS_XXXXXXXX&REV_XX\?&Не понялНе понял?&?&??]
"DeviceDesc"="board driver" //отображаемое имя устройства
"LocationInformation"="PCI шина 0, устройство 9, функция 0" //скорее пофиг - инфа для отображения.
"Capabilities"=dword:00000000
"UINumber"=dword:00000004
"HardwareID"=hex(7):"VEN_XXXX&DEV_XXXX&SUBSYS_XXXXXXXX&REV_XX" юникодом
"CompatibleIDs"=hex(7):"VEN_XXXX&DEV_XXXX&SUBSYS_XXXXXXXX&REV_XX" юникодом
"ClassGUID"="GUID..." //ваш GUID классa
"Class"="название класса"
"Driver"="GUID...\\0000" GUID раздела реестра HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\0000 - имя драйвера (0000,0001 и т.д. передисление при установке нового драйвера под то же устройство
"Mfg"="HW Manufacturer"
"Service"="Название сервиса"
"ConfigFlags"=dword:00000000

неизвестны поля:
Capabilities   - оставить как есть для вашего устройства,
UINumber   - с этим номером не в курсе... он генерится (можно попробовать вообще без него. для USB вроде нет такого)
ConfigFlags - оставить как есть для вашего устройства

?&Не понялНе понял?&?&??  -это тоже не ясно, кажется любое число покатит, помоему эксперементироавл в свое время... пофиг. меняется если ту же PCI карту в другой слот воткнуть. но тут не суть важно, важно чтобы устройство хотя бы раз было воткнуто.
===================================

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{ваш GUID классa}]
"Class"="название класса"
@="название класса"
"Icon"="-5" //индекс вашей иконки в дереве устройств (-5 - иконка сетевой карточки)

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{ваш GUID классa}\0000]
"InfPath"="oem3.inf"
"InfSection"="WDM_ISR_DDI" //название секции инстала из inf файла
"InfSectionExt"=".NT"
"ProviderName"="имя вашей фирмы"
"DriverVersion"="1.0.0.0" //версия драйвера (помоему та что из инфо драйвера скомпилирована)
"MatchingDeviceId"="pci\\VEN_XXXX&DEV_XXXX&SUBSYS_XXXXXXXX&REV_XX"
"DriverDesc"="board driver"

тут все ясно.
===============================

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Название сервиса]
"Type"=dword:00000001 //из inf файла поле ServiceType
"Start"=dword:00000003 //из inf файла поле StartType
"ErrorControl"=dword:00000001 //из inf файла поле ErrorControl
"ImagePath"=hex(2):юникодом путь до файла драйвера
"DisplayName"="board service"

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Название сервиса\Security]
"Security"=hex:........... не знаю... дескриптор защиты?  можно попробовать без него вообще, без этого ключа вообще.

=========
PS для USB подчти полная аналогия должна быть... есть конкретные вопросы - посмотрю.
PPS возможно для инсталяции без вопросов половину из перечисленного можно убить. хватит наверное только ключа с вендором девайса, GUID класса с путем до драйвера и класса устройства...
« Последнее редактирование: 30-08-2005 09:38 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
dorador
Гость
« Ответ #13 : 31-08-2005 10:29 » 

Ochkarik, лихо отмахиваешься от того, что не ясно - это чревато тем что в одних случаях будет работать, а в других нет
есть еще один аргумент не заполнять самостоятельно реестр:
в ключе
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\PCI\VEN_XXXX&DEV_XXXX&SUBSYS_XXXXXXXX&REV_XX]
создается новый подключ, если устройство переткнуть в соседний слот
а если пользователь будет перетыкать несколько раз и в разные слоты?
либо опять появится окно визарда, либо надо наделать подключей по количеству слотов
а если драйвер обслуживает несколько устройств с разными DeviceID, то повторить это для каждого
ой, что-то не нравится мне такой способ Жаль
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #14 : 31-08-2005 11:11 » 

хм.... окно визарда появилось... только что переткнул карточку с моим драйвером...но впрочем это для PCI...

разве на USB это происходит? я не помню чтобы при втыкании той же флешки в соседний USB появлялось окно визарда?
к сожалению нет под рукой USB устройства для опытов...
попробовал переткнуть USB концентратор на мониторе. но он его и так и так Винь сама ставит, внезависимости от подключения.
НО! новой ветки в ключе
HKLM\SYSTEM\Curr...\Enum\USB\...
не появилось.... появилась всего одна - при первом поключении!
если не лень - поэксперементируй...
штука в том, что USB изначально разрабатывалась для горячего подключения в первую попавшуюся дырку... - там нет смысла использовать номер этой самой дырки...
но - все это эксперементально.
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
dorador
Гость
« Ответ #15 : 31-08-2005 11:25 » 

мне и для PCI тоже самое надо
а на USB тоже появляется новая ветка
может у тебя не появилась, потому что другой порт на той же шине оказался (в USB на одной шине (хабе) по 2 порта сидит)?
Записан
AlexANDor
Гость
« Ответ #16 : 03-09-2005 20:55 » 

На USB визард установки нового устройства на другом порту хаба выдается  в том случае, если USB-устройство не имеет серийного номера (используется геограифическая адресация для енумерации). Соответственно в реестре создаются новые ветки для всех портов хабов. Если SN есть - установка однократная и в реестре одна ветка, енумерация по SN.
Кстати, по умолчанию разрешения на модификацию ветки HKLM\System\CurrentControlSet\Enum\ (как и некоторых других) нет даже у администратора, хотя он может предварительно установить себе такое разрешение.
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #17 : 05-09-2005 09:28 » 

Очередная "идея"... а что если попробовать драйвер SCM-ом  грузить первый раз... принудительно его устанавливая...
функция API - CreateService...
раздел MSDN   "Platform SDK: DLLs, Processes, and Threads -> Services"Не понял

Кстати... вопрос подчти в тему - никто не пытался виртуальных устройств под 1394 писать? как их грузить надо? правда говорят что это только под XP работает...

Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
dorador
Гость
« Ответ #18 : 06-09-2005 12:41 » 

На USB визард установки нового устройства на другом порту хаба выдается  в том случае, если USB-устройство не имеет серийного номера (используется геограифическая адресация для енумерации). Соответственно в реестре создаются новые ветки для всех портов хабов. Если SN есть - установка однократная и в реестре одна ветка, енумерация по SN.
Кстати, по умолчанию разрешения на модификацию ветки HKLM\System\CurrentControlSet\Enum\ (как и некоторых других) нет даже у администратора, хотя он может предварительно установить себе такое разрешение.
это Вы про ветки, которые образуются внутри ветки Vid_xxxx&Pid_xxxx ?
что такое SN (серийный номер) ?  это iSerialNumber ? строка из дескриптора устройства? она имеет такое значение?
в моем устройстве ее нет - в реестре 2 ветки под веткой Vid_xxxx&Pid_xxxx
в USB-флешке, которую я использую, она есть - в реестре 3 ветки под веткой Vid_xxxx&Pid_xxxx
или я что-то не понял или Ваше предположение не прокатывает... Здесь была моя ладья...


Очередная "идея"... а что если попробовать драйвер SCM-ом грузить первый раз... принудительно его устанавливая...
функция API - CreateService...
раздел MSDN "Platform SDK: DLLs, Processes, and Threads -> Services"Не понял
SCM-ом драйвер (при отсутствии устройства) загрузить не удалось,
думаю, с WDM драйверами устройств это непроходит Жаль
Записан
AlexANDor
Гость
« Ответ #19 : 06-09-2005 15:43 » 

Цитата
это Вы про ветки, которые образуются внутри ветки Vid_xxxx&Pid_xxxx ?

Да

Цитата
что такое SN (серийный номер) ?  это iSerialNumber ? строка из дескриптора устройства?

Да. Ее еще удобно смотреть утилиткой USBview из комплекта DDK.

Цитата
она имеет такое значение?

Да, потому что комбинация VID + PID + SN задает экземпляр физического устройства.

Цитата
в моем устройстве ее нет - в реестре 2 ветки под веткой Vid_xxxx&Pid_xxxx
в USB-флешке, которую я использую, она есть - в реестре 3 ветки под веткой Vid_xxxx&Pid_xxxx

Как называются подветки? Для SN подветка прямо этим номером и называется. Для географичсекой адресации a&bbbbbbbb&c&d. LocationInformation во всех трех подветках одинаков? Может втыкали другую флешку того же производителя, но без SN - у меня есть ровно такой случай для Transcend Flash, одна 256M, другая 512, одна с SN, другая - без, VID+PID одинаковы.
« Последнее редактирование: 06-09-2005 15:50 от AlexANDor » Записан
dorador
Гость
« Ответ #20 : 07-09-2005 09:01 » 

Да, потому что комбинация VID + PID + SN задает экземпляр физического устройства.
Как называются подветки? Для SN подветка прямо этим номером и называется. Для географичсекой адресации a&bbbbbbbb&c&d. LocationInformation во всех трех подветках одинаков? Может втыкали другую флешку того же производителя, но без SN - у меня есть ровно такой случай для Transcend Flash, одна 256M, другая 512, одна с SN, другая - без, VID+PID одинаковы.

Ваша правда: одно и то же USB-устройство, имеющее SN, образует только одну подветку внутри ветки Vid_xxxx&Pid_xxxx.
А ветки у меня были от разных устройств с одними VID и PID.
А что такое географичсекая адресация и как она получается?
для PCI-устройств похоже, что применяется она же
Записан
Viktor Denk
Участник

de
Offline Offline

« Ответ #21 : 07-09-2005 09:43 » 

а затем вызвать SetupCopyOEmInf
Не могли б Вы, уважаемый, привести кусочек кода?

что пишется в реестр я знаю, вручную заносить не пробовал - считаю что это неправильно, хотя может попробую для эксперимента
а чтобы система воспринимало устройство как новое делаю следующее (WinXP)
1. удаляю inf и соотвествующий pnf файлы из каталога windows\inf
2. в реестре удаляю ветки
 HKLM\System\CurrentControlSet\Control\Class\ далее GUID из inf-файла
 HKLM\System\CurrentControlSet\Enum\ далее PCI или USB и устройство по вендору и девайсу
 HKLM\System\CurrentControlSet\Service\ далее имя драйвера


Интересно, а как это в "enum" записать что нибудь?. У меня права Admin, но при попытке записи шипитt: "Цыц, иди на..."
 

На USB визард установки нового устройства на другом порту хаба выдается  в том случае, если USB-устройство не имеет серийного номера (используется геограифическая адресация для енумерации). Соответственно в реестре создаются новые ветки для всех портов хабов. Если SN есть - установка однократная и в реестре одна ветка, енумерация по SN.
Кстати, по умолчанию разрешения на модификацию ветки HKLM\System\CurrentControlSet\Enum\ (как и некоторых других) нет даже у администратора, хотя он может предварительно установить себе такое разрешение.

"Кстати" а как это сделать, лучше всего из программы?

А то я попытался с Тостером ( из ДДК) проделать, ничего не получилось. Я имею в виду "тихую инсталляцию".
Заранее ВСЕМ  большое СПАСИБО за интересную и полезную дискуссию!
Viktor
vetoshkin@mail333.com

Записан

A u nas v Sibiri!
dorador
Гость
« Ответ #22 : 07-09-2005 14:38 » 

а затем вызвать SetupCopyOEmInf
Не могли б Вы, уважаемый, привести кусочек кода?
примерно так
      if(!SetupCopyOEMInf(FullSourcePath,
               NULL,
               SPOST_PATH,
               0,
               OemPath,//NULL,
               MAX_PATH,//0,
               NULL,
               NULL))
      {
         Status = GetLastError();
         printf("Fail: SetupCopyOEMInf");
         return Status;
      }
в MSDN есть подробности
Цитата
что пишется в реестр я знаю, вручную заносить не пробовал - считаю что это неправильно, хотя может попробую для эксперимента
а чтобы система воспринимало устройство как новое делаю следующее (WinXP)
1. удаляю inf и соотвествующий pnf файлы из каталога windows\inf
2. в реестре удаляю ветки
 HKLM\System\CurrentControlSet\Control\Class\ далее GUID из inf-файла
 HKLM\System\CurrentControlSet\Enum\ далее PCI или USB и устройство по вендору и девайсу
 HKLM\System\CurrentControlSet\Service\ далее имя драйвера


Интересно, а как это в "enum" записать что нибудь?. У меня права Admin, но при попытке записи шипитt: "Цыц, иди на..."
 

в RegEdit есть пункт меню "Permissions..."
Записан
AlexANDor
Гость
« Ответ #23 : 07-09-2005 23:07 » 

Цитата
А что такое географичсекая адресация и как она получается?
для PCI-устройств похоже, что применяется она же

Географическая - "Location", адресация - неудачно я выразился, точнее - идентификация.
Из глоссария в описании DDK:

device instance ID - A system-supplied string that identifies a device instance. This string consists of a device ID and an additional, instance-specific instance ID. The string format is:
<enumerator>\<enumerator-specific-device-ID>\<instance-specific-ID>
For example:
PCI\VEN_1000&DEV_0001&SUBSYS_00000000&REV_02\1&08

instance ID - A string that distinguishes a device from other devices of the same type on a machine. An instance ID is a string (without any path-separator characters) that contains serial-number information, if supported by the underlying bus, or some kind of location information. The format of the string is bus specific.

Я не встречал описания, как именно образуется строка instance ID в случае отсутствия SN для того же USB, но не особо и искал, в общем-то какая мне разница? На PCI тем более Location уместен - SN при всем желании не мог бы идентифицировать устройство, ибо важен слот - линии прерываний индивидуальны для разных слотов. И тем более нет горячего подключения.

PS. А новый микрософтовский DIF (Driver Install Frameworks) для сабжа не поможет?
« Последнее редактирование: 07-09-2005 23:49 от AlexANDor » Записан
dorador
Гость
« Ответ #24 : 08-09-2005 08:10 » 

Из глоссария в описании DDK:
туда я как раз заглянуть и не догадался Отлично
Цитата
PS. А новый микрософтовский DIF (Driver Install Frameworks) для сабжа не поможет?
не пробовал, но читал где-то, что он поддерживает только подписанные драйвера
впрочем, встречал и такое мнение, что тихая установка (без окна визарда) вообще возможна только на подписанных драйверах
Записан
AlexANDor
Гость
« Ответ #25 : 08-09-2005 12:26 » 

Как не крути, ветки в реестре для данного экземпляра устройства должны быть в реестре, иначе при его втыкании получим визард установки. И наоборот - если все ветки заранее правильно созданы - это ничем imho не отличается от корректной установки и при втыкании устройства не будет предупреждения о неподписанном доайвере, это просто аналогично уже повторному втыканию. Для USB очевидно все-таки удобно иметь SN. Но пока устройство не воткнуто - SN взять неоткуда, замкнутый круг. Или иметь индивидуальные инсталляторы настроенные на свои SN, но это уже снова неудобства. Или выпускать все устройства с одним SN в надежде, что два их никогда не воткнут в один компъютер. Что неправильно. Ветки реестра - разные для 9x и NT.
Хотя мне не очень понятна борьба именно с визардом - ну выскочит он, и ладно, как бы обратная связь пользователю - все нормально, устройство найдено. Если речь не о каких-то шпионских штучках. Улыбаюсь
Записан
dorador
Гость
« Ответ #26 : 08-09-2005 12:53 » 

Как не крути, ветки в реестре для данного экземпляра устройства должны быть в реестре, иначе при его втыкании получим визард установки. И наоборот - если все ветки заранее правильно созданы - это ничем imho не отличается от корректной установки и при втыкании устройства не будет предупреждения о неподписанном доайвере, это просто аналогично уже повторному втыканию. Для USB очевидно все-таки удобно иметь SN. Но пока устройство не воткнуто - SN взять неоткуда, замкнутый круг. Или иметь индивидуальные инсталляторы настроенные на свои SN, но это уже снова неудобства. Или выпускать все устройства с одним SN в надежде, что два их никогда не воткнут в один компъютер. Что неправильно. Ветки реестра - разные для 9x и NT.
Хотя мне не очень понятна борьба именно с визардом - ну выскочит он, и ладно, как бы обратная связь пользователю - все нормально, устройство найдено. Если речь не о каких-то шпионских штучках. Улыбаюсь
я с тобой полностью согласен
а изначально вопрос возник из желания упростить:
 1) жизнь пользователю
 2) написание руководства по установке себе
Записан
Viktor Denk
Участник

de
Offline Offline

« Ответ #27 : 08-09-2005 14:03 » 

1. Как не крути, ветки в реестре для данного экземпляра устройства должны быть в реестре, иначе при его втыкании получим визард установки. И наоборот - если все ветки заранее правильно созданы - это ничем imho не отличается от корректной установки и при втыкании устройства не будет предупреждения о неподписанном доайвере, это просто аналогично уже повторному втыканию. Для USB очевидно все-таки удобно иметь SN. Но пока устройство не воткнуто - SN взять неоткуда, замкнутый круг. Или иметь индивидуальные инсталляторы настроенные на свои SN, но это уже снова неудобства. Или выпускать все устройства с одним SN в надежде, что два их никогда не воткнут в один компъютер. Что неправильно. Ветки реестра - разные для 9x и NT.
Хотя мне не очень понятна борьба именно с визардом - ну выскочит он, и ладно, как бы обратная связь пользователю - все нормально, устройство найдено.
2. Если речь не о каких-то шпионских штучках. Улыбаюсь
2. При системном и удаленном администкировании ЭТО жизненно необходимо, админ - по определению левый
1. Не очевидно. На свежем ХП Проф вставил HID клаву, дождался опознания, сфотал регистры, експортировал все важные ( как мне казалось) ветки и импортировал их снова на новом ВЫНЕ. Результат - теперь никакими силами не могу заставить работать. Конечно после деинсталляции ручками всех итемс цвета детской неожиданности в Device manager все встало на место, но ....
Viktor
vetoshkin@mail333.com
Записан

A u nas v Sibiri!
AlexANDor
Гость
« Ответ #28 : 08-09-2005 14:53 » 

Цитата
1. Не очевидно.
Не спорю. Увы, cейчас специально ставить эксперимент времени нет, но:
1). instance ID для USB в случае отсутствия SN скорее всего машинно- и OS-зависимый.
2). Возможно скопировали не все ветки. Там их довольно много, в том числе связанные с Class GUID, Interface GUID, сервисом.
3). После правки реестра может быть нужна перезагрузка (именно потому что обошлись только правкой, а не вызовом системных функций установки).
4). HID - стандартный класс, возможно есть еще какая-то специфика.
« Последнее редактирование: 08-09-2005 23:43 от AlexANDor » Записан
Viktor Denk
Участник

de
Offline Offline

« Ответ #29 : 09-09-2005 06:53 » 

AlexANDor:
Сейчас еще на раз проанализировал, что и как сделал ( для меня это все жизненно важно):
1. Там больше 700 изменений в регистрах, смотрел RegShot 1.72;
2. Скопировал все ветви HKLM\SYSTEM\CurrentControlSet\;
3. Не скопировал в HKLM\SYSTEM\ControlSet001\ и HKU\...;
4. Но критичными окзались ( по моему мнению) немодифицтрованные значения в HKLM\SYSTEM\CurrentControlSet\. там есть такие вещи как:
...Kbdclass\Enum\Count: 0x00000002 на 0x00000003
...Kbdclass\Enum\NextInstance: 0x00000002 на 0x00000003
и.т.д.
Да, делать все ручками - по большому счета: "ножками"
Viktor
vetoshkin@mail333.com
Записан

A u nas v Sibiri!
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #30 : 09-09-2005 07:13 » 

Народ, может я немного опоздал. Просто месяца 3 назад тоже мучился с предустановкой дров. Вот так всё работает:

1. Копирую файлы с внешнего носителя на жесткий диск
2.

DWORD PreInstallUSB(LPCTSTR pszInfFile)
{
   // extract path
   TCHAR pszPath[_MAX_PATH];
   memset(pszPath, 0, _MAX_PATH*sizeof(TCHAR));
   _tcscpy(pszPath, pszInfFile);

   LPTSTR pos = _tcsrchr(pszPath,'\\');
   *pos = '\0';
   
   DWORD dwRet = 0;
   if(!::SetupCopyOEMInf(pszInfFile, pszPath, SPOST_PATH, 0, NULL, 0, NULL, NULL))
   {
      dwRet = ::GetLastError();
   }
   return dwRet;
}

Сначала эта беда не работала, потому, что дрова были не сертифицированы мелкософтом. После вызова SetupCopyOEMInf посмотрите в файл setupapi.log, который лежит на w2k c:\winnt. Я его перед экспериментами удалял, чтобы "свеженькие" логи легче читались. В общем пока драйвер был не сертифицирован
SetupCopyOEMInf прокатывала и pif генерился, но в setupapi.log записывалась ошибка (сейчас уже не помню какая). После подключения USB устройства (принтера) появлялось окошко визарда.
Проблема исчезла после того как клиенты прислали сертифицированный драйвер.

зы Ещё одно - отключение проверки сертификации тоже не помогало. Во время прединсталляции диалог не появлялся, но визард после пнп выскакивал.
« Последнее редактирование: 20-12-2007 19:39 от Алексей1153++ » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
dorador
Гость
« Ответ #31 : 09-09-2005 08:19 » 

SetupCopyOEMInf прокатывала и pif генерился, но в setupapi.log записывалась ошибка (сейчас уже не помню какая). После подключения USB устройства (принтера) появлялось окошко визарда.
Проблема исчезла после того как клиенты прислали сертифицированный драйвер.

зы Ещё одно - отключение проверки сертификации тоже не помогало. Во время прединсталляции диалог не появлялся, но визард после пнп выскакивал.
Ага, все-таки сертификация (чтоб ее ....:nono:)
Записан
Viktor Denk
Участник

de
Offline Offline

« Ответ #32 : 21-09-2005 14:24 » 

Всем привет!
То что Джон запостил ( плюс SlavaI когдато писал) еще не проверял, но с легкой руки dorador нашел в МСДН как из программы взять дополнительные права для работы с защищенными ветками реестра, например Enum.
Все это можно найти по запросу: Q146906. Топик называется "HOWTO: Secure Performance Data in Windows 2000, Nt, XP", Last Modified on 01-28-2002.
Я пока без изысков запихал в ДЛЛ конкретные ветки. Замеченные особенности ( действительны видимо лишь для начинающих):
1. Компилировать надо из СДК окружения ( SetEnv.Bat для "Debug / Release"  и "msdev /useenv" из досовского окна);
2. Я пока с CONST - ми не разбирался, поэтому приходится вызывать функцию для каждого узла. Например, для Enum, а потом и для USB .
Best regards
Viktor
Записан

A u nas v Sibiri!
AlexANDor
Гость
« Ответ #33 : 28-09-2005 17:04 » 

Надо САМОМУ (хоть гейтс и запрещает но НАДО) скопировать *.inf в windows\inf\ a *.sys в windows\system32\drivers\
и еще в *.inf файле не должно быть инструкций на копирование файлов
а затем вызвать SetupCopyOEmInf

Не понял, зачем сначала копировть *.inf в windows\inf, а затем ЕЩЕ и запускать SetupCopyOEMInf (в результате чего создастся oem*.inf и oem*.pnf) ?  Зачем там будет два inf-файла? По моему достаточно чего-то одного. И, кстати, чем первый путь (просто скопировать *.inf) хуже второго? Вроде все работает, а *.pnf создается уже при обнаружении устройства.
Записан
dachny
Гость
« Ответ #34 : 29-09-2005 04:41 » 

>>Не понял, зачем сначала копировть *.inf в windows\inf, а затем ЕЩЕ и запускать SetupCopyOEMInf (в результате чего создастся oem*.inf и
>>oem*.pnf) ?  Зачем там будет два inf-файла?

Если ты сам скопируешь свой inf например mydov.inf а затем запустишь SetupCopyOEMInf то получиться файло mydov.pnf

внимание это важно в системе будут НЕ oemXX.inf + oemXX.pnf а файлы mydov.inf + mydov.pnf

То есть винда будет думать что ети файлы часть дистрибутива винды и просить подписывания не будет и при втыкании железки дрова будут ставиться  сами
Записан
slonic
Гость
« Ответ #35 : 14-10-2005 10:38 » 

На USB визард установки нового устройства на другом порту хаба выдается  в том случае, если USB-устройство не имеет серийного номера (используется геограифическая адресация для енумерации). Соответственно в реестре создаются новые ветки для всех портов хабов. Если SN есть - установка однократная и в реестре одна ветка, енумерация по SN.
Уважаемый AlexANDor, большое спасибо за науку. Выличили свой девайс от проблемы с необходимостью снова устанавливать драйвер при перетыкании в другой USB порт.
Не подскажите: серийник обязательно должен быть 10-ти символьный?
Я посмотрел на все устройства компа, все серийники (и те что сгенирировала система, используя геограифическую адресацию) именно такие.


Кстати, по умолчанию разрешения на модификацию ветки HKLM\System\CurrentControlSet\Enum\ (как и некоторых других) нет даже у администратора, хотя он может предварительно установить себе такое разрешение.
а не подскажите как?
не могу мусор в реестре убить от предидущих эксперементов.
Записан
AlexANDor
Гость
« Ответ #36 : 14-10-2005 23:12 » 

Не подскажите: серийник обязательно должен быть 10-ти символьный?

С какой стати? В стандарте USB единственное ограничение - поле длины строкового дескриптора - один байт, то есть строка не более 126 (?) символов (поскольку она в unicode).

Цитата
Я посмотрел на все устройства компа, все серийники (и те что сгенирировала система, используя геограифическую адресацию) именно такие.

Чистое совпадение. В моем компе есть SN от 6 до 16 символов. Это личное дело производителя, он лишь должен обеспечить уникальность VID + PID + SN для каждого выпущенного изделия. Длина строки SN выбирается исходя из планируемого тиража изделия или по любым другим соображениям.

Цитата
а не подскажите как?
не могу мусор в реестре убить от предидущих эксперементов.

Вручную - в regedit: выбрать ветку - Правка - Разрешения. Из программы: использовать RegSetKeySecurity().
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #37 : 28-12-2005 23:12 » 

тут вот... кто ссылку новую кидал?
http://www.microsoft.com/whdc/driver/install/DIFxtls.mspx

Driver Install Frameworks Tools:

DIFxAPI that exports the following functions:

• DriverPackagePreinstall() <-----
• DriverPackageInstall()
• DriverPackageUninstall()
• DriverPackageGetPath()
 
не то ли самое лекарство?
сам толком не смотрел еще - только пару строк прочел.
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Страниц: 1 2 [Все]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines