![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
![]() Как получить список всех хендлов в системе типа mutant(mutex)?
Знаю что как то с помощью вот этого: Код:
NtQuerySystemInformation(......SystemHandleInformation......) |
#2
|
||||
|
||||
![]() Что это за "типа mutant"? Вот обычный список, пример из drkb
Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
#3
|
|||
|
|||
![]() Не могу открыть проект тот что ты скинул. Пустой проект.
А задача у меня следующая: закрыть mutex созданный чужим процессом. |
#4
|
||||
|
||||
![]() Архив и проект рабочие, результат показывает детальный список запущенных процессов
З.Ы. Кстати Цитата:
Код:
ReleaseMutex(); Я не понял Вашего вопроса, но всё же Вам на него отвечу! Последний раз редактировалось Alegun, 16.01.2016 в 20:04. |
#5
|
|||
|
|||
![]() Цитата:
Это свой mutex. А чужой? Я уже как неделю мучаюсь. Через procexp запросто можно найти этот мутекс и убить. Я написал dll, и инжектирую её в процесс который создал мутекс. Код dll такой: Код:
var Timer,i: dword; hProc1:HWND; procedure TimerProc(hwnd, uMsg, idEvent, dwTime: dword);stdcall; var PID:Integer; hMutex:THandle; begin hProc1:=OpenProcess(PROCESS_DUP_HANDLE, false, GetCurrentProcessId); hMutex:=OpenMutex(MUTEX_ALL_ACCESS, true, '_!MSHISTORY!_'); if hMutex <> 0 then ShowMessage('ok') else ShowMessage('nooo'); DuplicateHandle(hProc1, hMutex, 0, 0, 0, false, DUPLICATE_CLOSE_SOURCE); CloseHandle(hMutex); end; begin Timer:=SetTimer(0,0,1000,@TimerProc); end. И всеравно не работает. Вот мой топик на форуме ваших коллег: http://www.cyberforum.ru/delphi-begi...ad1639687.html |
#6
|
||||
|
||||
![]() Просмотрел дружественную топку, коллеги там вам полность раскрыли тему, набросали инфы - вагон, бери и собирай, в чём загвоздка-то?
З.Ы. Как подсказка, примерный алгоритм-выжимка из тамошних постов: 1) Вызываем OpenMutex - это чтоб убедиться, что он есть плюс определить тип объекта на шаге 3 2) Используем NtQuerySystemInformation с классом SystemHandleInformation=2 для получения списка всех хендлов живущих в системе 3) Ищем в списке хендл открытого мьютекса и определяем его тип посредством ObjectTypeNumber 4) Ищем в списке хендлы мьютексов требуемого процесса по его PID и ObjectTypeNumber 5) Если нашли более одного, то проверяем соответствие заданному имени: OpenProcess + NtQueryObject с классом ObjectNameInformation=1 6) Если нашли соответствие, то убиваем найденный/е хендл/ы вызовом DuplicateHandle c параметром DUPLICATE_CLOSE_SOURCE вроде всё Я не понял Вашего вопроса, но всё же Вам на него отвечу! Последний раз редактировалось Alegun, 16.01.2016 в 22:43. |