![]() |
|
|
Регистрация | << Правила форума >> | 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. |
#7
|
|||
|
|||
![]() Цитата:
Вот теперь код моей проги: Код:
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 <> nil) then 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
|
|||
|
|||
![]() Уже как неделю бьюсь над этой проблемой. Для меня это очень важно! И самое главное, профессиональный кодер даже не смог этого сделать за деньги.
|
#9
|
|||
|
|||
![]() Цитата:
Звучит очень здорово. Но я даже не смог получить список всех хендлов в системе. И топик висит уже сутки об этом, и так никто и не помог даже с этим, не говоря уже о завершении чужого хендла. |
#10
|
||||
|
||||
![]() К сожалению, я здесь вам не помощник - под эмулятором виндов моя среда может лишь создать мьютекс, а вот грохнуть даже свой не получилось, не разрушается его первый хендл и последующие копии никак, что бы я не делал :-(
Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
#11
|
|||
|
|||
![]() Цитата:
|
#12
|
|||
|
|||
![]() Если еще актуально сделаю недорого
|
#13
|
|||
|
|||
![]() Цитата:
|
#14
|
|||
|
|||
![]() |
#15
|
|||
|
|||
![]() В почту пиши, нет VK у меня
|