Delphi-PRAXiS
Seite 1 von 2  1 2      

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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:55 Uhr.
Seite 1 von 2  1 2      

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