Форум: "WinAPI";
Текущий архив: 2010.10.03;
Скачать: [xml.tar.bz2];
ВнизПоиск хэндла. Найти похожие ветки
← →
_bass (2009-02-26 19:38) [0]Здравствуйте.
Подскажите пожалуйста, как найти определенный хендл (по его имени в процессе). Программно, естественно.
Спасибо.
← →
_bass (2009-02-26 19:40) [1]Имелось ввиду:
*...определенный хендл (по его имени) в процессе.
← →
{RASkov} © (2009-02-26 19:51) [2]что такое имя хендла?
← →
_bass (2009-02-26 19:55) [3]Название.
Например, его можно посмотреть программой Process Explorer (Sysinternals).
← →
Rouse_ © (2009-02-26 21:51) [4]Перебрать хэндлы процесса, сказать на каждый NtQueryObject и сравнить :)
Примерный код тут: http://rouse.drkb.ru/winapi.php#enumopenfiles
← →
_bass (2009-02-26 22:55) [5]Спасибо.
Код еще не изучал, но программа не выводит список открытых файлов.
← →
Игорь Шевченко © (2009-02-26 23:54) [6]
> Подскажите пожалуйста, как найти определенный хендл (по
> его имени в процессе). Программно, естественно.
Нафига ?
← →
KSergey © (2009-02-27 08:35) [7]> _bass (26.02.09 19:38)
> Подскажите пожалуйста, как найти определенный хендл
А хендл чего именно нужен?
← →
Rouse_ © (2009-02-27 11:34) [8]
> Код еще не изучал, но программа не выводит список открытых
> файлов.
Оны выводит список соответствий хэндл-файл. Если файл открыт в мемо - это еще не означает что хендл на него все еще живой :)
← →
_bass (2009-02-27 20:39) [9]KSergey,
Нужно найти ивент (хендл) с определенным названием и его "убить" (закрыть).
← →
Игорь Шевченко © (2009-02-27 21:42) [10]
> Нужно найти ивент (хендл) с определенным названием и его
> "убить" (закрыть).
В чужом процессе это будет сложно сделать - надо туда внедряться или через драйвер
← →
DVM © (2009-02-27 22:07) [11]
> {RASkov} © (26.02.09 19:51) [2]
>
> что такое имя хендла?
- Название этой песни называется "Пуговки для сюртуков".
- Простите, вы хотели сказать это песня так называется.
- Нет, это название песни так называется, а сама песня называется "Древний старичок"
(С) Л. Кэрролл.
← →
_bass (2009-02-27 22:44) [12]"тупо внедряться" а далее по какому принципу?
← →
Игорь Шевченко © (2009-02-28 13:51) [13]Вопрос "нафига" был задан совсем не зря. Может быть, есть более простое решение, но, раз неизвестно, зачем нужно закрывать event, то и путей нету.
← →
_bass (2009-02-28 15:11) [14]Евент нужно закрывать для обхода защиты у некоторого приложения. Другого, более простого решения, к сожалению, нет.
← →
Игорь Шевченко © (2009-02-28 15:47) [15]
> Евент нужно закрывать для обхода защиты у некоторого приложения
Тут я не помощник
← →
имя (2009-02-28 22:33) [16]Удалено модератором
← →
AHTOLLlKA (2009-04-24 11:05) [17]апну тему....
ибо тоже уже четвыртый день мучаюсь.. нужен код....
пример что дали выше поиск файлов.. медленен ибо он ищет везде...
ктонить может помочь кодом который ищет открытые файлы у определенного процеса....
как в процес эксплорер сделано...
помогите очень запарился.... =((
← →
Игорь Шевченко © (2009-04-24 11:25) [18]
> как в процес эксплорер сделано...
Через драйвер PROCEXP111.SYS
← →
AHTOLLlKA (2009-04-24 11:31) [19]а в юзер моде как нить можно??
← →
Виталий (2009-04-24 17:13) [20]Когда-то выцеплял для своих нужд
unit Unit1;
interface
uses tlhelp32,
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Menus, ExtCtrls;
type NT_STATUS = Cardinal;
PSYSTEM_THREADS = ^SYSTEM_THREADS;
SYSTEM_THREADS = packed record
KernelTime: LARGE_INTEGER;
UserTime: LARGE_INTEGER;
CreateTime: LARGE_INTEGER;
WaitTime: ULONG;
StartAddress: Pointer;
UniqueProcess: DWORD;
UniqueThread: DWORD;
Priority: Integer;
BasePriority: Integer;
ContextSwitchCount: ULONG;
State: Longint;
WaitReason: Longint;
end;
PSYSTEM_PROCESS_INFORMATION = ^SYSTEM_PROCESS_INFORMATION;
SYSTEM_PROCESS_INFORMATION = packed record
NextOffset: ULONG;
ThreadCount: ULONG;
Reserved1: array [0..5] of ULONG;
CreateTime: FILETIME;
UserTime: FILETIME;
KernelTime: FILETIME;
ModuleNameLength: WORD;
ModuleNameMaxLength: WORD;
ModuleName: PWideChar;
BasePriority: ULONG;
ProcessID: ULONG;
InheritedFromUniqueProcessID: ULONG;
HandleCount: ULONG;
Reserved2 : array[0..1] of ULONG;
PeakVirtualSize : ULONG;
VirtualSize : ULONG;
PageFaultCount : ULONG;
PeakWorkingSetSize : ULONG;
WorkingSetSize : ULONG;
QuotaPeakPagedPoolUsage : ULONG;
QuotaPagedPoolUsage : ULONG;
QuotaPeakNonPagedPoolUsage : ULONG;
QuotaNonPagedPoolUsage : ULONG;
PageFileUsage : ULONG;
PeakPageFileUsage : ULONG;
PrivatePageCount : ULONG;
ReadOperationCount : LARGE_INTEGER;
WriteOperationCount : LARGE_INTEGER;
OtherOperationCount : LARGE_INTEGER;
ReadTransferCount : LARGE_INTEGER;
WriteTransferCount : LARGE_INTEGER;
OtherTransferCount : LARGE_INTEGER;
ThreadInfo: array [0..0] of SYSTEM_THREADS;
end;
PIO_STATUS_BLOCK = ^IO_STATUS_BLOCK;
IO_STATUS_BLOCK = packed record
Status: NT_STATUS;
Information: DWORD;
end;
PUNICODE_STRING = ^TUNICODE_STRING;
TUNICODE_STRING = packed record
Length : WORD;
MaximumLength : WORD;
Buffer : array [0..MAX_PATH - 1] of WideChar;
end;
POBJECT_NAME_INFORMATION = ^TOBJECT_NAME_INFORMATION;
TOBJECT_NAME_INFORMATION = packed record
Name : TUNICODE_STRING;
end;
PFILE_NAME_INFORMATION = ^FILE_NAME_INFORMATION;
FILE_NAME_INFORMATION = packed record
FileNameLength: ULONG;
FileName: array [0..MAX_PATH - 1] of WideChar;
end;
TForm1 = class(TForm)
ListBox1: TListBox;
MainMenu1: TMainMenu;
N11: TMenuItem;
Timer1: TTimer;
procedure FormCreate(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
SYSTEM_HANDLE_INFORMATION = packed record
ProcessId: DWORD;
ObjectTypeNumber: Byte;
Flags: Byte;
Handle: Word;
pObject: Pointer;
GrantedAccess: DWORD;
end;
PSYSTEM_HANDLE_INFORMATION = ^SYSTEM_HANDLE_INFORMATION;
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;
PGetFileNameThreadParam = ^TGetFileNameThreadParam;
TGetFileNameThreadParam = packed record
hFile: THandle;
Data: array [0..MAX_PATH - 1] of Char;
Status: NT_STATUS;
end;
//**************************************************************************
var SystemHandleInformation:SYSTEM_HANDLE_INFORMATION;
Form1: TForm1;
function GetLongPathNameA(lpszShortPath, lpszLongPath: PChar;
cchBuffer: DWORD): DWORD; stdcall; external kernel32;
function NtQueryObject(ObjectHandle: THandle;
ObjectInformationClass: DWORD; ObjectInformation: Pointer;
ObjectInformationLength: ULONG;
ReturnLength: PDWORD): NT_STATUS; stdcall; external "ntdll.dll";
function NtQueryInformationFile(FileHandle: THandle;
IoStatusBlock: PIO_STATUS_BLOCK; FileInformation: Pointer;
Length: DWORD; FileInformationClass: DWORD): NT_STATUS;
stdcall; external "ntdll.dll";
function ZwQuerySystemInformation(ASystemInformationClass: DWORD;
ASystemInformation: Pointer; ASystemInformationLength: DWORD;
AReturnLength: PDWORD): NT_STATUS; stdcall; external "ntdll.dll";
implementation
{$R *.dfm}
//**************************************************************************
function GetInfoTable(ATableType: DWORD): Pointer;
const STATUS_INFO_LENGTH_MISMATCH = NT_STATUS($C0000004);
var
dwSize: DWORD;
pPtr: Pointer;
ntStatus: NT_STATUS;
begin
Result := nil;
dwSize := WORD(-1);
GetMem(pPtr, dwSize);
ntStatus := ZwQuerySystemInformation(ATableType, pPtr, dwSize, nil);
while ntStatus = STATUS_INFO_LENGTH_MISMATCH do
begin
dwSize := dwSize * 2;
ReallocMem(pPtr, dwSize);
ntStatus := ZwQuerySystemInformation(ATableType, pPtr, dwSize, nil);
end;
if ntStatus = NT_STATUS($00000000){STATUS_SUCCESS} then
Result := pPtr
else
FreeMem(pPtr);
end;
//**************************************************************************
function GetFileHandleType:byte;
var
hFile,r:THANDLE;
Info: PSYSTEM_HANDLE_INFORMATION_EX;
begin
result:=0;
hFile := CreateFile("NUL", GENERIC_READ, 0, 0, OPEN_EXISTING, 0, 0);
if (hFile <> INVALID_HANDLE_VALUE) then begin
Info := GetInfoTable(16{SystemHandleInformation});
if (Info<>nil) then
for r:=0 to Info.NumberOfHandles do begin
if ((Info.Information[r].Handle = hFile) and
(Info.Information[r].ProcessId = GetCurrentProcessId)) then begin
result:=info.Information[r].ObjectTypeNumber;
// Result := ;
break;
end;
end;
end;
FreeMem(Info);
CloseHandle(hFile);
end;
← →
Виталий (2009-04-24 17:14) [21]Продолжение:
//**************************************************************************
function GetFileNameThread(lpParameters: Pointer): DWORD; stdcall;
const FileNameInformation = 9; ObjectNameInformation = 1;
var
FileNameInfo: FILE_NAME_INFORMATION;
ObjectNameInfo: TOBJECT_NAME_INFORMATION;
IoStatusBlock: IO_STATUS_BLOCK;
pThreadParam: TGetFileNameThreadParam;
dwReturn: DWORD;
begin
ZeroMemory(@FileNameInfo, SizeOf(FILE_NAME_INFORMATION));
pThreadParam := PGetFileNameThreadParam(lpParameters)^;
Result := NtQueryInformationFile(pThreadParam.hFile, @IoStatusBlock,
@FileNameInfo, MAX_PATH * 2, FileNameInformation);
if Result = NT_STATUS($00000000){STATUS_SUCCESS} then
begin
Result := NtQueryObject(pThreadParam.hFile, ObjectNameInformation,
@ObjectNameInfo, MAX_PATH * 2, @dwReturn);
if Result = NT_STATUS($00000000){STATUS_SUCCESS} then
begin
pThreadParam.Status := Result;
WideCharToMultiByte(CP_ACP, 0,
@ObjectNameInfo.Name.Buffer[ObjectNameInfo.Name.MaximumLength -
ObjectNameInfo.Name.Length],
ObjectNameInfo.Name.Length, @pThreadParam.Data[0],
MAX_PATH, nil, nil);
end
else
begin
pThreadParam.Status := NT_STATUS($00000000){STATUS_SUCCESS};
Result := NT_STATUS($00000000){STATUS_SUCCESS};
WideCharToMultiByte(CP_ACP, 0,
@FileNameInfo.FileName[0], IoStatusBlock.Information,
@pThreadParam.Data[0],
MAX_PATH, nil, nil);
end;
end;
PGetFileNameThreadParam(lpParameters)^ := pThreadParam;
ExitThread(Result);
end;
//**************************************************************************
//**************************************************************************
function GetFileNameFromHandle(hFile: THandle): String;
var
lpExitCode: DWORD;
pThreadParam: TGetFileNameThreadParam;
hThread: THandle;
begin
Result := "";
ZeroMemory(@pThreadParam, SizeOf(TGetFileNameThreadParam));
pThreadParam.hFile := hFile;
hThread := CreateThread(nil, 0, @GetFileNameThread, @pThreadParam, 0, PDWORD(nil)^);
if hThread <> 0 then
try
case WaitForSingleObject(hThread, 100) of
WAIT_OBJECT_0:
begin
GetExitCodeThread(hThread, lpExitCode);
if lpExitCode = NT_STATUS($00000000){STATUS_SUCCESS} then
Result := pThreadParam.Data;
end;
WAIT_TIMEOUT:
TerminateThread(hThread, 0);
end;
finally
CloseHandle(hThread);
end;
end;
//**************************************************************************
procedure TForm1.FormCreate(Sender: TObject);
var SystemInformation: PSYSTEM_PROCESS_INFORMATION;
pHandleInfo: PSYSTEM_HANDLE_INFORMATION_EX;
b:byte; i:integer; s:String;
begin {
SystemInformation:= GetInfoTable(5);
if SystemInformation <> nil then
pHandleInfo := GetInfoTable(16);
caption:=inttostr(pHandleInfo^.NumberOfHandles);
//********* FOR ******************
b:=GetFileHandleType;
for i:=0 to pHandleInfo^.NumberOfHandles do
begin
if pHandleInfo^.Information[i].ObjectTypeNumber=b then
begin
ListBox1.Items.Add(inttostr(pHandleInfo^.Information[i].Handle));
end;
end;
//******* END FOR ****************{}
end;
function GetHandlesFileFromPID(PID:cardinal):string;
var SystemInformation: PSYSTEM_PROCESS_INFORMATION;
pHandleInfo: PSYSTEM_HANDLE_INFORMATION_EX;
b:byte; i:integer; s:String;
cp,hp:Cardinal;hFile: THandle;
begin
b:=GetFileHandleType;
SystemInformation:= GetInfoTable(5);
if SystemInformation <> nil then
pHandleInfo := GetInfoTable(16);
for I := 0 to pHandleInfo^.NumberOfHandles - 1 do
begin
if pHandleInfo^.Information[I].ObjectTypeNumber = b then
begin
hP := OpenProcess(PROCESS_DUP_HANDLE, True,
pHandleInfo^.Information[I].ProcessId);
if hP > 0 then
try
if DuplicateHandle(hP, pHandleInfo^.Information[I].Handle,
GetCurrentProcess, @hFile, 0, False, DUPLICATE_SAME_ACCESS) then
try
if Application.Terminated then Exit;
s := GetFileNameFromHandle(hFile);
// caption:=IntToStr(cp);
if (trim(s)<>"")and(pHandleInfo^.Information[I].ProcessId=PID) then
result:=result+(inttostr(pHandleInfo^.Information[I].ProcessId)+" "+s)
+#10#13;
finally
CloseHandle(hFile);
end;
finally
CloseHandle(hP);
end;
end;
Application.ProcessMessages;
end;
end;
//**************************************************************************
procedure TForm1.Timer1Timer(Sender: TObject);
begin
ListBox1.Items.Text:=GetHandlesFileFromPID(2756);
end;
end.
← →
AHTOLLlKA (2009-04-24 17:45) [22]Виталий
вроде бы это то что нужно!!
спасибо большое за код, буду проверять
← →
Игорь Шевченко © (2009-04-24 21:50) [23]Виталий (24.04.09 17:13) [20]
А Руссинович с Когсуэллом - позорные чайники
← →
AHTOLLlKA (2009-04-25 08:10) [24]Игорь Шевченко
у русиновича вроде там через драйвер все это делаеться.... и это не катит в данной ситуации...
пример работает но проблема в том что он перебирает все хендлы и медлен поэтому..
гворят есть способ через открытие процеса и последущим дублирования его хендлов... вот только как я хз ... кто что подскажет ??
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2010.10.03;
Скачать: [xml.tar.bz2];
Память: 0.53 MB
Время: 0.006 c