Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Установка драйвера, Программно (де-) инсталлировать драйвер 
:(
    Опции темы
ViKT0R
Дата 1.3.2005, 06:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 1.3.2005

Репутация: нет
Всего: нет



Люди, помогите smile
Есть в MSDN-е пример драйвера, дающего возможность сделать виртуальный RAM-диск.
Его установка и настройка расписана подробно, однако там это делается через панель управления. Я уже второй день ищу способ "программной" установки. То есть есть два файла: собственно, драйвер (.sys) и инструкции (.inf).
Кто-нибудь знает, как сделать "лоадер" - прогу, загружающую/выгружающую данный драйвер, чтобы каждый раз не мучаться smile с установкой оборудования.
smile
PM MAIL   Вверх
Alex
Дата 1.3.2005, 10:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4147
Регистрация: 25.3.2002
Где: Москва

Репутация: 80
Всего: 162



Плохо ищите: http://vingrad.ru/DELPHI-DLP-001096


--------------------
Написать можно все - главное четко представлять, что ты хочешь получить в конце. 
PM Skype   Вверх
Alex
Дата 1.3.2005, 10:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4147
Регистрация: 25.3.2002
Где: Москва

Репутация: 80
Всего: 162



Перенесено из раздела Дельфи


--------------------
Написать можно все - главное четко представлять, что ты хочешь получить в конце. 
PM Skype   Вверх
Girder
Дата 1.3.2005, 11:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй 2
***


Профиль
Группа: Участник Клуба
Сообщений: 1993
Регистрация: 12.5.2004

Репутация: 31
Всего: 155



Вот тебе еще пример... до кучи: Функции загрузки и выгрузки драйверов для NT через натив smile .

- Сами функции:
Код
uses WinSvc;

const
sRootServices='SYSTEM\CurrentControlSet\Services\';

type
UnicodeString=record
 Length:Word;
 MaximumLength:Word;
 Buffer:WideString;
end;
TFuncDriver=function(var DriverServiceName:UnicodeString):DWord; stdcall;

function RegDeleteKeyAll(RootKey:HKey;SubKey:string):Boolean;
const BufSize=2048;
var Index:DWord;
   hSubKey:HKey;
   lpName:array [0..BufSize] of char;
   NameSize:DWord;
   LWT:_FileTime;
begin
Result:=true;
RegDeleteKey(RootKey,PChar(SubKey));
if RegOpenKeyEx(RootKey,PChar(SubKey),0,KEY_ALL_ACCESS,hSubKey)=ERROR_SUCCESS then
 begin
  Result:=false;
  Index:=0;
  NameSize:=BufSize;
  while RegEnumKeyEx(hSubKey,Index,PChar(@lpName),NameSize,nil,nil,nil,PFileTime(@LWT))=ERROR_SUCCESS do
   begin
    Result:=true and RegDeleteKeyAll(hSubKey,Copy(lpName,0,NameSize));
    if Result=false then inc(Index);
    NameSize:=BufSize;
   end;
  RegCloseKey(hSubKey);
  if (Result)and(RegDeleteKey(RootKey,PChar(SubKey))<>ERROR_SUCCESS) then Result:=false;
 end;
end;

function NTLoadDriver(const DEVICE_NAME,BinaryPathName:string; DriverType:DWord; var Err:DWord):Boolean;
var ErrOld:DWord;
   NTDLL:DWord;
   LoadDriver:TFuncDriver;
   DSN:UnicodeString;
   KeyDevice:HKey;
   Disposition,t:DWord;
   sDriver:string;
begin
Err:=ERROR_SUCCESS;
Result:=false;
if (DriverType<>SERVICE_KERNEL_DRIVER)and(DriverType<>SERVICE_FILE_SYSTEM_DRIVER) then exit;
ErrOld:=SetErrorMode(SEM_FAILCRITICALERRORS or SEM_NOOPENFILEERRORBOX);
NTDLL:=LoadLibrary('ntdll.dll');
if NTDLL<>0 then
 begin
  LoadDriver:=GetProcAddress(NTDLL,'NtLoadDriver');
  if Assigned(LoadDriver) then
   begin
    RegDeleteKeyAll(HKEY_LOCAL_MACHINE,sRootServices+DEVICE_NAME);
    Err:=RegCreateKeyEx(HKEY_LOCAL_MACHINE,PChar(sRootServices+DEVICE_NAME),0,nil,
                        REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,nil,KeyDevice,@Disposition);
    if Err=ERROR_SUCCESS then
     begin
      t:=DriverType;
      RegSetValueEx(KeyDevice,PChar('Type'),0,REG_DWORD,@t,SizeOf(t));
      t:=SERVICE_ERROR_NORMAL;
      RegSetValueEx(KeyDevice,PChar('ErrorControl'),0,REG_DWORD,@t,SizeOf(t));
      t:=SERVICE_DEMAND_START;
      RegSetValueEx(KeyDevice,PChar('Start'),0,REG_DWORD,@t,SizeOf(t));
      sDriver:='\??\'+trim(BinaryPathName);
      RegSetValueEx(KeyDevice,PChar('ImagePath'),0,REG_SZ,PChar(sDriver),Length(sDriver));
      RegCloseKey(KeyDevice);
      DSN.Buffer:='\Registry\Machine\'+sRootServices+DEVICE_NAME;
      DSN.Length:=Length(DSN.Buffer)*SizeOf(WideChar);
      DSN.MaximumLength:=DSN.Length+SizeOf(WideChar);
      Err:=LoadDriver(DSN);
      if Err=ERROR_SUCCESS then Result:=true;
     end;
   end else Err:=GetLastError();
  FreeLibrary(NTDLL);
 end else Err:=GetLastError();
SetErrorMode(ErrOld);
end;

function NTUnloadDriver(const DEVICE_NAME:string; DriverType:DWord; var Err:DWord):Boolean;
var ErrOld:DWord;
   NTDLL:DWord;
   UnloadDriver:TFuncDriver;
   DSN:UnicodeString;
   KeyDevice:HKey;
   Disposition,t:DWord;
begin
Result:=false;
Err:=ERROR_SUCCESS;
ErrOld:=SetErrorMode(SEM_FAILCRITICALERRORS or SEM_NOOPENFILEERRORBOX);
NTDLL:=LoadLibrary('ntdll.dll');
if NTDLL<>0 then
 begin
  UnloadDriver:=GetProcAddress(NTDLL,'NtUnloadDriver');
  if Assigned(UnloadDriver) then
   begin
    RegDeleteKeyAll(HKEY_LOCAL_MACHINE,sRootServices+DEVICE_NAME);
    Err:=RegCreateKeyEx(HKEY_LOCAL_MACHINE,PChar(sRootServices+DEVICE_NAME),0,nil,
                        REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,nil,KeyDevice,@Disposition);
    if Err=ERROR_SUCCESS then
     begin
      t:=DriverType;
      RegSetValueEx(KeyDevice,PChar('Type'),0,REG_DWORD,@t,SizeOf(t));
      RegCloseKey(KeyDevice);
      DSN.Buffer:='\Registry\Machine\'+sRootServices+DEVICE_NAME;
      DSN.Length:=Length(DSN.Buffer)*SizeOf(WideChar);
      DSN.MaximumLength:=DSN.Length+SizeOf(WideChar);
      Err:=UnloadDriver(DSN);
      if Err=ERROR_SUCCESS then
       begin
        Result:=true;
        RegDeleteKeyAll(HKEY_LOCAL_MACHINE,sRootServices+DEVICE_NAME);
       end;
     end;                        
   end else Err:=GetLastError();
  FreeLibrary(NTDLL);
 end else Err:=GetLastError();
SetErrorMode(ErrOld);
end;


- Пример использования:
Код
procedure TForm1.Button1Click(Sender: TObject);
var i:DWord;
begin
if NTLoadDriver('gwiopm','E:\gwiopm.sys',SERVICE_KERNEL_DRIVER,i) then
 ShowMessage('Драйвер загружен') else ShowMessage('Не могу загрузить драйвер, ошибка: '+IntToStr(i));
end;

procedure TForm1.Button2Click(Sender: TObject);
var i:DWord;
begin
if NTUnloadDriver('gwiopm',SERVICE_KERNEL_DRIVER,i) then
 ShowMessage('Драйвер выгружен') else ShowMessage('Не могу выгрузить драйвер, ошибка: '+IntToStr(i));
end;


PS: Не каждый драйвер... можно выгрузить smile

Это сообщение отредактировал(а) Girder - 1.3.2005, 11:23


--------------------
Как слышим, так и пишим.
Истина где-то там...
PM   Вверх
ViKT0R
Дата 1.3.2005, 18:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 1.3.2005

Репутация: нет
Всего: нет



Большое спасибо! smile smile smile
PM MAIL   Вверх
bartram
Дата 1.3.2005, 22:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1606
Регистрация: 22.2.2004
Где: Russia, Samara

Репутация: 3
Всего: 29



Girder, а это будет работать для дров типа *.vxd?

Это сообщение отредактировал(а) bartram - 1.3.2005, 22:11


--------------------
В каждом из нас спит гений, но с каждым днем все крепче ;-)
bartram.ru
Twitter
user posted image 

