Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 16.01.2016, 12:34
EEjester EEjester вне форума
Прохожий
 
Регистрация: 03.07.2014
Сообщения: 15
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию Получить список всех хендлов системы типа mutant

Как получить список всех хендлов в системе типа mutant(mutex)?
Знаю что как то с помощью вот этого:
Код:
1
NtQuerySystemInformation(......SystemHandleInformation......)
Помогите пожалуйста.
Ответить с цитированием
  #2  
Старый 16.01.2016, 19:37
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Что это за "типа mutant"? Вот обычный список, пример из drkb
Вложения
Тип файла: zip taskmon.zip (9.0 Кбайт, 13 просмотров)
Ответить с цитированием
  #3  
Старый 16.01.2016, 19:51
EEjester EEjester вне форума
Прохожий
 
Регистрация: 03.07.2014
Сообщения: 15
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Не могу открыть проект тот что ты скинул. Пустой проект.
А задача у меня следующая: закрыть mutex созданный чужим процессом.
Ответить с цитированием
  #4  
Старый 16.01.2016, 19:57
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Архив и проект рабочие, результат показывает детальный список запущенных процессов

З.Ы. Кстати
Цитата:
function OpenMutex(
dwDesiredAccess: DWORD; // Задает права доступа к объекту
bInheritHandle: BOOL; // Задает, может ли объект наследоваться дочерними процессами
lpName: PChar // Имя объекта
): THandle; stdcall;
а уничтожить
Код:
1
ReleaseMutex();

Последний раз редактировалось Alegun, 16.01.2016 в 20:04.
Ответить с цитированием
  #5  
Старый 16.01.2016, 20:33
EEjester EEjester вне форума
Прохожий
 
Регистрация: 03.07.2014
Сообщения: 15
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от Alegun
Архив и проект рабочие, результат показывает детальный список запущенных процессов

З.Ы. Кстати
а уничтожить
Код:
1
ReleaseMutex();

Это свой mutex. А чужой? Я уже как неделю мучаюсь. Через procexp запросто можно найти этот мутекс и убить.
Я написал dll, и инжектирую её в процесс который создал мутекс.
Код dll такой:
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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  
Старый 16.01.2016, 22:11
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Просмотрел дружественную топку, коллеги там вам полность раскрыли тему, набросали инфы - вагон, бери и собирай, в чём загвоздка-то?

З.Ы. Как подсказка, примерный алгоритм-выжимка из тамошних постов:

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.
Ответить с цитированием
  #7  
Старый 16.01.2016, 22:42
EEjester EEjester вне форума
Прохожий
 
Регистрация: 03.07.2014
Сообщения: 15
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от Alegun
Просмотрел дружественную топку, коллеги там вам полность раскрыли тему, набросали инфы - вагон, бери и собирай, в чём загвоздка-то?
Загвоздка в том что я не знаю как правильно. Не знаю основ этого...
Вот теперь код моей проги:

Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, PsAPI;
 
type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
const
SystemHandleInformation       = $10;
STATUS_SUCCESS               = $00000000;
STATUS_BUFFER_OVERFLOW        = $80000005;
STATUS_INFO_LENGTH_MISMATCH   = $C0000004;
DefaulBUFFERSIZE              = $100000;
 
 
type
 OBJECT_INFORMATION_CLASS = (ObjectBasicInformation,ObjectNameInformation,ObjectTypeInformation,ObjectAllTypesInformation,ObjectHandleInformation );
 
 SYSTEM_HANDLE=packed record
 uIdProcess:ULONG;
 ObjectType:UCHAR;
 Flags     :UCHAR;
 Handle    :Word;
 pObject   :Pointer;
 GrantedAccess:ACCESS_MASK;
 end;
 
 PSYSTEM_HANDLE      = ^SYSTEM_HANDLE;
 SYSTEM_HANDLE_ARRAY = Array[0..0] of SYSTEM_HANDLE;
 PSYSTEM_HANDLE_ARRAY= ^SYSTEM_HANDLE_ARRAY;
 
  SYSTEM_HANDLE_INFORMATION=packed record
 uCount:ULONG;
 Handles:SYSTEM_HANDLE_ARRAY;
 end;
 PSYSTEM_HANDLE_INFORMATION=^SYSTEM_HANDLE_INFORMATION;
 
 TNtQuerySystemInformation=function (SystemInformationClass:DWORD; SystemInformation:pointer; SystemInformationLength:DWORD;  ReturnLength:PDWORD):THandle; stdcall;
 TNtQueryObject           =function (ObjectHandle:cardinal; ObjectInformationClass:OBJECT_INFORMATION_CLASS; ObjectInformation:pointer; Length:ULONG;ResultLength:PDWORD):THandle;stdcall;
 
 UNICODE_STRING=packed record
    Length       :Word;
    MaximumLength:Word;
    Buffer       :PWideChar;
 end;
 
 OBJECT_NAME_INFORMATION=UNICODE_STRING;
 POBJECT_NAME_INFORMATION=^OBJECT_NAME_INFORMATION;
 
