Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Узнать хендлы открытых процессом файлов [D6, WinXP]


Страницы:   1 2

Виталий ©   (2008-04-10 14:57:00) 

Уважаемые мастера, подскажите пожалуйста как по номеру процесса получить хендлы и пути файлов, которые он открыл?
Если можно скажите какая последовательность вызовов функций  должна быть и какие точно функции для этого нужны

Заранее спасибо.


Rouse_   (2008-04-11 16:46:00) [21]


> Riply ©   (11.04.08 16:34) [15]

Т.к. нужно искать только файловые хэндлы, то перед вызовом NtQueryObject нужно сказать NtQueryInformationFile и проверить результат, если STATUS_SUCCESS, то повиснуть не должны ;)
Т.е. что-то вроде этого:

 function GetFileNameThread(lpParameters: Pointer): DWORD; stdcall;
 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 = STATUS_SUCCESS then
   begin
     Result := NtQueryObject(pThreadParam.hFile, ObjectNameInformation,
       @ObjectNameInfo, MAX_PATH * 2, @dwReturn);
     if Result = 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 := STATUS_SUCCESS;
       Result := 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 = STATUS_SUCCESS then
           Result := pThreadParam.Data;
       end;
       WAIT_TIMEOUT:
         TerminateThread(hThread, 0);
     end;
   finally
     CloseHandle(hThread);
   end;
 end;


Я ж тебе помоемому давал уже этот код...


Riply   (2008-04-11 16:42:00) [22]

> [16] slow!alfamoon!com   (11.04.08 16:36)
> 2 Riply собственно вариант решения это запрос в отдельном потоке,
> был предложен еще давно и ничего нового не придумано

Терминирование нити ?
Я не считаю это за "вариант решения". IMHO, так некузяво, что дальше некуда :)
Кто-то из форумчан хорошо по этому поводу сказал: "Ведь по живому режешь".
Я с ним согласна :)


slow!alfamoon!com   (2008-04-11 16:36:00) [23]

2 Riply собственно вариант решения это запрос в отдельном потоке, был предложен еще давно и ничего нового не придумано


Riply   (2008-04-11 16:34:00) [24]

> [13] Rouse_ ©   (11.04.08 15:50)
> С пайпами проблема не решилась :) Как висели так и висят :) Надо просто уметь их идентифицировать :)

Сколько не билась над их идентификацией (имея на руках только информацию от NtQuerySystemInformation), ничего у меня не вышло :(.
На самом незначительном запросе - висла.
Саш, подскажи как надо делать.


slow!alfamoon!com   (2008-04-11 15:57:00) [25]


> Напомни, пожалуйста, на основании чего ты считаешь, что
> она решилась ?
>

в каком-то обсуждении на wasm.ru вроде пробегало, надо посмотреть будет.


Rouse_   (2008-04-11 15:50:00) [26]

С пайпами проблема не решилась :) Как висели так и висят :) Надо просто уметь их идентифицировать :)


Виталий   (2008-04-11 12:47:00) [27]

Riply, slow!alfamoon!com - Спасибо за примеры. хоть кто-то не издевается, оказывается есть еще тут нормальные люди.

Собсно почитал МС-Рема и Багеля, и решил проблему. Кстати Пайпы меня не интересуют, только физические файлы.


Riply   (2008-04-10 22:04:00) [28]

> [10] slow!alfamoon!com   (10.04.08 18:14)
> Riply: вроде проблема с пайпами в сп2 решилась, или я неправильно помню?

Давно это было, но до сих пор пайповая проблемма сидит у меня в голове с меткой "не решенная" :)
Напомни, пожалуйста, на основании чего ты считаешь, что она решилась ?


slow!alfamoon!com   (2008-04-10 18:14:00) [29]

Riply: вроде проблема с пайпами в сп2 решилась, или я неправильно помню?
Автор: http://slow.alfamoon.com/?module=filesdb&id=1&fid=12&get=1только тут про сокеты, это тоже файлы, и для всех процессов, так что добавишь фильтрацию по PID нужного процесса


Riply   (2008-04-10 17:22:00) [30]

>  [8] Riply ©   (10.04.08 17:21)

P.P.S.
Будь осторожен с Pipe -ми :)


Riply   (2008-04-10 17:21:00) [31]

> [0] Виталий   (10.04.08 14:57)
> подскажите пожалуйста как по номеру процесса получить хендлы и пути файлов, которые он открыл?

Попробуй с помощью следующих функций:

NtQuerySystemInformation(..,SystemHandleInformation,..)
DuplicateHandle
NtQueryObject

P.S.
Возможно, вместо NtQuerySystemInformation, можно использовать NtQueryInformationProcess для конкретного процесса.
Не знаю, надо смотреть.


Сергей М.   (2008-04-10 16:40:00) [32]

Ну раз ты на ходу меняешь формулировку задачи, то как всегда)


Виталий   (2008-04-10 16:36:00) [33]

В курсе, только мне не только ВинОфис нужно отлавливать а любую программу, окно которой активно в данный момент. Ворд это я к примеру.
Ладно Ворд не нравится, возьмем Сполайт. Он то не сообщит о себе.

Ты лучше скажи знаеш как это делать или как всегда в гугль идти?


Сергей М.   (2008-04-10 16:14:00) [34]

Ты в курсе, что WinWord являет собой полноценный сервер OLE-автоматизации, (который способен самсообщить о файлах, с которыми он работает, если его об этом спросят на его языке) ?

Или ты про такую слыхом не слыхивал ?


Виталий   (2008-04-10 15:43:00) [35]

Это для сбора информации кто какой пользователь с чем работает


Виталий   (2008-04-10 15:43:00) [36]

Я хочу программно получить путь к файлу который открыт в Ворде.
Я запускаю свою программу нахожу процесс WinWord и хочу увидеть какой файл(ы) он открыл


Сергей М.   (2008-04-10 15:12:00) [37]

И что ты с ними намерен делать ?

Ты их потерял что ли ?)


Виталий   (2008-04-10 14:57:00) [38]

О еще, может процессы где то в себе держат этот список, как его получить?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо