Mutex

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Lunatic
Обычный пользователь
Обычный пользователь
 
Сообщения: 98
Зарегистрирован: 04.03.2008 (Вт) 17:33

Mutex

Сообщение Lunatic » 15.11.2009 (Вс) 13:00

Есть прога, в которой PrеvInstаncе организовано через CreateMutex и последующей проверкой через OpenMutex. Как убить мутекс, чтоб следующая копия его не нашла. Пробывал RеlеаsеMutех и ClosеHаndlе, но чето не помогло. А влазить в чужую прогу неохота. Есть какой-то способ?

Lunatic
Обычный пользователь
Обычный пользователь
 
Сообщения: 98
Зарегистрирован: 04.03.2008 (Вт) 17:33

Re: Mutex

Сообщение Lunatic » 17.11.2009 (Вт) 4:19

Мутекс создан таким образом

Код: Выделить всё
hMutex = CreateMutex(ByVal 0&, 0, "{New_Mutex}")

Пробывал убить его из другого процесса используя CloseHandle, получил OverFlow, хотя если убивать его же из родного процесса, то всё работает корректно.

Что посоветуете?

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Re: Mutex

Сообщение Денис » 17.11.2009 (Вт) 9:12

Lunatic писал(а):Что посоветуете?

один из параметров функции это hInstance приложения, создавшего мьютекс и пытающегося потом его убить. Возможно это такая защита. Если ты не указываешь hInstance, то идешь лесом. Поэтому сначала получи hInstance целевого приложения и подставляй его в функцию.
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Re: Mutex

Сообщение ANDLL » 17.11.2009 (Вт) 9:33

Денис писал(а):один из параметров функции это hInstance приложения, создавшего мьютекс и пытающегося потом его убить. Возможно это такая защита. Если ты не указываешь hInstance, то идешь лесом. Поэтому сначала получи hInstance целевого приложения и подставляй его в функцию.
Денис ты тяжело болен словоблудием. Возможно это такая защита, а возможно стоит почитать что такое hInstance, что бы не городить чушь подобного рода.
Простой хинт - почти у всех exe-шников hInstance одинаковый.
И я даже не спрашиваю
один из параметров функции это hInstance приложения
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Re: Mutex

Сообщение Twister » 17.11.2009 (Вт) 13:44

Пробывал убить его из другого процесса используя CloseHandle, получил OverFlow
Ну еще бы! Чужие хэндлы недоступны так, с наскоку, твоему приложению. Открой нужный тебе процесс, скопируй хэндл с флагом DUPLICATE_CLOSE_SOURCE к себе, а затем уже закрой с помощью CloseHandle() то, что ты скопировал. Ядро само уничтожит мьютекс после этого, но только при условии, что больше ни где не осталось его открытых хэндлов. Если, однако, таковые объявятся, ты всегда сможешь их найти и позакрывать. Правда кода чуток больше придется написать.

Денис, возможно ты спутал hInstance с хэндлом процесса. Будь внимательнее впредь, не дезинформируй молодежь ;)
А я все практикую лечение травами...

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Re: Mutex

Сообщение Денис » 17.11.2009 (Вт) 13:51

Twister писал(а):Денис, возможно ты спутал hInstance с хэндлом процесса. Будь внимательнее впредь, не дезинформируй молодежь ;)

Ой, точно :oops: , извиняюсь.
ANDLL писал(а):Денис ты

Давайте без перехода на личности и без фамильярности.
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Re: Mutex

Сообщение ANDLL » 17.11.2009 (Вт) 19:26

Денис, возможно ты спутал hInstance с хэндлом процесса
Нет, не спутал а придумал. В сабжевой фунции нет ни одного параметра связанного с хэндлом процесса или чемто таким
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

Lunatic
Обычный пользователь
Обычный пользователь
 
Сообщения: 98
Зарегистрирован: 04.03.2008 (Вт) 17:33

Re: Mutex

Сообщение Lunatic » 18.11.2009 (Ср) 0:41

