![]() |
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 |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:11 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