Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.10.03;
Скачать: CL | DM;

Вниз

Поиск хэндла.   Найти похожие ветки 

 
_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 вся ветка

Текущий архив: 2010.10.03;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.008 c
10-1168342746
Priest
2007-01-09 14:39
2010.10.03
Как определить путь к dll библиотеки com сервера


3-1245770351
ancot
2009-06-23 19:19
2010.10.03
TADOTable + Post = Exception


15-1278398042
И. Павел
2010-07-06 10:34
2010.10.03
Порекомендуйте библиотеку для отчетов


2-1278410497
GanibalLector
2010-07-06 14:01
2010.10.03
Hint в TStringGrid


2-1278159774
alex810
2010-07-03 16:22
2010.10.03
Запрос с нечувствительностью к регистру