![]() |
Prozess beenden funktioniert nicht - Alternative?
Hi!
Mein Problem ist, dass ich versuche, mit einem Programm Prozesse zu beenden... Und hat auch alles mit dem Code aus dsdt.info geklappt, aaber seit Patch 2.0.6 (imho) klappt das mit WoW.exe nicht mehr :/ . Der Code ist folgender:
Delphi-Quellcode:
Versuche ich den Prozess mit dem Taskmanager zu killen klappt das einwandfrei, aber eben mit dieser Routine nicht. Ich kann mich jetzt irren, aber ist der taskmanager nicht auch ein ganz normales Programm? :)
function KillTask(const AExeName: string): boolean;
var p: TProcessEntry32; h: THandle; begin Result := false; p.dwSize := SizeOf(p); h := CreateToolHelp32Snapshot(TH32CS_SnapProcess, 0); try if Process32First(h, p) then repeat if AnsiLowerCase(p.szExeFile) = AnsiLowerCase(AExeName) then Result := TerminateProcess(OpenProcess(Process_Terminate, false, p.th32ProcessID), 0); until (not Process32Next(h, p)) or Result; finally CloseHandle(h); end; end; Also muss es ja auch irgendwie klappen, den Prozess zu beenden, mit firefox.exe zB hats auch wunderbar geklappt u.a. Idee, anyone? danke schonmal! -- Edith mchte euch noch sagen, dass World of Warcraft sich auch nicht als Service registriert hat... |
Re: Prozess beenden funktioniert nicht - Alternative?
Was sagt den
![]() |
Re: Prozess beenden funktioniert nicht - Alternative?
Moin simlei,
Du solltest auch mal die Routine etwas "entzerren". Dadurch, dass Du OpenProcess direkt in das TerminateProcess gelegt hast, kannst Du gar nicht prfen, ob OpenProcess berhaupt funktioniert hat. Ausserdem solltest Du das Handle, dass OpenProcess, im Erfolgsfalle, zurckgibt wieder mit CloseHandle freigeben. Dass ggf. der Prozess dazu nicht mehr existiert spielt fr die Resourcen Deines Programmes keine Rolle. Der Taskmanager ist zwar ein Programm, dass aber nicht im Shell-, sondern im Systemkontext gestartet wird. Es ist ein Unterprozess der Winlogon.exe (System\Session Manager Subsystem\Winlogon) Das Blizzard an solchen Zugriffsmglichkeiten dreht ist mir schon bei einem Patch zu Diablo 2 aufgefallen. Zuerst konnte ich problemlos den Adressraum lesen und schreiben, nach einem Patch ging das auf einmal nicht mehr, so dass ich diese Aktionen ber einen Service mit Systemrechten erledigen musste ;-) |
Re: Prozess beenden funktioniert nicht - Alternative?
hm...
Wie kann ich so ein Programm als Servce registrieren? : GetLastError als Integer liefert 18... |
Re: Prozess beenden funktioniert nicht - Alternative?
Na dann guck mal im MSDN nach, was das bedeutet oder lass es dir im Klartext mit
![]() |
Re: Prozess beenden funktioniert nicht - Alternative?
hm hmhmhm
interessant: Es wird (Mit SysErrorMessage) fr den Fehler bei Killtask mit WoW ausgegeben. "Keine weiteren Dateien mehr vorhanden". Wenn aber zB auch der Firefox beendet werden soll, er luft aber gerade garnicht, kommt dort derselbe Fehler. Versteckt sich WoW jetzt vor der KillTask-Funktion, und wie kann ich das beheben? (zB mit registrierung als Dienst?) Wenn ja, wie? |
Re: Prozess beenden funktioniert nicht - Alternative?
Moin simlei,
prfe doch erst einmal, ob OpenProcess berhaupt korrekt funktioniert. |
DP-Maintenance
Dieses Thema wurde von "Christian Seehase" von "VCL / WinForms / Controls" nach "Windows API / MS.NET Framework API" verschoben.
Doch wohl eher ein API-Problem |
Re: Prozess beenden funktioniert nicht - Alternative?
Ich habe jetzt die Funktion "entzerrt" - folgendermaen:
Delphi-Quellcode:
Ich habe p dann mal berwacht, als AExeName 'WoW.exe' war...
function KillTask(const AExeName: string): boolean;
var p: TProcessEntry32; h: THandle; Process: Cardinal; begin Result := false; p.dwSize := SizeOf(p); h := CreateToolHelp32Snapshot(TH32CS_SnapProcess, 0); try if Process32First(h, p) then repeat if AnsiLowerCase(p.szExeFile) = AnsiLowerCase(AExeName) then begin Process := OpenProcess(Process_Terminate, false, p.th32ProcessID); Result := TerminateProcess(Process, 0); end; until (not Process32Next(h, p)) or Result; finally CloseHandle(h); end; end; Dabei ist das Programm garnicht bis zu OpenProcess gekommen, da in diese If-Anweisung garnicht gesprungen wurde:
Delphi-Quellcode:
Dann hab ich mir mal p angeschaut... p wurde mit
if AnsiLowerCase(p.szExeFile) = AnsiLowerCase(AExeName) then
begin Process := OpenProcess(Process_Terminate, false, p.th32ProcessID); Result := TerminateProcess(Process, 0); end; (296, 0, 0, 0, 0, 1, 0, 0, 0, ('[', 'S', 'y', 's', 't', 'e', 'm', ' ', 'P', 'r', 'o', 'c', 'e', 's', 's', ']', #0, '', '', '', #24, #0, #0, #0, '', #7, #0, #0, 'X', '', #18, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, '<', #0, '>', #0, #0, '', '', '', 't', #7, #0, #0, '', '', #18, #0, '', '/', '', '|', #3, #0, #31, #0, #0, #0, #0, #0, #0, '', '', '', '', '', #18, #0, #30, #0, #31, #0, '', '', #18, #0, '', '', #18, #0, '', '', '', '|', '', '', '', '|', 't', #7, #0, #0, #12, '', #18, #0, '', #21, 'j', 't', 't', #7, #0, #0, ' ', '.', #21, #0, '', '', 'k', 't', '|', #6, #16, #0, #2, #0, #0, #0, '', '', #0, #0, 'x', '', #20, #0, 'x', '', #20, #0, #2, #0, #0, #0, '(', #0, '', #0, #0, #0, #0, #0, 'x', '', #20, #0, '', 'q', #20, #0, '(', '', #20, #0, '', #13, #21, #0, #0, #0, #0, #0, '', '', #18, #0, 'M', 'S', 'C', 'T', 'F', '.', 'S', 'e', 'n', 'd', 'R', 'e', 'c', 'e', 'i', 'v', 'e', '.', 'E', 'v', 'e', 'n', 't', '.', 'I', 'A', 'O', '.', 'I', 'C', #0, #0, #1, #0, #0, #0, '', '', #18, #0, 'p', '', #18, #0, 'p', '', #18, #0, '', #4, '', 'w', #8, '', '', 'w', '', '', '', '', #16, #0, #0, #0, '', '3', '', '|', 'l', '', #18, #0, #0, #0, #0, #0, '', 'Z', 'A', #0)) angezeigt... Dabei ist p.szExeFile dann gleich ('[', 'S', 'y', 's', 't', 'e', 'm', ' ', 'P', 'r', 'o', 'c', 'e', 's', 's', ']', #0, '', '', '', #24, #0, #0, #0, '', #7, #0, #0, 'X', '', #18, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, '<', #0, '>', #0, #0, '', '', '', 't', #7, #0, #0, '', '', #18, #0, '', '/', '', '|', #3, #0, #31, #0, #0, #0, #0, #0, #0, '', '', '', '', '', #18, #0, #30, #0, #31, #0, '', '', #18, #0, '', '', #18, #0, '', '', '', '|', '', '', '', '|', 't', #7, #0, #0, #12, '', #18, #0, '', #21, 'j', 't', 't', #7, #0, #0, ' ', '.', #21, #0, '', '', 'k', 't', '|', #6, #16, #0, #2, #0, #0, #0, '', '', #0, #0, 'x', '', #20, #0, 'x', '', #20, #0, #2, #0, #0, #0, '(', #0, '', #0, #0, #0, #0, #0, 'x', '', #20, #0, '', 'q', #20, #0, '(', '', #20, #0, '', #13, #21, #0, #0, #0, #0, #0, '', '', #18, #0, 'M', 'S', 'C', 'T', 'F', '.', 'S', 'e', 'n', 'd', 'R', 'e', 'c', 'e', 'i', 'v', 'e', '.', 'E', 'v', 'e', 'n', 't', '.', 'I', 'A', 'O', '.', 'I', 'C', #0, #0, #1, #0, #0, #0, '', '', #18, #0, 'p', '', #18, #0, 'p', '', #18, #0, '', #4, '', 'w', #8, '', '', 'w', '', '', '', '', #16, #0, #0, #0, '', '3', '', '|', 'l', '', #18, #0, #0, #0, #0, #0, '', 'Z', 'A', #0) und natrlich wird in die Anweisungen nicht gesprungen... Frage ist nun natrlich, warum es beim Firefox zB funktioniert, aber bei WoW.exe nicht? p.szExeFile war beim firefox ja auch gleich dem exe-Namen... Ich bin sehr angewiesen auf eine Lsung; es wre nett wenn jemand eine findet, ich bin am Ende mit meinem Latein... |
Re: Prozess beenden funktioniert nicht - Alternative?
Moin simlei,
schau Dir mal den Anfang von szExeFile genau an: '[', 'S', 'y', 's', 't', 'e', 'm', ' ', 'P', 'r', 'o', 'c', 'e', 's', 's', ']', #0 Entspricht als String [System Process] Das wre also der (Pseudo)Prozess mit der ID 0. Das was hinter der #00 steht, ist halt das, was gerade im Speicher stand, als szExeFile gefllt wurde. Da die #00 den String terminiert, ist alles, was davor steht das, womit verglichen wird. Da [System Process] der Rckgabewert von Process32First gewesen sein drfte: Geh' doch mal im Einzelschritt durch, was die nchsten Werte sind, oder lass Dir die Prozessnamen einfach mal der Reihe nach ausgeben. |
Re: Prozess beenden funktioniert nicht - Alternative?
soweit ich das sehe drfte
#0, '', '', '', #24, #0, #0, #0, '', #7, #0, #0, 'X', '', #18, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, '<', #0, '>', #0, #0, '', '', '', 't', #7, #0, #0, '', '', #18, #0, '', '/', '', '|', #3, #0, #31, #0, #0, #0, #0, #0, #0, '', '', '', '', '', #18, #0, #30, #0, #31, #0, '', '', #18, #0, '', '', #18, #0, '', '', '', '|', '', '', '', '|', 't', #7, #0, #0, #12, '', #18, #0, '', #21, 'j', 't', 't', #7, #0, #0, ' ', '.', #21, #0, '', '', 'k', 't', '|', #6, #16, #0, #2, #0, #0, #0, '', '', #0, #0, 'x', '', #20, #0, 'x', '', #20, #0, #2, #0, #0, #0, '(', #0, '', #0, #0, #0, #0, #0, 'x', '', #20, #0, '', 'q', #20, #0, '(', '', #20, #0, '', #13, #21, #0, #0, #0, #0, #0, '', '', #18, #0, 'M', 'S', 'C', 'T', 'F', '.', 'S', 'e', 'n', 'd', 'R', 'e', 'c', 'e', 'i', 'v', 'e', '.', 'E', 'v', 'e', 'n', 't', '.', 'I', 'A', 'O', '.', 'I', 'C', #0, #0, #1, #0, #0, #0, '', '', #18, #0, 'p', '', #18, #0, 'p', '', #18, #0, '', #4, '', 'w', #8, '', '', 'w', '', '', '', '', #16, #0, #0, #0, '', '3', '', '|', 'l', '', #18, #0, #0, #0, #0, #0, '', 'Z', 'A', #0) ja wohl keinen sinnvollen Prozessnamen bzw irgendwelche Namen darin enthalten... oder meinst du dass ich den nchsten Prozess vergleichen soll? Sodass dann, wenn dort der Prozessname steht, auch die Bedingung der if-Anwesung erfllt ist? |
Re: Prozess beenden funktioniert nicht - Alternative?
Moin simlei,
Zitat:
Damit Zitat:
|
Re: Prozess beenden funktioniert nicht - Alternative?
aber dann wrs ja so, dass
a) WoW.exe in den Versuchen von mir immer der erste Prozess gewesen wre ODER b) dass alle Systemprozesse diese Eigenschaft haben und dass sozusagen bei einem solchen Prozess mit System Process am anfang immer einen Schritt weitergegangen werden muss... auf jeden Fall werd ichs so mal probioeren. Vielen Dank, Gute Hilfe! |
Re: Prozess beenden funktioniert nicht - Alternative?
Moin simlei,
ersetze doch mal das hier:
Delphi-Quellcode:
durch
if AnsiLowerCase(p.szExeFile) = AnsiLowerCase(AExeName) then
begin Process := OpenProcess(Process_Terminate, false, p.th32ProcessID); Result := TerminateProcess(Process, 0); end;
Delphi-Quellcode:
und lass' Dir der Reihe nach einfach mal anzeigen, welche Prozesse so gefunden werden.
ShowMessage(p.szExePath);
|
Re: Prozess beenden funktioniert nicht - Alternative?
hab ich... es funktioniert im prinzip auch...
Das Problem oben gibts auch nicht mehr. Jetzt ists nun halt wirklich so, dass OpenProcess nicht funktioniert (liefert 0). Womit ich wieder dabei wre, wie ich das umgehe? Es wurde vorhin erwhnt, dass das ber einen Dienst geht. Wie richte ich das ein oder gibts ne bessere Lsung? |
Re: Prozess beenden funktioniert nicht - Alternative?
Moin simlei,
was meldet GetLastError, wenn Du es unmittelbar nach dem OpenProcess (also vor TerminateProcess) abfragst? |
Re: Prozess beenden funktioniert nicht - Alternative?
"Zugriff verweigert"
:( Damit stellt sich dieselbe Frage wie aus meinem letzten Post... Wie kann ich dem Programm die Rechte geben, dennoch auf den Prozess zuzugreifen? |
Re: Prozess beenden funktioniert nicht - Alternative?
*push
Sorry, aber es wurde ja oben schonmal erwhnt, dass es eine Mglichkeit gibt, dem Programm Rechte zu geben (als Service), sodass es funktioniert. Jetzt wre wenigstens ein Link auf eine Stelle, wo es erklrt wird, wie, doch nicht fehl am Platze, oder nicht? Danke schonmal! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:36 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