![]() |
Treiber installieren, starten, stoppen, deinstallieren
Zuerst einmal: Ich weiss, dass man keine Treiber mit Delphi programmieren kann.
Darum geht es auch NICHT. Ich habe schon einen Treiber in Form einer sys-Datei. (geschrieben in C++ und kompiliert mit dem DDK) Diese möchte ich mit Delphi installieren, starten, stoppen und deinstallieren können. Komischerweise habe ich dazu nichts gefunden hier im Forum. Aber es müsste doch eigentlich möglich sein oder ? Funktioniert das so ähnlich wie bei Diensten ? Ach ja: Damit das hier nicht in die Falsche Richtung läuft. Ich möchte keinerlei Alternativen sehen. Ich möchte nur wissen ob es in Delphi geht und wenn ja wie. Ich bin also in der Lage ein klares Nein zu akzeptieren. (Natürlich nur wenn es wahrheitsgemäss ist) Danke schonmal :) :dp: |
Re: Treiber installieren, starten, stoppen, deinstallieren
Zitat:
Guck mal in mein Service Tut: ![]() Dienste und Treiber werden auf die gleiche Art und Weise installiert, gestartet und gestoppt usw. |
Re: Treiber installieren, starten, stoppen, deinstallieren
Zitat:
Danke für das TUT, Olli :cyclops: |
Re: Treiber installieren, starten, stoppen, deinstallieren
Zitat:
|
Re: Treiber installieren, starten, stoppen, deinstallieren
[quote="Olli"]
Zitat:
|
Re: Treiber installieren, starten, stoppen, deinstallieren
Zitat:
|
Re: Treiber installieren, starten, stoppen, deinstallieren
Schau mal hier:
![]() Es sollte sich also über die allbekannte und von vielen gehasste Registry realisieren lassen. (ot: hasse sie nicht, finde sie sehr sinnvoll) |
Re: Treiber installieren, starten, stoppen, deinstallieren
Zitat:
|
Re: Treiber installieren, starten, stoppen, deinstallieren
Ich habe noch eine Quick&Dirty Variante gefunden. Leider lässt sich der Treiber ohne Neustart nicht mehr entladen.
Und geklappt hat es auch noch nicht, da ich wahrscheinlich zu blöd bin C++ in Delphi zu übersetzen. Ich habs trotzdem ma versucht: Original C-Code: Zitat:
Delphi-Quellcode:
Es kommt leider immer false raus :(
uses ...JwaNative, JwaNTStatus;
... function load_sysfile: boolean; var GregsImage: SYSTEM_LOAD_AND_CALL_IMAGE; daPath: PWideChar; begin daPath := 'HelloWorld.sys'; RtlInitUnicodeString(@GregsImage.ModuleName,daPath); if ZwSetSystemInformation(SystemLoadAndCallImage,@GregsImage,sizeof(SYSTEM_LOAD_AND_CALL_IMAGE))= STATUS_SUCCESS Then result := True Else result := false; end; |
Re: Treiber installieren, starten, stoppen, deinstallieren
Wozu das gut sein soll, wirst du wohl selber wissen, denn es existiert ja "nur" eine dokumentierte Methode. Da ist es mehr als logisch zur undokumentierten zu greifen *kopfschüttel*
Die Native API zeigt Fehler an, indem der Wert negativ ist. Nur weil der Rückgabewert ungleich STATUS_SUCCESS sagt das nicht, daß es einen Fehler gab. Wir haben in JwaNative.pas ja durchaus auch die Makros als Funktionen drin, wenn ich mich recht entsinne. Ansonsten checkst du eben selber auf ">= STATUS_SUCCESS". Aber mal ehrlich, wozu fragst du eigentlich, wenn du dann doch eine andere (und zumal unzuverlässige) Methode benutzt? EDIT: Ach ja, ob ein Treiber entladen werden kann, hängt a.) vom Typ des Treibers und b.) von seiner Konzeption ab. Also selbst wenn der Treibertyp es erlaubt entladen zu werden, muß es der Treiber noch nicht erlauben. Der Code enthält übrigens keinerlei C++-Features, sondern nur C. 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!) |
Re: Treiber installieren, starten, stoppen, deinstallieren
Zitat:
Zitat:
Zitat:
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 :wall: Dann entschuldige ich mich und gebe Ruhe :wink: |
Re: Treiber installieren, starten, stoppen, deinstallieren
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:
Habt ihr eine Idee ?
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; |
Re: Treiber installieren, starten, stoppen, deinstallieren
Zitat:
Kannst du mir mal sagen, ob das entsprechende Privileg zum Laden von Treibern/Diensten aktiviert ist? |
Re: Treiber installieren, starten, stoppen, deinstallieren
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 |
Re: Treiber installieren, starten, stoppen, deinstallieren
Zitat:
|
Re: Treiber installieren, starten, stoppen, deinstallieren
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. |
Re: Treiber installieren, starten, stoppen, deinstallieren
Zitat:
|
Re: Treiber installieren, starten, stoppen, deinstallieren
So. Ich habe die Funktion etwas erweitert.
Die Funktion EnablePrivileg habe ich aus : ![]()
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:
Es kommt immernoch:Fehler beim öffnen des SC_MANAGERS!
var
Luid: TLargeInteger; ... load_sysfile('HelloWorld.sys'); If LookupPrivilegeValue(nil, 'SeLoadDriverPrivilege', Luid) Then ShowMessage('ja'); Und danach kommt die ShowMessage mit "ja". Also müsste ich das privileg doch haben oder ? |
Re: Treiber installieren, starten, stoppen, deinstallieren
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; |
Re: Treiber installieren, starten, stoppen, deinstallieren
Gute Idee! :)
Aber nach dem ich dieses Stück wie folgt geändert habe war ich verwirrter als vorher :
Delphi-Quellcode:
Die MessageBox sagt : " OpenSCManager : Der Vorgang wurde erfolgreich beendet "
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; Wie kann der Vorgang erfolgreich beendet worden sein, wenn der Handle leer ist ? :S |
Re: Treiber installieren, starten, stoppen, deinstallieren
Könntest du bitte mal genau hinschauen und meine IF-Bedingung übernehmen statt deine Bedingung weiter zu nutzen. Danke! :roll:
|
Re: Treiber installieren, starten, stoppen, deinstallieren
Autsch. Sorry, jetz hab ich nicht genau hingeguckt.
Ich habe deswegen jetzt selber noch etwas genauer hingeschaut und ein paar Sachen verbessert. Es klappt jetz :D ich weiss es nicht ob es überhaupt nochmal nützlich für jemanden sein könnte. Vlt wäre ein Post in der CodeLibrary nicht verkehrt ? Naja wens interessiert hier:
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 (sh = 0) then begin MessageBox(0,Pchar('OpenSCManager : '+SyserrorMessage(GetLastError)),'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 (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 (rh=0) Then begin MessageBox(0,Pchar('Vorhandener Service kann nicht geöffnet werden! : ' + SysErrorMessage(GetLastError)),'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 not (rh=0) Then begin if not 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,Pchar('Service lässt sich nicht starten: ' + SysErrorMessage(GetLastError)),'Error Handling',MB_ICONERROR); CloseServiceHandle(rh); CloseServiceHandle(sh); result := false; Exit; end; end; result := True; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:05 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz