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

Работа с API `CreateFile` и `SetFileValidData` в среде Delphi: Практические примеры

Delphi , Синтаксис , Справочник по API-функциям

В статье будет рассмотрен процесс работы с API CreateFile и SetFileValidData в среде разработки Delphi, с акцентом на использование привилегии SE_MANAGE_VOLUME_NAME. Это необходимо для корректной работы с функцией SetFileValidData, которая требует, чтобы файловый дескриптор был открыт с указанным привилегием. Пример будет написан на Object Pascal, языке программирования, используемом в Delphi.

Работа с API CreateFile и SetFileValidData в среде Delphi: Практические примеры

Введение

В процессе разработки программного обеспечения на Delphi иногда возникает необходимость работы с низкоуровневыми функциями операционной системы, такими как CreateFile и SetFileValidData. Для корректной работы с этими функциями важно понимать, как настраивать привилегии процесса.

Проблема

Для использования функции SetFileValidData необходимо, чтобы файловый дескриптор был получен с привилегием SE_MANAGE_VOLUME_NAME. Однако процесс включения этого привилегия может показаться сложным для понимания.

Решение

Чтобы включить привилегию SE_MANAGE_VOLUME_NAME, необходимо использовать функцию AdjustTokenPrivileges перед вызовом CreateFile. Для этого потребуется токен процесса, к которому можно добавить нужный привилегий.

Шаги для решения задачи

  1. Получение токена процесса с помощью функции OpenProcessToken.
  2. Изменение привилегий токена с помощью AdjustTokenPrivileges, что позволит включить SE_MANAGE_VOLUME_NAME.
  3. Вызов CreateFile для открытия файла с необходимым привилегием.

Пример кода на Object Pascal

uses
  Winapi.Windows,
  Winapi.Secur32;

function GetTokenHandle(var TokenHandle: THandle): Boolean;
var
  ProcessHandle: THandle;
begin
  ProcessHandle := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_OPERATION, False, GetCurrentProcessId);
  if OpenProcessToken(ProcessHandle, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, TokenHandle) = 0 then
    Exit(False);
  CloseHandle(ProcessHandle);
  Result := True;
end;

function EnablePrivilege(TokenHandle: THandle; PrivilegeName: PChar): Boolean;
var
  Privilege: TTOKEN_PRIVILEGE;
  Lookup: TTOKEN_PRIVILEGE_PARMS;
  PrivName: PCHAR;
  PrivNameLen: DWORD;
begin
  PrivName := PrivilegeName;
  PrivNameLen := Length(PrivilegeName);
  Lookup.LookupPrivilegeCount := 1;
  Lookup.IncludeSortedRights := True;
  Lookup.Privileges[0].Luid.LowPart := PSEUDO_HANDLE(PrivName);
  Lookup.Privileges[0].Luid.HighPart := 0;
  Lookup.Privileges[0].Attributes := 0;
  if not LookupPrivilegeValue(nil, PrivName, @Privilege.Luid) then
    Exit(False);
  Privilege.Attributes := SE_PRIVILEGE_ENABLED;
  if not AdjustTokenPrivileges(TokenHandle, False, @Lookup, SizeOf(Lookup), nil, nil) then
    Exit(False);
  Result := True;
end;

function CreateFileWithPrivilege(FileName: PChar): THandle;
var
  TokenHandle: THandle;
  Privilege: TTOKEN_PRIVILEGE;
  FileHandle: THandle;
  LastError: DWORD;
begin
  if not GetTokenHandle(TokenHandle) then
    Exit(0);
  if not EnablePrivilege(TokenHandle, 'SeManageVolumeName') then
    Exit(0);
  FileHandle := CreateFile(FileName, GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, nil);
  if FileHandle = INVALID_HANDLE_VALUE then
  begin
    LastError := GetLastError;
    CloseHandle(TokenHandle);
    RaiseLastOSError(LastError, SynthErrorMessage(ResFileName, 'Err_FileOpenFailed', [FileName]));
  end;
  CloseHandle(TokenHandle);
  Result := FileHandle;
end;

begin
  // Пример использования функции CreateFileWithPrivilege
  var FileHandle: THandle;
  FileHandle := CreateFileWithPrivilege('C:\path\to\file.txt');
  // Дальнейшие действия с файлом
end;

Заключение

Использование привилегий API требует внимательной работы с токенами безопасности и привилегиями процесса. В данном примере представлен код на Object Pascal, который демонстрирует, как включить привилегию SE_MANAGE_VOLUME_NAME для работы с функциями CreateFile и SetFileValidData в среде Delphi.

Дополнительные ресурсы

Для более глубокого понимания работы с привилегиями и токенами безопасности, рекомендуется обратиться к документации MSDN и примерам на Stack Overflow.

Создано по материалам из источника по ссылке.

Статья описывает процесс работы с API функций `CreateFile` и `SetFileValidData` в среде разработки Delphi, акцентируя внимание на необходимости использования привилегии `SE_MANAGE_VOLUME_NAME` для корректной работы с этими функциями, с примерами на Objec


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




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


:: Главная :: Справочник по API-функциям ::


реклама


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

Время компиляции файла: 2024-12-22 20:14:06
2025-01-13 19:12:00/0.0036280155181885/0