Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Treiber installieren, starten, stoppen, deinstallieren (https://www.delphipraxis.net/53496-treiber-installieren-starten-stoppen-deinstallieren.html)

Neotracer64 17. Sep 2005 19:47


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:

Olli 17. Sep 2005 19:52

Re: Treiber installieren, starten, stoppen, deinstallieren
 
Zitat:

Zitat von Neotracer64
(geschrieben in C++ und kompiliert mit dem DDK)

Respekt. Manche würden dich dafür steinigen, wenn du dank überladenem new und delete den Speicher verschwendest :lol:

Guck mal in mein Service Tut: http://assarbad.net/en/stuff/tutorials/ntsvc/

Dienste und Treiber werden auf die gleiche Art und Weise installiert, gestartet und gestoppt usw.

Neotracer64 17. Sep 2005 19:58

Re: Treiber installieren, starten, stoppen, deinstallieren
 
Zitat:

Respekt. Manche würden dich dafür steinigen, wenn du dank überladenem new und delete den Speicher verschwendest
Hmm versteh ich nicht ganz. Kann es sein, dass ich mich etwas falsch ausgedrückt hab ? Von Treiberprogrammierung versteh ich noch nicht viel, deswegen hatte ich auch kompetente Hilfe, die im Moment nicht erreichbar ist. Gut, dass die DP so schnell ist :thumb:

Danke für das TUT, Olli :cyclops:

Olli 17. Sep 2005 20:04

Re: Treiber installieren, starten, stoppen, deinstallieren
 
Zitat:

Zitat von Neotracer64
Hmm versteh ich nicht ganz. Kann es sein, dass ich mich etwas falsch ausgedrückt hab ?

Nee, es ging darum, daß du sagtest, dein Treiber sei mit C++ programmiert. Suche mal mit Google nach dem Streitthema ob C++ oder C verwendet werden soll ;) ... dann weißt du was ich meine. Ist aber auch nicht trivial mit C++ einen Treiber zu programmieren.

MagicAndre1981 17. Sep 2005 20:08

Re: Treiber installieren, starten, stoppen, deinstallieren
 
[quote="Olli"]
Zitat:

Zitat von Neotracer64
Ist aber auch nicht trivial mit C++ einen Treiber zu programmieren.

Dafür gibts extra DriverProgrammingKits, mitdenen man Treiber auch mit C++ schreiben kann.

Olli 17. Sep 2005 20:11

Re: Treiber installieren, starten, stoppen, deinstallieren
 
Zitat:

Zitat von MagicAndre1981
Zitat:

Zitat von Olli
Ist aber auch nicht trivial mit C++ einen Treiber zu programmieren.

Dafür gibts extra DriverProgrammingKits, mitdenen man Treiber auch mit C++ schreiben kann.

Nee, ehrlich? Wenn du dir sowas leisten kannst, Glückwunsch. Ich steige erst in die Riege der Großverdiener auf :mrgreen:

bigg 17. Sep 2005 20:36

Re: Treiber installieren, starten, stoppen, deinstallieren
 
Schau mal hier:
http://www.nirsoft.net/utils/serviwin.html

Es sollte sich also über die allbekannte und von vielen gehasste Registry realisieren lassen.
(ot: hasse sie nicht, finde sie sehr sinnvoll)

Olli 17. Sep 2005 20:39

Re: Treiber installieren, starten, stoppen, deinstallieren
 
Zitat:

Zitat von bigg
Es sollte sich also über die allbekannte und von vielen gehasste Registry realisieren lassen.

Über die SCM-APIs greifst du implizit auf die Registry zu. Allerdings wirst du ohne Beteiligung des SCM nicht einen Eintrag in die Registry machen und dann ohne Neustart deinen Treiber/Dienst starten können. Daher ist eben der SCM immer der Weg, den man gehen sollte. Auch wenn man es über ein Registry-Script (.REG) oder sonstwas lösen könnte!

Neotracer64 17. Sep 2005 23:22

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:

//----------------------------------------------------------------
// load a sys file as a driver using undocumented method
//----------------------------------------------------------------
bool load_sysfile()
{
SYSTEM_LOAD_AND_CALL_IMAGE GregsImage;

WCHAR daPath[] = L"\\??\\C:\\HELLOWORLD.SYS";

//////////////////////////////////////////////////////////////
// get DLL entry points
//////////////////////////////////////////////////////////////
if( !(RtlInitUnicodeString = (RTLINITUNICODESTRING)
GetProcAddress( GetModuleHandle("ntdll.dll")
,"RtlInitUnicodeString"
)))
{
return false;
}

if(!(ZwSetSystemInformation = (ZWSETSYSTEMINFORMATION)
GetProcAddress(
GetModuleHandle("ntdll.dll")
,"ZwSetSystemInformation" )))
{
return false;
}

RtlInitUnicodeString(
&(GregsImage.ModuleName)
,daPath
);

if(
!NT_SUCCESS(
ZwSetSystemInformation(
SystemLoadAndCallImage
,&GregsImage
,sizeof(SYSTEM_LOAD_AND_CALL_IMAGE))))
{
return false;
}

return true;
}
Delphi-Quellcode:
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;
Es kommt leider immer false raus :(

Olli 17. Sep 2005 23:43

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!)


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:20 Uhr.
Seite 1 von 3  1 23      

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