Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Prozess beenden funktioniert nicht - Alternative? (https://www.delphipraxis.net/86653-prozess-beenden-funktioniert-nicht-alternative.html)

simlei 16. Feb 2007 22:35


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:
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;
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? :)
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...

Luckie 16. Feb 2007 23:32

Re: Prozess beenden funktioniert nicht - Alternative?
 
Was sagt den MSDN-Library durchsuchenGetLastError?

Christian Seehase 16. Feb 2007 23:50

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

simlei 17. Feb 2007 09:32

Re: Prozess beenden funktioniert nicht - Alternative?
 
hm...
Wie kann ich so ein Programm als Servce registrieren?

: GetLastError als Integer liefert 18...

Luckie 17. Feb 2007 10:51

Re: Prozess beenden funktioniert nicht - Alternative?
 
Na dann guck mal im MSDN nach, was das bedeutet oder lass es dir im Klartext mit Delphi-Referenz durchsuchenSystemErrorMessage ausgeben.

simlei 17. Feb 2007 11:04

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?

Christian Seehase 17. Feb 2007 12:35

Re: Prozess beenden funktioniert nicht - Alternative?
 
Moin simlei,

prfe doch erst einmal, ob OpenProcess berhaupt korrekt funktioniert.

DP-Maintenance 17. Feb 2007 12:38

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

simlei 17. Feb 2007 20:17

Re: Prozess beenden funktioniert nicht - Alternative?
 
Ich habe jetzt die Funktion "entzerrt" - folgendermaen:

Delphi-Quellcode:
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;
Ich habe p dann mal berwacht, als AExeName 'WoW.exe' war...
Dabei ist das Programm garnicht bis zu OpenProcess gekommen, da in diese If-Anweisung garnicht gesprungen wurde:
Delphi-Quellcode:
if AnsiLowerCase(p.szExeFile) = AnsiLowerCase(AExeName) then
        begin
          Process := OpenProcess(Process_Terminate, false, p.th32ProcessID);
          Result := TerminateProcess(Process, 0);
        end;
Dann hab ich mir mal p angeschaut... p wurde mit

(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...

Christian Seehase 17. Feb 2007 20:57

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.

simlei 17. Feb 2007 21:36

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?

Christian Seehase 17. Feb 2007 22:08

Re: Prozess beenden funktioniert nicht - Alternative?
 
Moin simlei,

Zitat:

Zitat von simlei
...oder meinst du dass ich den nchsten Prozess vergleichen soll?

Ja, klar.

Damit
Zitat:

Zitat von Christian Seehase
Das was hinter der #00 steht, ist halt das, was gerade im Speicher stand, als szExeFile gefllt wurde.

wollte ich zum Ausdruck gebracht haben, dass alles, was hinter der ersten #00 im Feld szExePath steht als Datenmll anzusehen ist.

simlei 17. Feb 2007 22:20

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!

Christian Seehase 17. Feb 2007 23:02

Re: Prozess beenden funktioniert nicht - Alternative?
 
Moin simlei,

ersetze doch mal das hier:

Delphi-Quellcode:
        if AnsiLowerCase(p.szExeFile) = AnsiLowerCase(AExeName) then
        begin
          Process := OpenProcess(Process_Terminate, false, p.th32ProcessID);
          Result := TerminateProcess(Process, 0);
        end;
durch

Delphi-Quellcode:
ShowMessage(p.szExePath);
und lass' Dir der Reihe nach einfach mal anzeigen, welche Prozesse so gefunden werden.

simlei 18. Feb 2007 11:16

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?

Christian Seehase 18. Feb 2007 12:06

Re: Prozess beenden funktioniert nicht - Alternative?
 
Moin simlei,

was meldet GetLastError, wenn Du es unmittelbar nach dem OpenProcess (also vor TerminateProcess) abfragst?

simlei 18. Feb 2007 15:40

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?

simlei 19. Feb 2007 20:19

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 20:00 Uhr.

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