Код: Выделить всё
hProc = OpenProcess(PROCESS_DUP_HANDLE, 0, PID)
ret = DuplicateHandle(hProc, hMutex, GetCurrentProcess, CloneMutex, STANDARD_RIGHTS_ALL Or GENERIC_ALL, False, DUPLICATE_CLOSE_SOURCE)
CloseHandle CloneMutex


Где ошибся? Ret вернул ноль((

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Re: Mutex

Сообщение ANDLL » 18.11.2009 (Ср) 1:19

И что ты пытаешься этим кодом добится?:D
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

Lunatic
Обычный пользователь
Обычный пользователь
 
Сообщения: 98
Зарегистрирован: 04.03.2008 (Вт) 17:33

Re: Mutex

Сообщение Lunatic » 18.11.2009 (Ср) 1:38

:roll: Пытаюсь скопировать хендл процесса который породил мутекс, чтобы потом закрыть этот мутекс

Я же незнаю как это сделать, вот и ....

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Re: Mutex

Сообщение ANDLL » 18.11.2009 (Ср) 11:41

Ну ты создаешь новый хендл закрываешь, старому от этого ничего не будет то
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

Lunatic
Обычный пользователь
Обычный пользователь
 
Сообщения: 98
Зарегистрирован: 04.03.2008 (Вт) 17:33

Re: Mutex

Сообщение Lunatic » 18.11.2009 (Ср) 13:17

)) Ты на меня хорошо действуеш) Как напишешь, я сразу нахожу выход)

Код: Выделить всё
Private Const MUTANT_QUERY_STATE As Long = &H1
Private Const STANDARD_RIGHTS_REQUIRED As Long = &HF0000
Private Const SYNCHRONIZE As Long = &H100000
Private Const MUTANT_ALL_ACCESS As Long = (STANDARD_RIGHTS_REQUIRED Or SYNCHRONIZE Or MUTANT_QUERY_STATE)
Private Const DUPLICATE_CLOSE_SOURCE As Long = &H1
Private Const PROCESS_DUP_HANDLE As Long = &H40
Private Const STANDARD_RIGHTS_ALL As Long = &H1F0000
Private Const GENERIC_ALL As Long = &H10000000

Private Declare Function OpenMutex Lib "kernel32.dll" Alias "OpenMutexA" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal lpName As String) As Long
Private Declare Function CloseHandle Lib "kernel32.dll" (ByVal hObject As Long) As Long
Private Declare Function DuplicateHandle Lib "kernel32.dll" (ByVal hSourceProcessHandle As Long, ByVal hSourceHandle As Long, ByVal hTargetProcessHandle As Long, ByRef lpTargetHandle As Long, ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwOptions As Long) As Long
Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, lpdwProcessId As Long) As Long
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function GetCurrentProcess Lib "kernel32.dll" () As Long
Private Declare Function OpenProcess Lib "kernel32.dll" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long

Private Sub Form_Load()
Dim ret As Long
Dim hMutex As Long
Dim PID As Long
Dim hProc As Long

Const MutexName = "{MutexName}"
Const ApplicationTitle = "Project1"

hMutex = OpenMutex(MUTANT_ALL_ACCESS, 0, MutexName)
If hMutex <> 0 Then
    MWND = FindWindow(vbNullString, ApplicationTitle)
    GetWindowThreadProcessId MWND, PID
    hProc = OpenProcess(PROCESS_DUP_HANDLE, 0, PID)
    If hProc Then
        If DuplicateHandle(hProc, hMutex, GetCurrentProcess, CloneMutex, 0, False, DUPLICATE_CLOSE_SOURCE) Then
            If CloseHandle(CloneMutex) Then MsgBox "Mutex Destroy"
        End If
    End If
End If
Unload Me
End Sub



P.S. Столкнулся с каким-то глюком. Если код находится в модуле а не в форме. То всё проходит гладко, все функции возвращают нормальные значения. А вот мутекс не убивается. :shock:

Lunatic
Обычный пользователь
Обычный пользователь
 
Сообщения: 98
Зарегистрирован: 04.03.2008 (Вт) 17:33

Re: Mutex

Сообщение Lunatic » 18.11.2009 (Ср) 17:12

