![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Узнать хендлы открытых процессом файлов [D6, WinXP]
Виталий © (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]О еще, может процессы где то в себе держат этот список, как его получить?