Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.004 c
3-1245813402
snake-as
2009-06-24 07:16
2010.10.03
Перенос данных из СУБД MySql в Accessй


2-1278866639
faiwer
2010-07-11 20:43
2010.10.03
Property &amp; var


2-1279059236
AKE
2010-07-14 02:13
2010.10.03
Как поведёт себя команда Readln(F, var1, var2,..., varn)??


15-1278275386
Юрий
2010-07-05 00:29
2010.10.03
С днем рождения ! 5 июля 2010 понедельник


15-1278534584
Юрий
2010-07-08 00:29
2010.10.03
С днем рождения ! 8 июля 2010 четверг





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский