Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Мьютекс, Мьютекс 
:(
    Опции темы
koTexe
Дата 26.4.2006, 15:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 21.1.2006

Репутация: нет
Всего: нет



Здравствуйте, у меня такой вопрос, можно ли найти хендел окна создавшего мьютекс. 
PM MAIL   Вверх
Snowy
Дата 26.4.2006, 15:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 30
Всего: 484



Нет. Мьютекс вещь самостоятельная.
Винде совершенно все равно, кто его создал.
Главное, кто работает с его хэндлом.
Но список тредов, работающих с мьютексом она также не предоставляет.
И влезть в ее внутреннюю кухню она не дает. 
PM MAIL   Вверх
Rouse_
Дата 26.4.2006, 17:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 469
Регистрация: 23.4.2005

Репутация: 18
Всего: 29



Можно, но сложно. Ищи NtQueryMutant() 


--------------------
 Vae Victis
(Горе побежденным (лат.))
Демо с открытым кодом: http://rouse.drkb.ru 
PM MAIL WWW ICQ   Вверх
Nickel
Дата 29.4.2006, 19:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 77
Регистрация: 7.2.2006

Репутация: 2
Всего: 4



Написал код, чтоб получить ID процесса создавшего мьютекс. Думаю это то что ты хотел, если надо, можно будет узнать какие окна создал этот процесс. На всякий случай получаем привелегии отладчика, вдруг понадобится мьютекс системного процесса.
Код

type
PSYSTEM_HANDLE_INFORMATION = ^SYSTEM_HANDLE_INFORMATION;
SYSTEM_HANDLE_INFORMATION = packed record
   ProcessId: dword;
   ObjectTypeNumber: byte;
   Flags: byte;
   Handle: word;
   pObject: pointer;
   GrantedAccess: dword;
end;

PSYSTEM_HANDLE_INFORMATION_EX = ^SYSTEM_HANDLE_INFORMATION_EX;
SYSTEM_HANDLE_INFORMATION_EX = packed record
   NumberOfHandles: dword;
   Information: array [0..0] of SYSTEM_HANDLE_INFORMATION;
end;

PUnicodeString = ^TUnicodeString;
  TUnicodeString = packed record
    Length: Word;
    MaximumLength: Word;
    Buffer: PWideChar;
end;

const SystemHandleInformation  =    16;
      OB_TYPE_MUTANT = 11;
      ObjectNameInformation = 1;

function ZwQueryObject(ObjectHandle: THandle;
  ObjectInformationClass: integer; ObjectInformation:Pointer;
  Length: ULONG; ReturnLength: PULONG): cardinal; stdcall;
  external 'ntdll.dll';
  
Function ZwQuerySystemInformation(ASystemInformationClass: dword;
                                  ASystemInformation: Pointer;
                                  ASystemInformationLength: dword;
                                  AReturnLength:PCardinal): cardinal;
                                  stdcall;external 'ntdll.dll';


Function GetSystemHandleTable:Pointer;
var
 mSize: dword;
 mPtr: pointer;
 St: cardinal;
begin
 Result := nil;
 mSize := $4000;
 repeat
   mPtr := VirtualAlloc(nil, mSize, MEM_COMMIT or MEM_RESERVE, PAGE_READWRITE);
   if mPtr = nil then Exit;
   St := ZwQuerySystemInformation(SystemHandleInformation, mPtr, mSize, nil);
   if St = cardinal($C0000004) then
      begin
        VirtualFree(mPtr, 0, MEM_RELEASE);
        mSize := mSize * 2;
      end;
 until St <> cardinal($C0000004);
 if St = 0
   then Result := mPtr
   else VirtualFree(mPtr, 0, MEM_RELEASE);
end;

function EnablePrivilege(Process: dword; lpPrivilegeName: PChar):Boolean;
var
  hToken: dword;
  NameValue: Int64;
  tkp: TOKEN_PRIVILEGES;
  ReturnLength: dword;
begin
  Result:=false;
  OpenProcessToken(Process, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken);
  if not LookupPrivilegeValue(nil, lpPrivilegeName, NameValue) then
    begin
     CloseHandle(hToken);
     exit;
    end;
  tkp.PrivilegeCount := 1;
  tkp.Privileges[0].Luid := NameValue;
  tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
  AdjustTokenPrivileges(hToken, false, tkp, SizeOf(TOKEN_PRIVILEGES),
    tkp, ReturnLength);
  if GetLastError() <> ERROR_SUCCESS then
     begin
      CloseHandle(hToken);
      exit;
     end;
  Result:=true;
  CloseHandle(hToken);
end;

function SeekMutantProcess(Name:string):cardinal;
var inf:PSYSTEM_HANDLE_INFORMATION_EX;
    i:integer;
    process,h:cardinal;
    p:pointer;
    s:string;
begin
  Result:=0;
  EnablePrivilege(INVALID_HANDLE_VALUE ,'SeDebugPrivilege');
  p:=GetMemory(max_path);
  ZeroMemory(p,max_path);
  inf:=GetSystemHandleTable;
  for i:=0 to inf.NumberOfHandles-1 do
    if inf.Information[i].ObjectTypeNumber=OB_TYPE_MUTANT then
      begin
       process:=OpenProcess(PROCESS_DUP_HANDLE,false,
            inf.Information[i].ProcessId);
       DuplicateHandle(process,inf.Information[i].Handle,
            GetCurrentProcess,@h,0,false,0);
       CloseHandle(process);
       ZwQueryObject(h,ObjectNameInformation,p,max_path,nil);
       CloseHandle(h);
       s:=ExtractFileName(WideCharToString(
                TUnicodeString(p^).Buffer));
       ZeroMemory(p,max_path);
       if s=Name then Result:=inf.Information[i].ProcessId;
       //Form1.ListBox1.Items.Add(s);
  end;
end;


Пример:
Код

procedure TForm1.Button1Click(Sender: TObject);
begin
  CreateMutex(nil,false,'mut');
  ShowMessage('Õåíäë ñîçäàòåëÿ ìüþòåêñà - '+IntToStr(SeekMutantProcess('mut'))
             +#13+'Õåíäë òåêóùåãî ïðîöåññà - '+IntToStr(GetCurrentProcessId));
end;

ЗЫ: мой пост удалили или браузер взглючил? 
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0453 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.