Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Закрыть чужой Mutex


Автор: Romы4 4.7.2009, 12:04
Проблема заключается в том чтобы убить мьютекс чужой программы, зная его имя....как создать и закрыть мьютекс я знаю, но с чужим проблема-я не знаю его хэндл

Автор: Romikgy 4.7.2009, 13:18
Код

HANDLE OpenMutex(

    DWORD dwDesiredAccess,    // access flag 
    BOOL bInheritHandle,    // inherit flag 
    LPCTSTR lpName    // pointer to mutex-object name 
   );

+
Код

BOOL ReleaseMutex(

    HANDLE hMutex    // handle of mutex object  
   );


PS имхо читай мсдн

Автор: Romы4 4.7.2009, 13:27
release вроде не может закрыть мьютикс, только через closehandle, а вот какой хэндл у созданого мьютикса я хз как определить

Добавлено через 4 минуты и 39 секунд
если не сложно, напишите пример

Автор: Romы4 4.7.2009, 16:02
пробывал так:


Код

procedure TForm1.Button1Click(Sender: TObject);
begin
mutex1:=OpenMutex(MUTEX_ALL_ACCESS, false, '_R_F_is_execute_');
if mutex1 <> 0 then CloseHandle (mutex); ;
end;


procedure TForm1.Button2Click(Sender: TObject);
begin
mutex:=CreateMutex(nil, false, '_R_F_is_execute_');
ReleaseMutex(mutex);
end;



но реакции никакой, мутекс при нажатии кнопки 2 создается, но при нажатии кнопки 1 должен по идее вернуть хандл в mutex1 и закрыть mutex, но не закрывает

Автор: MetalFan 4.7.2009, 19:28
такими методами никак ты этот мютекс не прибьешь.
тут я вижу два варианта:
1. "высокоуровневый" - внедряться во все процессы, где это мютекс открыт... нет, наверное это фантастика
2. "низкоуровневый" - писать драйвер, который будет грохать нужный мютекс на уровне ядра...

Автор: Riply 4.7.2009, 22:15
MetalFan,  вроде, можно и не внедряясь, но все равно остается фантастикой
учитывая проблемы, которые возникали у автора.


Автор: CodeMonkey 4.7.2009, 22:21
Нафига такое надо? 
Если не-программно - можно через Process Explorer. Он для работы использует свой драйвер.

Цитата(Romы4 @  4.7.2009,  16:02 Найти цитируемый пост)
но реакции никакой, мутекс при нажатии кнопки 2 создается, но при нажатии кнопки 1 должен по идее вернуть хандл в mutex1 и закрыть mutex, но не закрывает

Двойку вам за понимание работы системы. http://wm-help.net/books-online/book/59464/59464-22.html#head3.
Бросайте вы это дело, не для вашего уровня оно пока. Вернётесь к нему через годик-другой.

P.S. 2MetalFan: а способ №2 не фантастика, что-ли? smile На самом деле, вопрос стоял в закрытии мьютекса в конкретном процессе, поэтому достаточно при запуске этого процесса внедрить в него DLL, поставить хук на CreateMutex - и мы будем знать хэндл.

Автор: MetalFan 6.7.2009, 22:21
Цитата(CodeMonkey @  4.7.2009,  22:21 Найти цитируемый пост)
поэтому достаточно при запуске этого процесса внедрить в него DLL, поставить хук на CreateMutex - и мы будем знать хэндл.

а ежели приложение наше запускается после искомого. а если неизвестно, какое приложение создает мютекс?)

Автор: Romы4 7.7.2009, 11:01
известно приложение, точное имя процесса, точное имя мьютекса......расковырял идой приложение в 32-битном формате, нашел где вызывается создание мьютекса....собрать обратно правда не смог(((

Автор: Romikgy 7.7.2009, 20:47
забей нопами вызов CreateMutex ))

Автор: dumb 7.7.2009, 22:49
Romы4, просто выложи куда-нибудь .exe'шник, а мы посмотрим. smile

Автор: Romы4 8.7.2009, 10:10
лан ребят, забете, придется все выкладывать (5 гигов))))....загасил имя мьютекса через winhex-сделал его пустым....эта сволочь все-равно не позволяет вторую копию запустить

Автор: dumb 8.7.2009, 17:45
.exe'шник 5-гиговый?! не нужно все, нужен только .exe

Автор: Romikgy 8.7.2009, 17:48
надо забить само создание мутекса , а так он создает с именем все пробелы!

Автор: superwolf 10.11.2009, 07:06
Romikgy а как вычислить создание мьютекса подскажите плз! Как должен выглядеть хук? я так понимаю что нужно вызывать хук вот так:
Код

H:= SetWindowsHookEx(WH_CALLWNDPROC, @hook2, hInstance, 0);


где:
Код

function hook2(c0de, wParam, lParam : integer): Lresult; stdcall;


но как внутри функции hook2 отловить именно функцию CreateMutex??
Какой должен быть wParam здесь, чтобы отловить ее?

Автор: bems 10.11.2009, 08:23
superwolf, нет, это не тот хук. Просто название термина так же зучит, а смысл другой.

Автор: superwolf 10.11.2009, 08:30
 smile Тогда совсем ничего не понятно  smile А про какой хук идет речь? Разве никак нельзя отследить то место, где чужое окно создает мьютекс и предотвратить его создание? Если нельзя, то как хотя бы его убить после того как он был создан, и узнать его хендлер?

Вообщем вся задача сводится к одному вопросу: "Как не дать чужому приложению создать мьютекс, для того чтобы оно не смогло потом запретить запустить несколько своих копий?"

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)