Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.10.2009, 12:53   #1
hander
Новичок
Джуниор
 
Регистрация: 02.10.2009
Сообщений: 3
По умолчанию Установка inf-драйвера

Добрый день.
Необходимо программно установить драйвер usb-устройства состоящий из двух файлов: inf и sys, так, чтобы при подключении устройства система обнаруживала драйвер и устанавливала его.
Сам драйвер, если его устанавливать через диспетчер устройств руками, работает как надо. А вот, если например в разделе реестра HKEY_LOCAL_MACHINE/Software/Microsoft/Windows/Current Version переменной DevicePath добавить путь размещения файлов драйвера, то следует ошибка установки.
Для установки драйвера выполняется следующий код, но после его выполнения, при подключении устройства, система драйвер не находит вообще. Ошибок никаких не возвращается.

Код:
procedure TfInstall.btnInstallClick(Sender: TObject);
var
  pi: TProcessInformation;
  si: TStartupInfo;
  execFile,cmdLine,workDir:string;
  sINFFile:string;
  ErrCode:integer;
begin
  ErrCode := 0;
  try
    sINFFile:=ExtractFilePath(Application.ExeName)+'driver.inf';
    cmdLine := 'setupapi.dll,InstallHinfSection ClassInstall32 128 ' + sINFFile;
    execFile := 'RUNDLL32.EXE';
    workDir := ExtractFilePath(Application.ExeName);

    FillChar(si,SizeOf(si), #0);
    si.cb := SizeOf(si);
    si.wShowWindow := SW_NORMAL;
    si.dwFlags     := STARTF_USESHOWWINDOW;

    if CreateProcess(nil,PChar(execFile + ' ' + cmdLine),nil,nil,false,0,nil,PChar(workDir),si,pi) then
    begin
      CloseHandle(pi.hProcess);
      CloseHandle(pi.hThread);
    end
    else
      ErrCode:=GetLastError;

    if (ErrCode<>0) then
      Raise Exception.Create('Код ошибки:'+IntToStr(ErrCode));

    Close;
  except
    on E:exception do
      Application.MessageBox(PChar('Ошибка установки драйвера'#13#10+E.Message),PChar('Ошибка'),MB_OK);
  end;
end;
hander вне форума Ответить с цитированием
Старый 02.10.2009, 13:08   #2
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

Цитата:
например в разделе реестра HKEY_LOCAL_MACHINE/Software/Microsoft/Windows/Current Version переменной DevicePath добавить путь размещения файлов драйвера, то следует ошибка установки
- почему-бы просто не скопировать в папку windows/inf ваши драйвера и не лезть в реестр?
- *.inf - текстовый файл и содержит пути к самому драйверу sys
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 02.10.2009, 13:15   #3
hander
Новичок
Джуниор
 
Регистрация: 02.10.2009
Сообщений: 3
По умолчанию

Была такая мысль, поместить inf в %SystemRoot%\inf, а sys в %SystemRoot%\System32\drivers, но опять вылетела ошибка. Работает такой вариант только когда оба файла лежат рядом в папке Inf, что по-моему не очень правильно.
hander вне форума Ответить с цитированием
Старый 02.10.2009, 13:58   #4
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

Цитата:
var
hSCMan, hService, hDevice : SC_HANDLE;
lpServiceArgVectors : PChar;
F:File;
const
DriverName='giveio';
begin
lpServiceArgVectors:=nil;
hSCMan:=OpenSCManager(Nil,Nil,SC_MA NAGER_ALL_ACCESS);
hService:=CreateService(hSCMan,'giv eio','giveio',SERVICE_ALL_ACCESS, SERVICE_KERNEL_DRIVER,
SERVICE_DEMAND_START, SERVICE_ERROR_NORMAL,PChar(ExtractF ilePath(ParamStr(0))+'giveio.sys'),
nil,nil,nil,nil,nil);
If hService<>0 then CloseServiceHandle(hService);
hService:=OpenService(hSCMan,'givei o',SERVICE_ALL_ACCESS);
If hService<>0 then
begin
StartService(hService,0,PChar(lpSer viceArgVectors));
CloseServiceHandle(hService);
end;
hDevice:=CreateFile('\\.\giveio',GE NERIC_READ or GENERIC_WRITE,0,PSECURITY_DESCRIPTO R(nil),OPEN_EXISTING,FILE_ATTRIBUTE _NORMAL,0);
CloseHandle(hDevice);
end;
- попробуйте по аналогии http://raxp.radioliga.com/cnt/s.php?p=vm.pdf
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
установка драйвера Betty Операционные системы общие вопросы 3 25.08.2009 17:55
Autorun.inf Lime Безопасность, Шифрование 14 14.03.2009 21:51
Установка драйвера на устройство SigmaTel STAC9274D zotox Компьютерное железо 2 11.12.2008 00:43
+INF timehascome Общие вопросы Delphi 8 19.10.2008 21:43
autorun.inf 4444 Помощь студентам 20 15.04.2008 21:03