![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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. |