Entwickler-Ecke

Windows API - Terminateprocess funzt nicht richtig


Reinhold666 - Do 22.06.06 01:07
Titel: Terminateprocess funzt nicht richtig
erstmal die Funktion :


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
function Killtask(const name:string):boolean;
var p:TProcessEntry32;
h:THandle;
begin
result:=false;
p.dwSize:=Sizeof(p);
h:=CreateToolHelp32snapshot(TH32CS_SnapProcess,0);

 if Process32First(h,p) then
  repeat
    if AnsiLowerCase(Extractfilename(p.szExeFile))=AnsiLowerCase(name) then
    Result:=TerminateProcess(Openprocess(PROCESS_TERMINATE,BOOL(0),p.th32ProcessID),0);
  until (not Process32Next(h,p)) or Result;
 CloseHandle(h);
end;


jetzt steht im programm irgendwo:

Delphi-Quelltext
1:
Killtask('blabla.exe');                    


-->Problem , es lassen sich nicht alle programme beenden.
wenn ich den namen des laufenden programmes angebe, zum beispiel , beendet es sich, so wie es auch soll..
allerdings lassen sich andere programme wie z.b. explorer.exe nicht beenden....
(anscheinend willkürlich, notepad.exe kann ich zum beispiel auch so beenden....anscheinend spielt es auch keine rolle von wem das programm gestartet wurde(sowohl notepad als auch explorer sind unter "Benutzer" am laufen))
woran liegts? hat mein programm keine rechte?muss ich andere parameter übergeben?oder hab ich einen fehler in der funtion?

danke im vorraus,
grüße , Reinhold

Moderiert von user profile iconraziel: Delphi-Tags hinzugefügt


Steve1024 - Do 22.06.06 09:13
Titel: WM_Close
Und wenn du an den Thread noch ein PostThreadMessage mit WM_Close oder so schickts??


Reinhold666 - Do 22.06.06 17:37


Delphi-Quelltext
1:
2:
3:
4:
5:
repeat
    if AnsiLowerCase(Extractfilename(p.szExeFile))=AnsiLowerCase(name) then
    //Result:=TerminateProcess(Openprocess(PROCESS_TERMINATE,BOOL(0),p.th32ProcessID),0);
    postthreadmessage(p.th32ProcessID,WM_CLOSE,0,0);
  until (not Process32Next(h,p)) or Result;



is des richtig? wenn ja, dann funktioniert diese variante überhauptnicht(sendmessage und postmessage hab ich auchschon ausprobiert)

die sache ist schon irgendwie komisch, bei manchen programmen funktionierts , bei manchen nicht...mir gehts eigentlich huptsächlich um die explorer.exe...das verwirrende ist, das manchmal garnichts passiert(das ist auch richtig wenn der prozess nicht gefunden wird.....aber explorer.exe hab ich garantiert richtig geschrieben^^) und manchmal (aber auch nur manchmal(bis jetzt 2 mal)) nach dem beenden meines programmes der fehler kommt "Error <irgendwas> illegal handle"...
hab auch im i-net geschaut , aber nix hatt wirklich funktioniert... bin voll am verzweifeln :)

eine andere lösung währe auch wenn jemand wüsste wie man verhindert das die explorer.exe beim starten von win XP gestartet wird....(regestry wahrscheinlich(also bei win98 konnte man das im explorer schlüssel))....

greetz, Reinhold

Moderiert von user profile iconChristian S.: Delphi-Tags hinzugefügt


Steve1024 - Do 22.06.06 18:13

also, wenn dir das reicht, dann schau mal im Library nach "Anwendung als erster staren" oder so...

Ich weiss nämlich nicht sicher, ob es das ist... aber kannst es ja mal ausprobieren....

RegValue
Zitat:
HK_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\WinLogon\Shell
von explorer.exe in dein App ändern...

außerdem meinte ich beise ausführen zu lassen... ich hatte damals sogar (glaube ich) drei Befehle benutzt.. alse Terminate, CloseHandle oder CloseProccess (k.A. mehr) und PostMessage bzw PosThreadMessage....

Das nächste wäre, dass du über FindWindowsEx oder durch OpenProccess dir das Fenster-Handle übergeben lässt und dort dann WM_Close hin sendest...


Reinhold666 - Do 22.06.06 19:34

super, vielen dank schonmal, hast mir schon viel weitergeholfen:)
also ich hab die explorer.exe durch mein programm ersetzt in der reg.
der explorer startet auch nichtmehr beim start, perfekt...
allerdings meoin programm auchnicht.... hab schon versucht es in den windows ordner zu kopieren und dann ohne pfadangabe einzutragen(wie der originaleintrag vom explorer) , klappt aber auchnich....
hab ausprobiert bei shell nichts anzugeben und mein programm in den autostart zu klatschen(bei ....Run in der reg)
aber das hat auchnicht gefunzt...
fazit: explorer startet nichtmehr, das gewünschte programm aber auchnicht...

hoffe du hast auch dafür eine lösung :) , thx im vorraus,
grüße Reinhold


Steve1024 - Fr 23.06.06 07:57

Also im Library steht, dass das Programm im "Windows\System32" Verzeichnis liegen soll... wenn ich mich recht erinnere...

Hast du das auch schon mal probiert??? Ansonsten schau doch mal einfach in der delphi-library.de...


Reinhold666 - Fr 23.06.06 19:49
Titel: hook
juhuuu, es klappt*freu*

hab die datei in den system32 ordner kopiert und jetz klappts, vielen dank!!!!!!!!!!!!

jetzt ist mein programm fast fertig,muss nurnoch schaffen strg+alt+entf und alt+tab abufangen...
gibts dafür ne andre möglichkeit als hooks?
irgendwie fenstermessage abfangen und mit ner konstanten für den jeweiligen befehl vergleichen oder so?


Delete - Fr 23.06.06 22:28
Titel: Re: hook
user profile iconReinhold666 hat folgendes geschrieben:
jetzt ist mein programm fast fertig,muss nurnoch schaffen strg+alt+entf und alt+tab abufangen...
gibts dafür ne andre möglichkeit als hooks?

Geht auch nicht mit Hooks, es sei den du meinst damit einen Tastaturtreiber. Einzige Möglichkeit ist es die Gina durch eine eigene zu ersetzen: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/secauthn/security/winlogon_and_gina.asp

Und bevor du jetzt fragst: "Wie geht das?" Lass dir gesagt sein, dass dies zu erklären wohl mehrerer Seiten eines Buches füllen würde. Und ich kenne auch niemanden, der das schon mal gemacht hätte. Und die Personen, denen ich das zutraue sind vernünftig genug dies nicht zu tun. Aus welchen Grund willst du das denn unbedingt verhindern?


bf109g.01 - Do 26.08.10 17:12

user profile iconReinhold666 hat folgendes geschrieben Zum zitierten Posting springen:
erstmal die Funktion :


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
function Killtask(const name:string):boolean;
var p:TProcessEntry32;
h:THandle;
begin
result:=false;
p.dwSize:=Sizeof(p);
h:=CreateToolHelp32snapshot(TH32CS_SnapProcess,0);

 if Process32First(h,p) then
  repeat
    if AnsiLowerCase(Extractfilename(p.szExeFile))=AnsiLowerCase(name) then
    Result:=TerminateProcess(Openprocess(PROCESS_TERMINATE,BOOL(0),p.th32ProcessID),0);
  until (not Process32Next(h,p) )or Result;
 CloseHandle(h);
end;


Was muss ich in die Uses Liste ergänzen? Das (fett) ist alles rot.
Ich versuche gerade so ein Programm zu bauen, um den IPodService automatisch zu beenden.
LG

Moderiert von user profile iconNarses: B- durch Highlight-Tags ersetzt


elundril - Do 26.08.10 17:15

Vermutlich TlHelp32.

lg elundril


SAiBOT - Do 26.08.10 18:55

Keine Ahnung ob das auf neueren Systemen auch funktioniert, sollte dir aber ein Blick wert sein:
http://www.codeproject.com/KB/winsdk/AntonioWinLock.aspx


Hidden - Do 26.08.10 19:16

Moin!

user profile iconLuckie hat folgendes geschrieben Zum zitierten Posting springen:
Geht auch nicht mit Hooks, es sei den du meinst damit einen Tastaturtreiber.
Der Process Explorer(* [http://technet.microsoft.com/de-de/sysinternals/bb896653.aspx]) von Sysinternals hat ja die Möglichkeit, den Windows-Taskmanager zu ersetzen.
Ich vermute mal, dass dies über einen Registry-Schlüssel läuft, in dem der Pfad zum Taskmanager liegt?

Oops, der Thread ist ja antik *auf feinen Pinsel wechselt*

user profile iconbf109g.01 hat folgendes geschrieben Zum zitierten Posting springen:
Ich versuche gerade so ein Programm zu bauen, um den IPodService automatisch zu beenden.
Vielleicht hilft es dir, das Ausführen des Programms unter den Windows-Dateioptionen\Sicherheit zu verbieten. Per Ausführen als kannst du es immer noch manuell mit einem anderen Benutzerkonto starten.

Oder erstmal aus dem Autostart nehmen, aber da erzähle ich dir wahrscheinlich nichts neues. :mrgreen:

lg,