Понимание функции GetTokenInformation() и определение размера буфера
Функция GetTokenInformation() из Windows API используется для получения информации о токене безопасности. Одним из часто встречающихся вопросов при работе с этой функцией является необходимость выполнения двух вызовов: первый для определения размера буфера, а второй — для получения самой информации.
Зачем нужно два вызова?
В первом вызове функция GetTokenInformation() не заполняет буфер данными, а возвращает размер буфера, необходимый для хранения информации, указанной в параметре TokenInformationClass. Это необходимо, потому что некоторые структуры, которые функция может заполнить, содержат указатели на данные переменной длины, например, SID (Security Identifier), который имеет переменную длину.
Пример кода на Object Pascal (Delphi)
var
TokenUser: TOKEN_USER;
dwReturnLength: DWORD;
begin
// Первый вызов для определения размера буфера
if not GetTokenInformation(
hToken, // Указатель на токен безопасности
TOKEN_INFORMATION_CLASS(TOKEN_USER),
@TokenUser, // Указатель на структуру TOKEN_USER
0, // Размер буфера (0, так как буфер еще не выделен)
dwReturnLength // Выходной параметр для размера буфера
) then
begin
// Проверка на ошибку недостаточного размера буфера
if GetLastError() <> ERROR_INSUFFICIENT_BUFFER then
Exit; // Ошибка, не связанная с недостаточным размером буфера
end;
// Выделение памяти для буфера размером в dwReturnLength
GetMem(TokenUser, dwReturnLength);
// Второй вызов для получения информации о токене
if not GetTokenInformation(
hToken, // Указатель на токен безопасности
TOKEN_INFORMATION_CLASS(TOKEN_USER),
@TokenUser, // Указатель на структуру TOKEN_USER
dwReturnLength, // Размер выделенного буфера
dwReturnLength // Выходной параметр для размера использованных данных
) then
begin
// Обработка ошибки
end;
// ... дальнейшая обработка данных ...
FreeMem(TokenUser, dwReturnLength); // Освобождение памяти
end;
Почему это важно?
Понимание необходимости двух вызовов функции GetTokenInformation() важно для правильной работы с токенами безопасности в операционных системах семейства Windows. Неправильный расчет размера буфера может привести к ошибкам, таким как ERROR_INSUFFICIENT_BUFFER, что делает программу уязвимой к ошибкам и повышает риск сбоев.
Заключение
Используя примеры кода на Object Pascal, разработчики на Delphi могут правильно интегрировать функцию GetTokenInformation() в свои проекты, обеспечивая корректную работу с токенами безопасности и предотвращая потенциальные ошибки, связанные с управлением памятью.
Функция `GetTokenInformation()` в Windows API используется для получения информации о токене безопасности, требуя двойного вызова: сначала для определения размера необходимого буфера, а затем для чтения самой информации.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.