Einzelnen Beitrag anzeigen

Neotracer64

Registriert seit: 27. Okt 2004
292 Beiträge
 
Delphi 7 Professional
 
#18

Re: Treiber installieren, starten, stoppen, deinstallieren

  Alt 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 ?
  Mit Zitat antworten Zitat