AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Treiber installieren, starten, stoppen, deinstallieren
Thema durchsuchen
Ansicht
Themen-Optionen

Treiber installieren, starten, stoppen, deinstallieren

Ein Thema von Neotracer64 · begonnen am 17. Sep 2005 · letzter Beitrag vom 18. Sep 2005
Antwort Antwort
Seite 2 von 3     12 3      
Neotracer64

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

Re: Treiber installieren, starten, stoppen, deinstallieren

  Alt 18. Sep 2005, 01:19
Zitat:
Da ist es mehr als logisch zur undokumentierten zu greifen *kopfschüttel*
Heisst ja nicht, dass ich die jetz unbedingt benutzen will. Ich bin nur im Moment ein bisschen am rumexperimentieren. Dass ich da schnell an meine Grenzen stosse, ist vielleicht ein bisschen nervig, wenn ich dann eine "dumme" Frage stelle. Ich gebs ja zu....

Zitat:
Aber mal ehrlich, wozu fragst du eigentlich, wenn du dann doch eine andere (und zumal unzuverlässige) Methode benutzt?
siehe oben. Ich möcht halt nicht dumm sterben, mal so gesagt. *g*. Wenn ich Primzahlen rausfinden will, dann probier ich auch mehrere Methoden aus. Vlt hat die eine ja seine Vorzüge, wo jedoch ein Feature nicht dabei ist, was ich dann auch nicht brauche. Probier ich doch halt, spass wie es macht, alle Methoden mal aus.


Zitat:
Außerdem ist Greg Hoglund eine Koryphäe auf dem Gebiet und weiß was er mit undokumentierten Aufrufen erreichen kann (und will) und was nicht. Genau das fehlt dir (offensichtlich!)
Kann doch sein, dass es mit meinem krüppeligen HelloWorld-Treiber funktioniert oder nich
Ja es fehlt mir. Aber vlt hätte ich ja früher oder später entdeckt warum genau diese MEthode nicht so gut funktioniert. Aber wenn sie nichtmal funktioniert, dann bin ich auf andere angewiesen, ich alte Nervensäge

Dann entschuldige ich mich und gebe Ruhe
  Mit Zitat antworten Zitat
Neotracer64

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

Re: Treiber installieren, starten, stoppen, deinstallieren

  Alt 18. Sep 2005, 18:05
Da ich Schuldgefühle habe, dass ich eine "fiese" Methode benutzen wollte habe ich es auf normale Art und Weise versucht.
Dabei habe ich wieder Greg Hoglunds C-Code übersetzt.

Aber Guess What. Er funktioniert noch nicht so ganz ;(
Er scheitert schon beim öffnen des SC_Managers. (Ja ich hab Admin-Rechte).

Delphi-Quellcode:
uses ...,WinSvc;

...

function load_sysfile(DriverPath: String):boolean;
var
  sh, rh : SC_HANDLE;
  aPath,dummy,DriverName : PChar;
begin
  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;
Habt ihr eine Idee ?
  Mit Zitat antworten Zitat
Olli
(Gast)

n/a Beiträge
 
#13

Re: Treiber installieren, starten, stoppen, deinstallieren

  Alt 18. Sep 2005, 20:32
Zitat von Neotracer64:
Da ich Schuldgefühle habe, dass ich eine "fiese" Methode benutzen wollte habe ich es auf normale Art und Weise versucht.
Dabei habe ich wieder Greg Hoglunds C-Code übersetzt.
Die Methode ist ja okay

Kannst du mir mal sagen, ob das entsprechende Privileg zum Laden von Treibern/Diensten aktiviert ist?
  Mit Zitat antworten Zitat
Neotracer64

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

Re: Treiber installieren, starten, stoppen, deinstallieren

  Alt 18. Sep 2005, 21:26
Muss ich mir das in meinem Programm extra holen ? Mit token oder so ?
Weil ich kann mit dem programm INSTDRV.EXE eins installieren. Also ich habe das als Privileg.

Muss man vlt das SeDebugPrivlieg haben ? Oder wie heisst das da ?

Danke für deine Hilfe
  Mit Zitat antworten Zitat
Olli
(Gast)

n/a Beiträge
 
#15

Re: Treiber installieren, starten, stoppen, deinstallieren

  Alt 18. Sep 2005, 21:28
Zitat von Neotracer64:
Muss man vlt das SeDebugPrivlieg haben ? Oder wie heisst das da ?
SE_LOAD_DRIVER_NAME = 'SeLoadDriverPrivilege'
  Mit Zitat antworten Zitat
Robert Marquardt
(Gast)

n/a Beiträge
 
#16

Re: Treiber installieren, starten, stoppen, deinstallieren

  Alt 18. Sep 2005, 21:52
Treiber werden ueber Setup API bzw. Config Manager API gehandhabt.
Zusaetzlich gibt es noch die zentrale Funktion UpdateDriverForPlugAndPlayDevices, die merkwuerdigerweise keinem Teil-API zugeordnet ist.

Grundsaetzlich muss man erst mal verstehen was Setup-Klassen sind und was sie von Device-Klassen unterscheidet.
Die gesamte Treiberinstallation geschieht ueber INF-Files.
  Mit Zitat antworten Zitat
Olli
(Gast)

n/a Beiträge
 
#17

Re: Treiber installieren, starten, stoppen, deinstallieren

  Alt 18. Sep 2005, 21:59
Zitat von Robert Marquardt:
Treiber werden ueber Setup API bzw. Config Manager API gehandhabt.
Zusaetzlich gibt es noch die zentrale Funktion UpdateDriverForPlugAndPlayDevices, die merkwuerdigerweise keinem Teil-API zugeordnet ist.

Grundsaetzlich muss man erst mal verstehen was Setup-Klassen sind und was sie von Device-Klassen unterscheidet.
Die gesamte Treiberinstallation geschieht ueber INF-Files.
Wenn der Treiber ein virtueller Treiber ist, dürfte all dies ziemlich egal sein. Im Endeffekt reicht die SCM-API dann auch völlig aus, weil sie ursprünglich dafür konzipiert wurde. Die von dir genannten APIs kamen ja quasi erst später (2000) hinzu.
  Mit Zitat antworten Zitat
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
Olli
(Gast)

n/a Beiträge
 
#19

Re: Treiber installieren, starten, stoppen, deinstallieren

  Alt 18. Sep 2005, 22:14
Sorry, nicht eher gesehen. Auf jeden Fall gibt es einen kleinen Fehler. So ists richtig:

Delphi-Quellcode:
  sh := OpenSCManager(nil,nil,SC_MANAGER_ALL_ACCESS);
  if (sh = 0) then
    begin
      MessageBox(0,'Fehler beim öffnen des SC_MANAGERS! ','Error Handling',MB_ICONERROR);
      // Hier kannste mit GetLastError() testen!!!
      result := false;
      Exit;
    end;
  Mit Zitat antworten Zitat
Neotracer64

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

Re: Treiber installieren, starten, stoppen, deinstallieren

  Alt 18. Sep 2005, 22:24
Gute Idee!

Aber nach dem ich dieses Stück wie folgt geändert habe war ich verwirrter als vorher :

Delphi-Quellcode:
sh := OpenSCManager(nil,nil,SC_MANAGER_ALL_ACCESS);
  if not sh > 0 Then
    begin
      MessageBox(0,Pchar('OpenSCManager : '+SyserrorMessage(GetLastError)),'Error Handling',MB_ICONERROR);
      result := false;
      Exit;
    end;
Die MessageBox sagt : " OpenSCManager : Der Vorgang wurde erfolgreich beendet "

Wie kann der Vorgang erfolgreich beendet worden sein, wenn der Handle leer ist ? :S
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:11 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz