Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Разработка приложения на Delphi: работа с открытыми файлами и ручками

Delphi , Интернет и Сети , Браузер

При разработке приложений на 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




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Браузер ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-04-29 09:52:55/0.0035409927368164/0