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 Fremden Mutex schließen (https://www.delphipraxis.net/144581-fremden-mutex-schliessen.html)

Relicted 11. Dez 2009 11:57


Fremden Mutex schließen
 
Mahlzeit die Herren,

ich habe momentan folgendes Problem:
Ich brauche eine Möglichkeit wie ich einen Mutex eines anderen Programmes killen / closen kann.

über den sourcecode bzw das tool habe ich folgende daten ermitteln können:

PID Handle Type Process Name Handle Name
5368 564 Mutant(14) xyz.dll \BaseNamedObjects\XXX1
4412 564 Mutant(14) xyz.dll \BaseNamedObjects\XXX2

ich habe das entsprechende programm 2 mal gestartet - der erste prozess legt xxx1, der 2. xxx2 an.


Vielleicht kann mir ja jemand weiterhelfen.

Gruß,
reli

Zacherl 11. Dez 2009 11:58

Re: Fremden Mutex schließen
 
OpenMutex() und CloseHandle() sollten den Job tun. :)

Relicted 11. Dez 2009 12:17

Re: Fremden Mutex schließen
 
Leider nein :-)

Bekomme kein Handle zurück von OpenMutex. Auch wenn ich das Handle aus dem Tool versuche zu Closen passiert nichts.
Außerdem verwundert es mich, dass beide Mutex'e das selbe Handle haben obwohl sie anders heißen.

OpenMutex(MUTEX_ALL_ACCESS,true,'XXX1') failed.
OpenMutex(MUTEX_ALL_ACCESS,false,'XXX1') failed.
OpenMutex(MUTEX_MODIFY_STATE,false,'XXX1') failed.
OpenMutex(MUTEX_MODIFY_STATE,true,'XXX1') failed.
OpenMutex(MUTEX_ALL_ACCESS,true,'\BaseNamedObjects \XXX1') failed.
OpenMutex(MUTEX_ALL_ACCESS,false,'\BaseNamedObject s\XXX1') failed.
OpenMutex(MUTEX_MODIFY_STATE,false,'\BaseNamedObje cts\XXX1') failed.
OpenMutex(MUTEX_MODIFY_STATE,true,'\BaseNamedObjec ts\XXX1') failed.

Neutral General 11. Dez 2009 12:20

Re: Fremden Mutex schließen
 
Kann es sein, dass man einfach nicht das Recht hat fremde Muticies ( :stupid: ) zu schließen?

himitsu 11. Dez 2009 12:56

Re: Fremden Mutex schließen
 
Mit CloseHandle kann man eh keine Mutex in anderen Prozessen schließen.
Denn dieses greift nur bei eigenen Handle ... also müßte man erstmal in den fremden Prozess rein und von da drinnen aus die Mutex-Handle schließen.

Zitat:

Bekomme kein Handle zurück von OpenMutex.
Vielleicht hast du einfach nicht die nötigen Rechte, um auf diese Mutex zuzugreifen?
Und warum gekommst du kein Handle, bzw. was sagt deine Fehlerbehandlung?
(Du hast doch eine Fehlerbehandleung eingebaut? Also GetLastError und Co.)

Und selbst wenn du so ein Handle bekommst, dann würde CloseHandle nur dein Mutex-Handle schließen und nicht das Fremde. :zwinker:

Bernhard Geyer 11. Dez 2009 13:22

Re: Fremden Mutex schließen
 
Zitat:

Zitat von himitsu
Mit CloseHandle kann man eh keine Mutex in anderen Prozessen schließen.
Denn dieses greift nur bei eigenen Handle ... also müßte man erstmal in den fremden Prozess rein und von da drinnen aus die Mutex-Handle schließen.

Denke ich auch. über DLL-Injection sollte sowas möglich sein (nicht umbedingt mit Delphi wenn es ein 64-Bit Prozess ist).

Neutral General 11. Dez 2009 13:27

Re: Fremden Mutex schließen
 
Zitat:

Zitat von Bernhard Geyer
Zitat:

Zitat von himitsu
Mit CloseHandle kann man eh keine Mutex in anderen Prozessen schließen.
Denn dieses greift nur bei eigenen Handle ... also müßte man erstmal in den fremden Prozess rein und von da drinnen aus die Mutex-Handle schließen.

Denke ich auch. über DLL-Injection sollte sowas möglich sein (nicht umbedingt mit Delphi wenn es ein 64-Bit Prozess ist).

Ja daran dachte ich im ersten Moment auch, aber wie kommt er dann an das gerade geöffnete Handle des Prozesses?

Astat 11. Dez 2009 13:29

Re: Fremden Mutex schließen
 
Hallo Relicted.

1. Du hast das Handle eines fremden Prozesses mit den Sourcen im angegebenen Link ermittelt.
2. Wie himitsu geschrieben hat, musst du in den fremden Prozess
Dies kannst du mit Dll-Injection, einfacher aber mit CreateRemoteThread erreichen.
Zu beachten ist, dass die notwendigen Synchronization Object Security and Access Rights vorhanden sind.
Siehe MSDN Link.


Delphi-Quellcode:
function RemoteCloseHandle(PID, FileHandle, Timeout: DWORD): LongBool;
var
  hProcess, hThread, TID: DWORD;
begin
  Result := False;
  hProcess := OpenProcess(PROCESS_ALL_ACCESS, False, PID);
  if hProcess <> 0 then begin
    try
      hThread := CreateRemoteThread(hProcess, nil, 0,
        GetProcAddress(GetModuleHandle('kernel32.dll'), 'CloseHandle'),
          ptr(FileHandle), CREATE_SUSPENDED, TID);

      if hThread <> 0 then begin
        ResumeThread(hThread);
        WaitForSingleObject(hThread, Timeout);
        CloseHandle(hThread);
        Result := True;
      end;
    finally
      CloseHandle(hProcess);
    end;
  end;
end;
[msdn]http://msdn.microsoft.com/en-us/library/ms686670(VS.85).aspx[/msdn]

lg. Astat

Relicted 19. Dez 2009 17:28

Re: Fremden Mutex schließen
 
Juhu,

habe es auch endlich geschafft das Ganze zu testen. Läuft einwandfrei! Vielen Dank für Eure Hilfe!

Gruß,
Reli


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:34 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