hMutex = CreateMutex(ByVal 0&, 0, "{New_Mutex}")
Lunatic писал(а):Что посоветуете?
Денис ты тяжело болен словоблудием. Возможно это такая защита, а возможно стоит почитать что такое hInstance, что бы не городить чушь подобного рода.Денис писал(а):один из параметров функции это hInstance приложения, создавшего мьютекс и пытающегося потом его убить. Возможно это такая защита. Если ты не указываешь hInstance, то идешь лесом. Поэтому сначала получи hInstance целевого приложения и подставляй его в функцию.
один из параметров функции это hInstance приложения
Ну еще бы! Чужие хэндлы недоступны так, с наскоку, твоему приложению. Открой нужный тебе процесс, скопируй хэндл с флагом DUPLICATE_CLOSE_SOURCE к себе, а затем уже закрой с помощью CloseHandle() то, что ты скопировал. Ядро само уничтожит мьютекс после этого, но только при условии, что больше ни где не осталось его открытых хэндлов. Если, однако, таковые объявятся, ты всегда сможешь их найти и позакрывать. Правда кода чуток больше придется написать.Пробывал убить его из другого процесса используя CloseHandle, получил OverFlow
Twister писал(а):Денис, возможно ты спутал hInstance с хэндлом процесса. Будь внимательнее впредь, не дезинформируй молодежь
ANDLL писал(а):Денис ты
Нет, не спутал а придумал. В сабжевой фунции нет ни одного параметра связанного с хэндлом процесса или чемто такимДенис, возможно ты спутал hInstance с хэндлом процесса
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
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
Twister писал(а): Ядро само уничтожит мьютекс после этого, но только при условии, что больше ни где не осталось его открытых хэндлов. Если, однако, таковые объявятся, ты всегда сможешь их найти и позакрывать. Правда кода чуток больше придется написать
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]
Twister писал(а):По хэндлу мьютекса ты можешь узнать его имя
ZwQuerySystemInformation(SYSTEM_HANDLE_INFORMATION, mPtr, mSize, ret)
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
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
Гарри Неббет спасет отца русской демократииОткуда кстати брать инфу по ntdll
Сейчас этот форум просматривают: Google-бот, Majestic-12 [Bot], Yandex-бот и гости: 22