PM MAIL ICQ   Вверх
Girder
Дата 1.3.2005, 22:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй 2
***


Профиль
Группа: Участник Клуба
Сообщений: 1993
Регистрация: 12.5.2004

Репутация: 31
Всего: 155



Цитата(bartram @ 1.3.2005, 22:10)
Girder, а это будет работать для дров типа *.vxd?
Нет smile ... А наX? smile
Для vxd: CreateFile и CloseHandle и усё... smile



--------------------
Как слышим, так и пишим.
Истина где-то там...
PM   Вверх
bartram
Дата 1.3.2005, 22:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1606
Регистрация: 22.2.2004
Где: Russia, Samara

Репутация: 3
Всего: 29



Цитата(Girder @ 1.3.2005, 22:16)
Для vxd: CreateFile и CloseHandle и усё... smile

Girder, плиз приведи код очень надо smile


--------------------
В каждом из нас спит гений, но с каждым днем все крепче ;-)
bartram.ru
Twitter
user posted image 

PM MAIL ICQ   Вверх
Girder
Дата 1.3.2005, 23:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй 2
***


Профиль
Группа: Участник Клуба
Сообщений: 1993
Регистрация: 12.5.2004

Репутация: 31
Всего: 155



Ну... например вот так:
Код
var hDriver:DWord;
...
function LoadDriverW9X(BPN:string):Boolean;
var s_Old,s_FN:string;
begin
Result:=false;
if Win32Platform<>VER_PLATFORM_WIN32_NT then
 begin
  BPN:=trim(BPN);
  s_FN:='\\.\'+ExtractFileName(BPN);
  s_Old:=SetCurrDir(ExtractFilePath(BPN));
  hDriver:=CreateFile(PChar(s_FN),0,0,PSECURITY_DESCRIPTOR(nil),0,FILE_FLAG_DELETE_ON_CLOSE,0);
  SetCurrDir(s_Old);
  if hDriver<>INVALID_HANDLE_VALUE then Result:=true;
 end;
end;

procedure CloseDriverW9X();
begin
if hDriver<>INVALID_HANDLE_VALUE then
 while CloseHandle(hDriver) do;
end;


Всмомогательные функции:
Код
function GetCurrDir():string;
var s:string;
   i,j:DWord;
begin
i:=0;
Result:='';
repeat                  
 i:=i+Max_Path;
 SetLength(s,i);
 j:=GetCurrentDirectory(i,PChar(s));
 if i<>j then Result:=Copy(s,1,j);
 SetLength(s,0);
until (i<>j);
if j=0 then Result:=ParamStr(0);
i:=Length(Result);
if (i>1)and(Result[i]<>'\') then Result:=Result+'\';
end;

function PathToFullPath(const Path:string):string;
var NewPath,t:string;
   i:integer;
begin
t:=trim(Path);
Result:=t;
NewPath:=ExtractFileDrive(t);
if (Length(NewPath)<2) then
 begin
  if Length(t)>0 then
   begin
    i:=1;
    while (i<=Length(t))and((t[i]=':')or(t[i]='\')) do inc(i);
    if i<>1 then NewPath:=copy(t,i,Length(t));
   end;
  NewPath:=GetCurrDir()+t;
 end else NewPath:=t;
i:=Length(NewPath);
if i>0 then
 begin
  if (i>1)and(NewPath[i]='\') then NewPath[i]:=#0;
  Result:=trim(NewPath);
 end;
end;

function SetCurrDir(const Path:string):string;
var NewPath:string;
begin
Result:=GetCurrDir();
NewPath:=PathToFullPath(Path);
if NewPath<>'' then SetCurrentDirectory(PChar(NewPath));
end;


Пример использования:
Код
procedure TForm1.Button1Click(Sender: TObject);
begin
if LoadDriverW9X('C:\Windows\SYSTEM\VJOYD.VXD') then
 begin
  ShowMessage('Ok!');
  CloseDriverW9X;
 end else
 ShowMessage('Обломс!');
end;


PS: Ясно дело... что ентот код не для каждого драйвера VXD подойдет.
А что за драйвер?

PS2: в некоторых случаях... для удаления из памяти можно использовать Windows.DeleteFile('\\.\nnn.vxd')


Это сообщение отредактировал(а) Girder - 2.3.2005, 13:15


--------------------
Как слышим, так и пишим.
Истина где-то там...
PM   Вверх
bartram
Дата 2.3.2005, 19:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1606
Регистрация: 22.2.2004
Где: Russia, Samara

Репутация: 3
Всего: 29



Цитата(Girder @ 1.3.2005, 23:46)
А что за драйвер?

Драйвер очень интересный smile я таких дров ещё не видел, вот скачал хочу опробовать, как раз и твою функцию опробую smile Еди хочеш по подробнее узнать что за драйвер пиши в PM smile

Цитата(Girder @ 1.3.2005, 23:46)
PS: Ясно дело... что ентот код не для каждого драйвера VXD подойдет.

А почему?



--------------------
В каждом из нас спит гений, но с каждым днем все крепче ;-)
bartram.ru
Twitter
user posted image 

PM MAIL ICQ   Вверх
Гость_ViKT0R
Дата 6.3.2005, 15:25 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











  Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0664 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.