Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Установка драйвера


Автор: ViKT0R 1.3.2005, 06:19
Люди, помогите smile
Есть в MSDN-е пример драйвера, дающего возможность сделать виртуальный RAM-диск.
Его установка и настройка расписана подробно, однако там это делается через панель управления. Я уже второй день ищу способ "программной" установки. То есть есть два файла: собственно, драйвер (.sys) и инструкции (.inf).
Кто-нибудь знает, как сделать "лоадер" - прогу, загружающую/выгружающую данный драйвер, чтобы каждый раз не мучаться smile с установкой оборудования.
smile

Автор: Alex 1.3.2005, 10:06
Плохо ищите: http://vingrad.ru/DELPHI-DLP-001096

Автор: Alex 1.3.2005, 10:06
Перенесено из раздела Дельфи

Автор: Girder 1.3.2005, 11:19
Вот тебе еще пример... до кучи: Функции загрузки и выгрузки драйверов для 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

Автор: ViKT0R 1.3.2005, 18:24
Большое спасибо! smile smile smile

Автор: bartram 1.3.2005, 22:10
Girder, а это будет работать для дров типа *.vxd?

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

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

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

Автор: Girder 1.3.2005, 23:46
Ну... например вот так:
Код
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')

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

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

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

А почему?

Автор: Гость_ViKT0R 6.3.2005, 15:25
http://www.rsdn.ru/article/delphi/kmdelphi.xml

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)