Registriert seit: 27. Okt 2004
292 Beiträge
Delphi 7 Professional
|
Re: Treiber installieren, starten, stoppen, deinstallieren
18. Sep 2005, 22:09
So. Ich habe die Funktion etwas erweitert.
Die Funktion EnablePrivileg habe ich aus :
http://www.delphipraxis.net/internal...light=privileg
Delphi-Quellcode:
function load_sysfile(DriverPath: String):boolean;
var
sh, rh : SC_HANDLE;
aPath,dummy,DriverName : PChar;
PreviousState : Boolean;
begin
If not EnablePrivilege('SeLoadDriverPrivilege',False,PreviousState) = ERROR_SUCCESS Then
begin
MessageBox(0,'Fehler beim akquirieren des SeLoadDriverPrivileges!','Error Handling',MB_ICONERROR);
result := false;
Exit;
end;
dummy := '';
sh := OpenSCManager(nil,nil,SC_MANAGER_ALL_ACCESS);
if not sh > 0 Then
begin
MessageBox(0,'Fehler beim öffnen des SC_MANAGERS! ','Error Handling',MB_ICONERROR);
result := false;
Exit;
end;
aPath := Pchar(DriverPath);
DriverName := Pchar(ExtractFileName(DriverPath));
rh :=CreateService(sh,
DriverName,
DriverName,
SERVICE_ALL_ACCESS,
SERVICE_KERNEL_DRIVER,
SERVICE_DEMAND_START,
SERVICE_ERROR_NORMAL,
aPath,
nil,
nil,
nil,
nil,
nil);
if not rh > 0 Then
begin
if GetLastError = ERROR_SERVICE_EXISTS Then
begin
MessageBox(0,'Service existiert schon!','Error Handling',MB_ICONERROR);
rh := OpenService(sh, Pchar(DriverName),SERVICE_ALL_ACCESS);
if not rh > 0 Then
begin
MessageBox(0,'Vorhandener Service kann nicht geöffnet werden!','Error Handling',MB_ICONERROR);
CloseServiceHandle(sh);
result := false;
Exit;
end;
end else
begin
MessageBox(0,'Fehler beim erstellen des Services!','Error Handling',MB_ICONERROR);
CloseServiceHandle(sh);
result := false;
Exit;
end;
end;
if rh > 0 Then
begin
if StartService(rh,0,dummy) Then
begin
if GetLastError = ERROR_SERVICE_ALREADY_RUNNING Then
begin
MessageBox(0,'Service läuft schon!','Error Handling',MB_ICONINFORMATION);
result := True;
end else
begin
MessageBox(0,'Service lässt sich nicht starten!','Error Handling',MB_ICONERROR);
CloseServiceHandle(rh);
CloseServiceHandle(sh);
result := false;
Exit;
end;
end;
result := True;
end;
Dann habe ich getestet ob ich auch wirklich das privileg danach habe:
Delphi-Quellcode:
var
Luid: TLargeInteger;
...
load_sysfile('HelloWorld.sys');
If LookupPrivilegeValue(nil, 'SeLoadDriverPrivilege', Luid) Then ShowMessage('ja');
Es kommt immernoch:Fehler beim öffnen des SC_MANAGERS!
Und danach kommt die ShowMessage mit "ja". Also müsste ich das privileg doch haben oder ?
|