Конференция "WinAPI" » Поиск хэндла.
 
  • _bass (26.02.09 19:38) [0]
    Здравствуйте.

    Подскажите пожалуйста, как найти определенный хендл (по его имени в процессе). Программно, естественно.

    Спасибо.
  • _bass (26.02.09 19:40) [1]
    Имелось ввиду:

    *...определенный хендл (по его имени) в процессе.
  • {RASkov} © (26.02.09 19:51) [2]
    что такое имя хендла?
  • _bass (26.02.09 19:55) [3]
    Название.
    Например, его можно посмотреть программой Process Explorer (Sysinternals).
  • Rouse_ © (26.02.09 21:51) [4]
    Перебрать хэндлы процесса, сказать на каждый NtQueryObject и сравнить :)
    Примерный код тут: http://rouse.drkb.ru/winapi.php#enumopenfiles
  • _bass (26.02.09 22:55) [5]
    Спасибо.

    Код еще не изучал, но программа не выводит список открытых файлов.
  • Игорь Шевченко © (26.02.09 23:54) [6]

    > Подскажите пожалуйста, как найти определенный хендл (по
    > его имени в процессе). Программно, естественно.


    Нафига ?
  • KSergey © (27.02.09 08:35) [7]
    > _bass   (26.02.09 19:38)  
    > Подскажите пожалуйста, как найти определенный хендл

    А хендл чего именно нужен?
  • Rouse_ © (27.02.09 11:34) [8]

    > Код еще не изучал, но программа не выводит список открытых
    > файлов.

    Оны выводит список соответствий хэндл-файл. Если файл открыт в мемо - это еще не означает что хендл на него все еще живой :)
  • _bass (27.02.09 20:39) [9]
    KSergey,

    Нужно найти ивент (хендл) с определенным названием и его 'убить' (закрыть).
  • Игорь Шевченко © (27.02.09 21:42) [10]

    > Нужно найти ивент (хендл) с определенным названием и его
    > 'убить' (закрыть).


    В чужом процессе это будет сложно сделать - надо туда внедряться или через драйвер
  • DVM © (27.02.09 22:07) [11]

    > {RASkov} ©   (26.02.09 19:51) [2]
    >
    > что такое имя хендла?

    - Название этой песни называется "Пуговки для сюртуков".
    - Простите, вы хотели сказать это песня так называется.
    - Нет, это название песни так называется, а сама песня называется "Древний старичок"

    (С) Л. Кэрролл.
  • _bass (27.02.09 22:44) [12]
    'тупо внедряться' а далее по какому принципу?
  • Игорь Шевченко © (28.02.09 13:51) [13]
    Вопрос "нафига" был задан совсем не зря. Может быть, есть более простое решение, но, раз неизвестно, зачем нужно закрывать event, то и путей нету.
  • _bass (28.02.09 15:11) [14]
    Евент нужно закрывать для обхода защиты у некоторого приложения. Другого, более простого решения, к сожалению, нет.
  • Игорь Шевченко © (28.02.09 15:47) [15]

    > Евент нужно закрывать для обхода защиты у некоторого приложения


    Тут я не помощник
  • имя (28.02.09 22:33) [16]
    Удалено модератором
  • AHTOLLlKA (24.04.09 11:05) [17]
    апну тему....
    ибо тоже уже четвыртый день мучаюсь.. нужен код....
    пример что дали выше поиск файлов.. медленен ибо он ищет везде...

    ктонить может помочь кодом который ищет открытые файлы у определенного процеса....

    как в процес эксплорер сделано...

    помогите очень запарился.... =((
  • Игорь Шевченко © (24.04.09 11:25) [18]

    > как в процес эксплорер сделано...


    Через драйвер PROCEXP111.SYS
  • AHTOLLlKA (24.04.09 11:31) [19]
    а в юзер моде как нить можно??
  • Виталий (24.04.09 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;

  • Виталий (24.04.09 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 (24.04.09 17:45) [22]
    Виталий
    вроде бы это то что нужно!!
    спасибо большое за код, буду проверять
  • Игорь Шевченко © (24.04.09 21:50) [23]
    Виталий   (24.04.09 17:13) [20]

    А Руссинович с Когсуэллом - позорные чайники
  • AHTOLLlKA (25.04.09 08:10) [24]
    Игорь Шевченко
    у русиновича вроде там через драйвер все это делаеться.... и это не катит в данной ситуации...

    пример работает но проблема в том что он перебирает все хендлы и медлен поэтому..

    гворят есть способ через открытие процеса и последущим дублирования его хендлов... вот только как я  хз ... кто что подскажет ??
 
Конференция "WinAPI" » Поиск хэндла.
Есть новые Нет новых   [134435   +38][b:0][p:0.008]