Var
 NTQueryObject           :TNtQueryObject;
 NTQuerySystemInformation:TNTQuerySystemInformation;
 
function GetObjectInfo(hObject:cardinal; objInfoClass:OBJECT_INFORMATION_CLASS):LPWSTR;
var
 pObjectInfo:POBJECT_NAME_INFORMATION;
 HDummy     :THandle;
 dwSize     :DWORD;
begin
  Result:=nil;
  dwSize      := sizeof(OBJECT_NAME_INFORMATION);
  pObjectInfo := AllocMem(dwSize);
  HDummy      := NTQueryObject(hObject, objInfoClass, pObjectInfo,dwSize, @dwSize);
 
  if((HDummy = STATUS_BUFFER_OVERFLOW) or (HDummy = STATUS_INFO_LENGTH_MISMATCH)) then
    begin
   FreeMem(pObjectInfo);
   pObjectInfo := AllocMem(dwSize);
   HDummy      := NTQueryObject(hObject, objInfoClass, pObjectInfo,dwSize, @dwSize);
  end;
 
  if((HDummy >= STATUS_SUCCESS) and (pObjectInfo.Buffer <> nil)) then
  begin
   Result := AllocMem(pObjectInfo.Length + sizeof(WCHAR));
   CopyMemory(result, pObjectInfo.Buffer, pObjectInfo.Length);
  end;
  FreeMem(pObjectInfo);
end;
 
procedure TForm1.Button1Click(Sender: TObject);
var
 sDummy      : string;
 hProcess    : THandle;
 hObject     : THandle;
 ResultLength: DWORD;
 aBufferSize : DWORD;
 aIndex      : Integer;
 pHandleInfo : PSYSTEM_HANDLE_INFORMATION;
 HDummy      : THandle;
 lpwsName    : PWideChar;
 lpwsType    : PWideChar;
 lpszProcess : PAnsiChar;
