Вот тебе еще пример... до кучи: Функции загрузки и выгрузки драйверов для NT через натив .
- Сами функции:Код | 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: Не каждый драйвер... можно выгрузить |