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