Есть самодельное 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 (ибо его функционал конечно избыточен)? С нуля если честно вникать не хотелось во все эти тонкости, хотя видимо придется
вот для примера скрипт инсталятора для 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