Twister писал(а): Ядро само уничтожит мьютекс после этого, но только при условии, что больше ни где не осталось его открытых хэндлов. Если, однако, таковые объявятся, ты всегда сможешь их найти и позакрывать. Правда кода чуток больше придется написать


Как найти все его хендлы?

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Re: Mutex

Сообщение Twister » 18.11.2009 (Ср) 22:07

На сайте есть две мои статьи: "Работа с описателями" и "Работа с описателями: практикум". Читать обе, внимание на вторую.

Ты передаешь логически неверные параметры в DuplicateHandle. Читай статьи, что я назвал выше.
А я все практикую лечение травами...

Lunatic
Обычный пользователь
Обычный пользователь
 
Сообщения: 98
Зарегистрирован: 04.03.2008 (Вт) 17:33

Re: Mutex

Сообщение Lunatic » 19.11.2009 (Чт) 0:19

Огромнейшее спасибо! Вникаю...)
Теперь можно даже отказатся от OpenMutex

Lunatic
Обычный пользователь
Обычный пользователь
 
Сообщения: 98
Зарегистрирован: 04.03.2008 (Вт) 17:33

Re: Mutex

Сообщение Lunatic » 19.11.2009 (Чт) 2:39

Правда с распознаванием мутексов среди других хендлов что-то тяжко.

Действовал по такой схеме.
Выбрал все хендлы для процесса. Создал мутекс проверил что добавилось.

Код: Выделить всё
Handle
ObjectTypeNumber
Flags
GrantedAccess


Код: Выделить всё
004   [16]   [0]   [983043]
008   [02]   [0]   [3]
012   [28]   [2]   [1048608]
016   [09]   [1]   [2031619]
020   [02]   [0]   [983055]
024   [21]   [1]   [2031617]
028   [17]   [0]   [983935]
032   [18]   [0]   [983551]
036   [17]   [0]   [983935]
040   [13]   [0]   [1048579]
044   [13]   [0]   [1048579]
048   [20]   [1]   [983103]
052   [28]   [0]   [1048577]
056   [02]   [0]   [131087]
060   [09]   [0]   [2031619]
064   [11]   [0]   [2031617]
068   [13]   [2]   [2031619]
072   [11]   [0]   [2031617]
076   [19]   [0]   [983047]
080   [11]   [0]   [2031617]
084   [11]   [0]   [2031617]
088   [11]   [0]   [2031617]
092   [11]   [0]   [2031617]
096   [20]   [1]   [983103]
100   [11]   [0]   [2031617]
104   [19]   [0]   [983071]
108   [11]   [0]   [1179649]
112   [20]   [0]   [131097]
116   [19]   [0]   [2]
120   [20]   [0]   [131097]
124   [09]   [0]   [2031619]
128   [11]   [0]   [2031617]
132   [11]   [0]   [2031617]
140   [19]   [0]   [983071]
144   [11]   [0]   [2031617]
148   [19]   [0]   [983047]
152   [11]   [0]   [2031617]



При создании мутекса добавились 144, 148 и 152, при повторной попытке создать мутекс добавился 128-й

Функция CreateMutex вернула 152 и 128 соответственно.

Теперь вопрос! Как мне их узнать среди других хендлов. Если их тип совпдает с другими хендлами(закрытие которых не приведёт ни к чему хорошему. Проверял)))

Может просто неправильно понял пример.

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Re: Mutex

Сообщение Twister » 19.11.2009 (Чт) 6:58

Создай какой-нить свой мьютекс, запомни его хэндл, найди этот хэндл среди принадлежащих твоем процессу, запомни номер типа. Все.

Хэндл мьютекса в чужом процессе ищи по имени.

Ты точно внимательно прочел вторую статью? Там есть готовый код, закрывающий хэндлы какого-либо файла в чужих процессах. А с мьютексом будет еще проще - получение его имени не вызовет дедлок.
А я все практикую лечение травами...

Lunatic
Обычный пользователь
Обычный пользователь
 
Сообщения: 98
Зарегистрирован: 04.03.2008 (Вт) 17:33

Re: Mutex

Сообщение Lunatic » 19.11.2009 (Чт) 8:30

