Entwickler-Ecke

Windows API - Vor dem Beenden mit dem TaskManager eine Prozedur aufrufen?


Syngel Kid - Fr 09.07.04 18:32
Titel: Vor dem Beenden mit dem TaskManager eine Prozedur aufrufen?
Hey,

Wenn der Benutzer im Task Manager unter Prozesse geht und dort mein Programm beendet,
wie kann ich vor dem Beenden noch eine Prozedur aufrufen?

Mit "OnClose" geht es nicht, mit OnCloseQuery kann ich es höchstens beim "Task Beenden" auslösen...

Gibt es den keine Möglichkeit?

MfG Syngel Kid


MSCH - Fr 09.07.04 19:17

imho nein, da der gesamte Prozess gekillt wird und die Application davon nichts mitbekommt.
grez
msch


Anonymous - Fr 09.07.04 19:39

Kann man die Prozess-Killer-Fkten hooken? Dürfte (im Sinne von erlaubt sein) zwar imho nicht möglich sein, aber wer weiß...?


raziel - Fr 09.07.04 19:52

obbschtkuche hat folgendes geschrieben:
Kann man die Prozess-Killer-Fkten hooken? Dürfte (im Sinne von erlaubt sein) zwar imho nicht möglich sein, aber wer weiß...?

Habs grad ausprobiert... ;-) Einfach die Funktion TerminateProcess Hooken und schon funktionierts...!

raziel


Anonymous - Fr 09.07.04 20:00

Au, das tut weh.

Und was passiert nu wenn ich das ganze einfach mal... nicht weiterleite wenn Process = GetCurrentProcess? :shock:


raziel - Fr 09.07.04 20:08

obbschtkuche hat folgendes geschrieben:
Au, das tut weh.

Und was passiert nu wenn ich das ganze einfach mal... nicht weiterleite wenn Process = GetCurrentProcess? :shock:

:shock: Wie meinen? Wenn ich die Server-App kill, wird der Code ausgeführt, mit dem ich TermianteProcess ersetzt habe. Nach dem Killen wird offensichtlich die Hook-Dll ebenfalls entladen und danach passiert nichts weiter. Wenn man einen bestimmten Prozess rausfiltert wird halt nur dann der Code abgehandelt, wenn das entsprechende Fenster gekillt wird. Ansonsten wird die alte TerminateProcess aufgerufen. Oder hab ich was übersehen? *verunsichert nach Denkfehlern such*

raziel


Anonymous - Fr 09.07.04 20:12

:?:

raziel hat folgendes geschrieben:
*verunsichert nach Denkfehlern such*


*das selbe tu*

Annahme: Ich hooke TerminateProcess und ersetze es durch eine leere Dummy-Proc => Das "echte" TerminateProcess kann nicht mehr erreicht werden (zumindest nicht wenn die richtige Methode genommen wird)

Jetzt versucht der User einen Prozess zu killen. Passiert etwas?


raziel - Fr 09.07.04 20:16

Ach so! Also ich hab ne MessageBox mit dem ExitCode und "Letzer Aufschrei" aufblobben lassen. Danach wird die original TerminateProcess aufgerufen (-> Process gets killed). Das führt aber insofern zu einem Fehler, dass der gekillte Process mit ner AV abschmiert, wenn der TaskMan geschlossen wird, bevor die MessageBox geschlossen wurde, aber da muss man halt dann auf die MessageBox verzichten und "unsichtbaren" Code ausführen.
Ausserdem ersetze ich nicht die Funktion, sondern biege ein paar Zeiger um, die ich beim Unhooken wieder gradebieg... ;-)

raziel


Anonymous - Fr 09.07.04 20:20

Also irre ich mich jetzt oder wird nicht eigentlich in der Import/Export-Tabelle rumgepfuscht? (Das wäre dann ja ersetzen)


raziel - Fr 09.07.04 20:23

In der Import, aber das wird jetzt OT ;-) Und wenn ich ein "Backup" der ursprünglichen Zeiger mach, kann die Hook-Dll sie weiterhin aufrufen und sie hinterher restaurieren.
Aber wie gesagt, das wird jetzt zu OT...


Anonymous - Fr 09.07.04 20:27

Eins noch:

Stimmt, aber du biegst keinen Zeiger, sondern die entsprechende Tabelle um :mahn:


raziel - Fr 09.07.04 20:29

obbschtkuche hat folgendes geschrieben:
Stimmt, aber du biegst keinen Zeiger, sondern die entsprechende Tabelle um :mahn:

Nein, ich biege für jede importierte Funktion, die ich hooken will, in der Importtabelle jeden Zeiger einzeln um! :mahn:

raziel


Anonymous - Fr 09.07.04 20:31

Also ersetzt du sie doch? :P :roll: