В статье будет рассмотрен процесс работы с 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. Для этого потребуется токен процесса, к которому можно добавить нужный привилегий.
Шаги для решения задачи
Получение токена процесса с помощью функции OpenProcessToken.
Изменение привилегий токена с помощью AdjustTokenPrivileges, что позволит включить SE_MANAGE_VOLUME_NAME.
Вызов 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
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.