При разработке приложений на Delphi иногда возникает необходимость работы с открытыми файлами и ручками процессов. Это может быть полезно для мониторинга активности других приложений, например, при создании системного мониторинга или инструментов для анализа процессов.
Что такое ручки файлов?
Ручки (handles) в операционных системах Windows - это механизм, позволяющий приложениям получать доступ к ресурсам, таким как файлы, устройства и другие объекты. Каждый ручка связан с определенным объектом и имеет определенные права доступа к нему.
Как получить список открытых файлов?
Для получения списка открытых файлов можно использовать функцию NtQuerySystemInformation с параметром SystemHandleInformation, чтобы получить список всех открытых ручек в системе. Затем, для каждой ручки, можно использовать функцию NtQueryObject с параметром ObjectNameInformation, чтобы получить имя файла, связанное с этой ручкой.
Пример кода
Ниже приведен пример кода на Object Pascal (Delphi), который демонстрирует, как можно перебрать все открытые ручки и вывести имена файлов, связанных с этими ручками:
program EnumerateOpenFiles;
{$APPTYPE CONSOLE}
uses
Winapi.Windows,
System.Classes,
JwaNative,
JwaNtStatus,
JwaWinternl;
var
handles_info_size: DWORD;
handles_info: Pointer;
handle_info: Pointer;
process_handle: THandle;
dup_handle: THandle;
obj_name_info: PObjectNameInformation;
obj_name_size: DWORD;
file_name: string;
i: Integer;
procedure EnumerateOpenFiles;
var
handles_info: PSystemHandleInformations;
handles_info_size: DWORD;
retcode: DWORD;
i: Integer;
begin
handles_info_size := HANDLE_BUFFER_INCREASE_CHUNK;
GetMem(handles_info, handles_info_size);
try
retcode := NtQuerySystemInformation(DWORD(SystemHandleInformation), handles_info, handles_info_size, nil);
while retcode = STATUS_INFO_LENGTH_MISMATCH do
begin
handles_info_size := handles_info_size + HANDLE_BUFFER_INCREASE_CHUNK;
SetLength(handles_info, handles_info_size);
retcode := NtQuerySystemInformation(DWORD(SystemHandleInformation), handles_info, handles_info_size, nil);
end;
if retcode <> STATUS_SUCCESS then
Exit;
for i := 0 to handles_info^.HandleCount - 1 do
begin
handle_info := Pointer(Integer(@handles_info^.Handles[0]) + i * SizeOf(TSystemHandleInformation));
if (handle_info^.ObjectTypeNumber = 28) and // Проверка на тип файла
(handle_info^.GrantedAccess = $0012019F) then // Проверка на доступ к файлу
begin
process_handle := OpenProcess(PROCESS_DUP_HANDLE, FALSE, handle_info^.ProcessId);
if process_handle <> 0 then
try
if DuplicateHandle(process_handle, handle_info^.Handle, GetCurrentProcess, @dup_handle, 0, FALSE, 0) then
try
obj_name_size := SizeOf(TObjectNameInformation);
GetMem(obj_name_info, obj_name_size);
retcode := NtQueryObject(dup_handle, ObjectNameInformation, obj_name_info, obj_name_size, @obj_name_size);
if retcode = STATUS_SUCCESS then
begin
file_name := obj_name_info^.Name.Buffer;
// Обработка имени файла
end;
FreeMem(obj_name_info, obj_name_size);
finally
CloseHandle(dup_handle);
end;
finally
CloseHandle(process_handle);
end;
end;
end;
finally
FreeMem(handles_info, handles_info_size);
end;
end;
begin
EnumerateOpenFiles;
Readln;
end.
Этот код является упрощенным примером и не включает обработку всех возможных ошибок и состояний. Также, для полноценной работы, вам потребуется подключить соответствующие единицы и библиотеки, например, JEDI API.
Заключение
Работа с открытыми файлами и ручками в Delphi требует понимания низкоуровневых механизмов операционной системы Windows. Использование функций ядра Windows, таких как NtQuerySystemInformation и NtQueryObject, позволяет получить доступ к этой информации. Приведенный пример кода демонстрирует основные принципы работы с этими функциями.
Разработка приложения на Delphi: работа с открытыми файлами и ручками процессов включает использование функций ядра Windows для мониторинга и анализа активности файлов в системе.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.