Я же так и делал. Все что постом выше и есть результат. Сделал элементарное приложение с одной кнопкой и одной апишкой для создания мутекса. В моем случае мутекс имеет тип 11. Точно такой же как и еще 10 хендлов. Убивание которых приводит к смерти.

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Re: Mutex

Сообщение Twister » 19.11.2009 (Чт) 10:38

Еще раз. По хэндлу мьютекса ты можешь узнать его имя.
По имени ты можешь распознать именно тот хэндл, который тебе нужен. Зачем убивать что-то другое-то?
А я все практикую лечение травами...

Lunatic
Обычный пользователь
Обычный пользователь
 
Сообщения: 98
Зарегистрирован: 04.03.2008 (Вт) 17:33

Re: Mutex

Сообщение Lunatic » 19.11.2009 (Чт) 14:31

Twister писал(а):По хэндлу мьютекса ты можешь узнать его имя

Как??
Узнать по PID процесса, имя процесса, это понятно. А как узнать имя хендла у этого процесса? Я вообще не знал что у хендлов есть имена. :?
Думал так.
Код: Выделить всё
ZwQuerySystemInformation(SYSTEM_HANDLE_INFORMATION, mPtr, mSize, ret)

Но там ведь в структуре нет имени хендла.

Откуда кстати брать инфу по ntdll, везде искал, даже как видите на китайских ресурсах)))
P.S. правда у них Mutant тип под номером 10, а не 11. Тонкости китайских форточек)
Код: Выделить всё
Private Enum SYSTEM_HANDLE_TYPE
    OB_TYPE_UNKNOWN = 0
    OB_TYPE_TYPE = 1
    OB_TYPE_DIRECTORY                  '2
    OB_TYPE_SYMBOLIC_LINK              '3
    OB_TYPE_TOKEN                      '4 令牌
    OB_TYPE_PROCESS                    '5 进程
    OB_TYPE_THREAD                     '6 线程
    OB_TYPE_UNKNOWN_7                  '7
    OB_TYPE_EVENT                      '8 事件
    OB_TYPE_EVENT_PAIR                 '9
    OB_TYPE_MUTANT                     '10 互斥体
    OB_TYPE_UNKNOWN_11                 '11
    OB_TYPE_SEMAPHORE                  '12 信号量
    ......
End Type


Еще нашёл такую штуку NtQueryMutant у кого-то есть описание этой функции?

Код: Выделить всё
Type MUTANT_BASIC_INFORMATION
    CurrentCount As Long
    OwnedByCaller As Boolean
    AbandonedState As Boolean
End Type

Private Declare Function NtQueryMutant Lib "ntdll.dll" (MutantHandle As Long, MutantInformationClass As long, MutantInformation As long, MutantInformationLength As Long,  ResultLength As Long) As Long

Как-то так?

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Re: Mutex

Сообщение Twister » 19.11.2009 (Чт) 16:53

Должна помочь функция NtQueryObject с классом информации ObjectNameInformation

Откуда кстати брать инфу по ntdll
Гарри Неббет спасет отца русской демократии :)
А я все практикую лечение травами...

Lunatic
Обычный пользователь
Обычный пользователь
 
Сообщения: 98
Зарегистрирован: 04.03.2008 (Вт) 17:33

Re: Mutex

Сообщение Lunatic » 19.11.2009 (Чт) 21:30

Именно ей и воспользовался. Чуток переделал код одного французика, и часть кода взял с твоего примера. Вообщем всё работает)

hypersrakser
Начинающий
Начинающий
 
Сообщения: 1
Зарегистрирован: 26.07.2014 (Сб) 23:35

Re: Mutex

Сообщение hypersrakser » 26.07.2014 (Сб) 23:38

ребят.. есть пример рабочего кода на эту тему (закрыть мутекс, созданный другим процессом)? поделитесь пожалста...

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Re: Mutex

Сообщение Twister » 02.08.2014 (Сб) 0:22

http://vbstreets.ru/VB/Articles/66404.aspx

Раздел "Занятые файлы: закрытие чужих описателей". Статья уже была упомянута выше в топике. Пять лет назад.
А я все практикую лечение травами...


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот, Majestic-12 [Bot], Yandex-бот и гости: 22

    TopList