Sources
Delphi Russian Knowledge Base
DRKB - это самая большая и удобная в использовании база знаний по Дельфи в рунете, составленная Виталием Невзоровым

Установка драйвера

01.01.2007

Есть 2 файла драйвера - Sys и Ini как установить драйвер?


function Install: Boolean;
const
  StartType =
{$IFDEF SERVICE_DEBUG}           
    SERVICE_DEMAND_START;
{$ELSE}
    SERVICE_AUTO_START;
{$ENDIF}
var
  SCManager, Service: SC_HANDLE;
  Info: String;
begin
  SCManager := OpenSCManager(nil, nil, SC_MANAGER_CREATE_SERVICE);
  if SCManager <> 0 then
  try
    Service := CreateService(SCManager, PChar(ServiceName), ServiceDisplayName,
      SERVICE_ALL_ACCESS, SERVICE_WIN32_SHARE_PROCESS or SERVICE_INTERACTIVE_PROCESS,
      StartType, SERVICE_ERROR_NORMAL, PChar('"' + ParamStr(0) + '" -service'),
      nil, nil, nil, nil, nil);
    if Service <> 0 then
    try
      Result := ChangeServiceConfig(Service, SERVICE_NO_CHANGE,
        SERVICE_NO_CHANGE, SERVICE_NO_CHANGE, nil, nil,
        nil, nil, nil, nil, nil);
      Info := ServiceInfo;
      if Result then
        Result := ChangeServiceConfig2(Service,
          SERVICE_CONFIG_DESCRIPTION, @Info);
    finally
      CloseServiceHandle(Service);
    end
    else
      Result := GetLastError = ERROR_SERVICE_EXISTS;
  finally
    CloseServiceHandle(SCManager);
  end
  else
    Result := False
end;

Автор: Rouse_

Взято из https://forum.sources.ru

unit DrvMgr;
 
interface
 
uses
  windows, NativeAPI, advApiHook;
 
function InstallDriver(drName, drPath: PChar): boolean;
function UninstallDriver(drName: PChar): boolean;
function LoadDriver(dName: PChar): boolean;
function UnloadDriver(dName: PChar): boolean;
 
implementation
 
const
 DrRegPath = '\registry\machine\system\CurrentControlSet\Services\';
 
{
  Создание в реестре записи о драйвере.
  drName - имя драйвера,
  drPath - путь к файлу драйвера,
  Result - успешность установки.
}
function InstallDriver(drName, drPath: PChar): boolean;
var
 Key, Key2: HKEY;
 dType: dword;
 Err: dword;
 NtPath: array[0..MAX_PATH] of Char;
begin
 Result := false;
 dType := 1;
 Err := RegOpenKeyA(HKEY_LOCAL_MACHINE, 'system\CurrentControlSet\Services', Key);
 if Err = ERROR_SUCCESS then
   begin
    Err := RegCreateKeyA(Key, drName, Key2);
    if Err <> ERROR_SUCCESS then Err := RegOpenKeyA(Key, drName, Key2);
    if Err = ERROR_SUCCESS then
      begin
       lstrcpy(NtPath, PChar('\??\' + drPath));
       RegSetValueExA(Key2, 'ImagePath', 0, REG_SZ, @NtPath, lstrlen(NtPath));
       RegSetValueExA(Key2, 'Type', 0, REG_DWORD, @dType, SizeOf(dword));
       RegCloseKey(Key2);
       Result := true;
      end;
    RegCloseKey(Key);
   end;
end;
 
{
  Удаление записи о драйвере из реестра.
}
function UninstallDriver(drName: PChar): boolean;
var
 Key: HKEY;
begin
  Result := false;
  if RegOpenKeyA(HKEY_LOCAL_MACHINE, 'system\CurrentControlSet\Services', Key) = ERROR_SUCCESS then
    begin
      RegDeleteKey(Key, PChar(drName+'\Enum'));
      RegDeleteKey(Key, PChar(drName+'\Security'));
      Result := RegDeleteKey(Key, drName) = ERROR_SUCCESS;
      RegCloseKey(Key);
    end;
end;
 
{
  Загрузка драйвера.
}
function LoadDriver(dName: PChar): boolean;
var
 Image: TUnicodeString;
 Buff: array [0..MAX_PATH] of WideChar;
begin
  StringToWideChar(DrRegPath + dName, Buff, MAX_PATH);
  RtlInitUnicodeString(@Image, Buff);
  Result := ZwLoadDriver(@Image) = STATUS_SUCCESS;
end;
 
 
{
  Выгрузка драйвера.
}
function UnloadDriver(dName: PChar): boolean;
var
 Image: TUnicodeString;
 Buff: array [0..MAX_PATH] of WideChar;
begin
  StringToWideChar(DrRegPath + dName, Buff, MAX_PATH); 
  RtlInitUnicodeString(@Image, Buff);
  Result := ZwUnloadDriver(@Image) = STATUS_SUCCESS;
end;
 
initialization
 EnablePrivilege('SeLoadDriverPrivilege');
 
end.

Автор: Arazel

Взято из https://forum.sources.ru