begin
  try
    NTQueryObject            := GetProcAddress(GetModuleHandle('NTDLL.DLL'), 'NtQueryObject');
    NTQuerySystemInformation := GetProcAddress(GetModuleHandle('NTDLL.DLL'), 'NtQuerySystemInformation');
   if (@NTQuerySystemInformation<>nil) and (@NTQuerySystemInformation<>nil) then
    AbufferSize      := DefaulBUFFERSIZE;
  pHandleInfo      := AllocMem(AbufferSize);
  HDummy           := NTQuerySystemInformation(DWORD(SystemHandleInformation), pHandleInfo,AbufferSize, @ResultLength);  //Get the list of handles
 
  if(HDummy = STATUS_SUCCESS) then  //If no error continue
    begin
 
      for aIndex:=0 to pHandleInfo^.uCount-1 do   //iterate the list
      begin
    hProcess := OpenProcess(PROCESS_DUP_HANDLE or PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, FALSE, pHandleInfo.Handles[aIndex].uIdProcess);  //open the process to get aditional info
    if(hProcess <> INVALID_HANDLE_VALUE) then  //Check valid handle
    begin
     hObject := 0;
     if DuplicateHandle(hProcess, pHandleInfo.Handles[aIndex].Handle,GetCurrentProcess(), @hObject, STANDARD_RIGHTS_REQUIRED,FALSE, 0) then  //Get  a copy of the original handle
     begin
      lpwsName := GetObjectInfo(hObject, ObjectNameInformation); //Get the filename linked to the handle
      if (lpwsName <> nilthen
      begin
       lpwsType    := GetObjectInfo(hObject, ObjectTypeInformation);
       lpszProcess := AllocMem(MAX_PATH);
 
       if GetModuleFileNameEx(hProcess, 0,lpszProcess, MAX_PATH)<>0 then  //get the name of the process
       begin
        sDummy:=ExtractFileName(lpszProcess);
        end
          else
            sDummy:= 'System Process';
            if lpwsName = '\Sessions\1\BaseNamedObjects\SkypeMutex' then
            begin
              ShowMessage('Found And Killed');
              CloseHandle(pHandleInfo.Handles[aIndex].Handle);
            end;
 
              FreeMem(lpwsName);
              FreeMem(lpwsType);
              FreeMem(lpszProcess);
      end;
      CloseHandle(hObject);
     end;
     CloseHandle(hProcess);
    end;
   end;
  end;
  finally
  FreeMem(pHandleInfo);
  end;
end;
 
end.

Помоги пожалуйста! не работает((
Хочу завершить мутекс у скайпа:
Ответить с цитированием
  #8  
Старый 16.01.2016, 22:44
EEjester EEjester вне форума
Прохожий
 
Регистрация: 03.07.2014
Сообщения: 15
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Уже как неделю бьюсь над этой проблемой. Для меня это очень важно! И самое главное, профессиональный кодер даже не смог этого сделать за деньги.
Ответить с цитированием
  #9  
Старый 16.01.2016, 22:47
EEjester EEjester вне форума
Прохожий
 
Регистрация: 03.07.2014
Сообщения: 15
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от Alegun
Просмотрел дружественную топку, коллеги там вам полность раскрыли тему, набросали инфы - вагон, бери и собирай, в чём загвоздка-то?

З.Ы. Как подсказка, примерный алгоритм-выжимка из тамошних постов:

1) Вызываем OpenMutex - это чтоб убедиться, что он есть плюс определить тип объекта на шаге 3
2) Используем NtQuerySystemInformation с классом SystemHandleInformation=2 для получения списка всех хендлов живущих в системе
3) Ищем в списке хендл открытого мьютекса и определяем его тип посредством ObjectTypeNumber
4) Ищем в списке хендлы мьютексов требуемого процесса по его PID и ObjectTypeNumber
5) Если нашли более одного, то проверяем соответствие заданному имени: OpenProcess + NtQueryObject с классом ObjectNameInformation=1
6) Если нашли соответствие, то убиваем найденный/е хендл/ы вызовом DuplicateHandle c параметром DUPLICATE_CLOSE_SOURCE

вроде всё

Звучит очень здорово. Но я даже не смог получить список всех хендлов в системе. И топик висит уже сутки об этом, и так никто и не помог даже с этим, не говоря уже о завершении чужого хендла.
Ответить с цитированием
  #10  
Старый 17.01.2016, 11:36
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

К сожалению, я здесь вам не помощник - под эмулятором виндов моя среда может лишь создать мьютекс, а вот грохнуть даже свой не получилось, не разрушается его первый хендл и последующие копии никак, что бы я не делал :-(
Ответить с цитированием
  #11  
Старый 17.01.2016, 14:06
EEjester EEjester вне форума
Прохожий
 
Регистрация: 03.07.2014
Сообщения: 15
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от Alegun
К сожалению, я здесь вам не помощник - под эмулятором виндов моя среда может лишь создать мьютекс, а вот грохнуть даже свой не получилось, не разрушается его первый хендл и последующие копии никак, что бы я не делал :-(
У вас есть возможность связаться со мной по скайпу или какому либо чату? Я заплачу.
Ответить с цитированием
  #12  
Старый 18.01.2016, 07:36
Zorkov Igor Zorkov Igor вне форума
Новичок
 
Регистрация: 28.07.2009
Сообщения: 85
Репутация: 50
По умолчанию

Если еще актуально сделаю недорого
Ответить с цитированием
  #13  
Старый 18.01.2016, 07:54
EEjester EEjester вне форума
Прохожий
 
Регистрация: 03.07.2014
Сообщения: 15
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от Zorkov Igor
Если еще актуально сделаю недорого
Конечно актуально!! Суда чиркни: https://vk.com/eejester
Ответить с цитированием
  #14  
Старый 18.01.2016, 08:53
Zorkov Igor Zorkov Igor вне форума
Новичок
 
Регистрация: 28.07.2009
Сообщения: 85
Репутация: 50
По умолчанию

Вот тут рабочая дэмка для Windows 7 и выше

http://www.delphisources.ru/forum/at...d=145309632 3
Вложения
Тип файла: zip mutex.zip (1.77 Мбайт, 32 просмотров)
Ответить с цитированием
  #15  
Старый 18.01.2016, 08:54
Zorkov Igor Zorkov Igor вне форума
Новичок
 
Регистрация: 28.07.2009
Сообщения: 85
Репутация: 50
По умолчанию

В почту пиши, нет VK у меня
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 05:17.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025