Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Узнать процесс, который держит именнованый MUTEX


Автор: lemax 3.8.2008, 01:09
Процесс занимает именнованый мьютекс.
А другой процесс хочет узнать:"Кто занял этот именновыный мьютекс?"

Как решить такую задачку?

Автор: Riply 3.8.2008, 07:09
Цитата(lemax @  3.8.2008,  01:09 Найти цитируемый пост)
Процесс занимает именнованый мьютекс.
А другой процесс хочет узнать:"Кто занял этот именновыный мьютекс?"

Как решить такую задачку?


Например,  можно так:
При помощи NtQuerySystemInformation(...SystemHandleInformation...)
получаем "массив" структур (SYSTEM_HANDLE_INFORMATION_EX), описывающих открытые Handl`ы.
Бежим по нему, проверяя тип Handl`а (ObjectTypeNumber) не равен ли он OBJECT_TYPE_MUTANT.
Если да, то открываем просесс (OpenProcess) по его ProcessId,
дупликатим Handle (DuplicateHandle) для собственного процесса 
и вызываем для него (дубликата) NtQueryObject(...ObjectNameInformation...)
Сравниваем полученное имя с нашим.

P.S.
 Чтобы уменьшить количество открываний\закрываний процессов, перед пробежкой
 лучше сгруппировать SYSTEM_HANDLE_INFORMATION-ы по принадлежности одному процессу.
P.P.S.
 Rонстанты типа OBJECT_TYPE_MUTANT, к сожалению? не существует ибо это значение плавающее
 в зависимости от системы. Его придется определять вручную.
 Пути могут быть различные. Самый простой (но не самый лучший smile: 
 создать временный мьютекс и при помощи той же NtQuerySystemInformation посмотреть 
 его ObjectTypeNumber в собственном процессе.
P.P.P.S.
 Бежать по всем Handl`м без разбора не советую. 
 Можно беспросветно повиснуть на Pipe`ах (объект имеет тип файл).
 С этим зависанием можно конечно бороться, но это уже другая тема smile


Автор: lemax 4.8.2008, 09:56
Спасибо. 
Но в MSDN такие слова (SYSTEM_HANDLE_INFORMATION...)  уже не присутствуют.  smile 

Автор: Riply 4.8.2008, 11:21
Цитата(lemax @  4.8.2008,  09:56 Найти цитируемый пост)
Но в MSDN такие слова (SYSTEM_HANDLE_INFORMATION...)  уже не присутствуют

Быстро же у Вас руки опускаются smile
Гугл по этому запросу мне выдал 2130 ссылок
Вот ее определение, например, от ReactOS-ев:
Код

typedef struct _SYSTEM_HANDLE_TABLE_ENTRY_INFO
{
        USHORT UniqueProcessId;
        USHORT CreatorBackTraceIndex;
        UCHAR ObjectTypeIndex;
        UCHAR HandleAttributes;
        USHORT HandleValue;
        PVOID Object;
        ULONG GrantedAccess;
} SYSTEM_HANDLE_TABLE_ENTRY_INFO, *PSYSTEM_HANDLE_TABLE_ENTRY_INFO;

typedef struct _SYSTEM_HANDLE_INFORMATION
{
        ULONG NumberOfHandles;
        SYSTEM_HANDLE_TABLE_ENTRY_INFO Handles[1];
} SYSTEM_HANDLE_INFORMATION, *PSYSTEM_HANDLE_INFORMATION;


Я свое, вроде, брала у Гарри Неббета. (уже не помню). 
Его же рекомендую и почитать. 

Автор: lemax 4.8.2008, 12:00
Да ладно Вам.
Просто на компьюторе есть набор разныз програм, которые при запуске используют один именованный мьютекс. А тут понадобилось узнать, какой именно процесс его захватывае.
Я думал, что этот вариант будет примитивней обычного перебора запущенных процессов с целью нахождения одного из тех процессов, который захватывает мьютекс.  smile 

Автор: Riply 4.8.2008, 12:23
Цитата(lemax @  4.8.2008,  12:00 Найти цитируемый пост)
Я думал, что этот вариант будет примитивней обычного перебора запущенных процессов с целью нахождения одного из тех процессов, который захватывает мьютекс


Возможно, есть и такой вариант (в смысле примитивный).
Перебрать мьютексы системы.
Найти наш.
А дальше надо подумать. Возможно, существует такой способ перебора при котором
удастся заодно и "выцепить" информацию о процессе(ах), причастных к нему smile
Оставляю это заинересованным лицам, если конечно они заинтересованы smile

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