Thema: Delphi vcl-prog -> service

Einzelnen Beitrag anzeigen

Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.117 Beiträge
 
Delphi 11 Alexandria
 
#14
  Alt 2. Feb 2003, 16:25
Moin Jan,

Salomon importiert damit dynamisch eine Funktion aus der Kernel32.dll von 9x/ME, nämlich RegisterServiceProcess.

Diese Funktion simuliert unter 9x/ME, dass ein Prozess ein Service ist.
Simuliert, da diese Betriebssysteme keine Services kennen.
Der Prozess wird nur vor dem Taskmanager versteckt, damit man ihn nicht über den Taskmanager abschiessen kann.

LoadLibrary lädt die angegebene DLL in den Adressraum des diese Funktion aufrufenden Prozesses. War die DLL schon geladen, wird intern ein Referenzzähler erhöht.
Im Falle der Kernel32.dll sollte man sich das Laden allerdings sparen können, da sie immer zu jedem Prozess dazugeladen wird. Ansonsten wäre es auch etwas schwierig LoadLibrary aufzurufen, da diese Funktion von der Kernel32 zur Verfügung gestellt wird.

Ist der Rückgabewert von LoadLibrary ungleich 0, enthält hKernel32 ein Handle auf die DLL.

GetProcAddress liest nun die Adresse der angegebenen Funktion (2. Parameter) aus dem Modul, dessen Handle angegeben wurde (1. Parameter).
(Wichtig: Die Gross-/Kleinschreibung des Funktionsnamens muss eingehalten werden)

Ist hier der Rückgabewert ungleich Null (da Pointer hier mittels Assign überprüft), wurde die Funktion gefunden und deren Adresse zurückgegeben.

Wenn alles gut gelaufen ist wird nun RegisterServiceProzess aufgerufen.
Der erste Parameter muss die ID des Prozesses sein, der bearbeitet werden soll. Der zweite Parameter entscheidet dann, ob der Prozess als Service angesehen werden soll (1) oder nicht (0).
Hier natürlich 1.

Da die Funktion unter NT ff nicht existiert, hier gibt's ja echte Services, würde GetProcAddress fehlschlagen, und null zurückliefern, so dass die Funktion RegisterServiceProcess nicht aufgerufen würde.

In aktuellen Versionen des PSDK ist RegisterServiceProcess nicht mehr dokumentiert

(beim googeln hab' ich mal eine Seite des MSDN gefunden, wo die Funktion dokumentiert ist. Leider reicht mein japanisch dafür allerdings nicht )

@Salomon:
Es fehlt eigentlich nur noch die Freigabe der Kernel32.


Im FormDestroy muss noch

Delphi-Quellcode:
if hKernel32 <> HInst(nil) then
begin
  FreeLibrary(hKernel32);
end;
nachgetragen werden.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat