При работе с Event Tracing for Windows (ETW) в среде разработки Delphi, пользователь столкнулся с ошибкой ERROR_INVALID_PARAMETER при вызове функции StartTrace. Эта ошибка может возникать по нескольким причинам, среди которых:
Properties является NULL.
SessionHandle равен NULL.
Неверный LogFileNameOffset или LoggerNameOffset в структуре Properties.
Неверное сочетание флагов в LogFileMode.
Wnode.Guid установлен в SystemTraceControlGuid, но SessionName не равен KERNEL_LOGGER_NAME.
Контекст и решение проблемы
Пользователь предоставил код на Object Pascal (Delphi), который выделяет память для структуры EVENT_TRACE_PROPERTIES, инициализирует её и копирует в неё имена файла и логгера. Однако, при вызове функции StartTrace возвращается ошибка ERROR_INVALID_PARAMETER.
Проблема была в том, что данные после структуры EVENT_TRACE_PROPERTIES должны быть выровнены по 8-байтному границе, что не выполнялось в исходном коде. Для решения этой проблемы был написан функционал Pad, который округляет размер данных до ближайшего 8-байтного блока. После этого, в коде были сделаны соответствующие изменения для использования этой функции, что позволило корректно выровнять данные и успешно вызвать StartTrace.
Пример кода на Object Pascal (Delphi)
function Pad(length: Cardinal): Cardinal;
var
m: Integer;
const
DataAlignment = 8; // Выравнивание данных по 8-байтным границам
begin
Result := length;
m := length mod DataAlignment;
if (m > 0) then
Result := result + DataAlignment - m;
end;
procedure StartKernelLogging;
var
sessionProperties: PEVENT_TRACE_PROPERTIES;
bufferSize: Int64;
loggerName: AnsiString;
logFilePath: AnsiString;
th: TRACEHANDLE;
hr: Cardinal;
begin
loggerName := KERNEL_LOGGER_NAME;
logFilePath := 'C:\Users\Ian\foo.etl';
bufferSize := sizeof(EVENT_TRACE_PROPERTIES)
+ Pad(Length(loggerName)+1)
+ Pad(Length(logFilePath)+1);
sessionProperties := AllocMem(bufferSize);
ZeroMemory(sessionProperties, bufferSize);
sessionProperties.Wnode.BufferSize := bufferSize;
sessionProperties.Wnode.Flags := WNODE_FLAG_TRACED_GUID;
sessionProperties.Wnode.ClientContext := 1; // QPC clock resolution
sessionProperties.Wnode.Guid := SystemTraceControlGuid;
// ... (инициализация остальных полей sessionProperties)
sessionProperties.LoggerNameOffset := Pad(sizeof(EVENT_TRACE_PROPERTIES));
sessionProperties.LogFileNameOffset := Pad(sizeof(EVENT_TRACE_PROPERTIES)) + Pad(Length(loggerName)+1);
// Копирование строк в структуру
MoveMemory(Pointer(Cardinal(sessionProperties)+sessionProperties.LoggerNameOffset), PAnsiChar(loggerName), Length(loggerName)+1);
MoveMemory(Pointer(Cardinal(sessionProperties)+sessionProperties.LogFileNameOffset), PAnsiChar(logFilePath), Length(logFilePath)+1);
// ... (дальнейшие действия, включая вызов StartTrace)
end;
Заключение
Ошибка ERROR_INVALID_PARAMETER при вызове функции StartTrace в Delphi может быть вызвана некорректным выравниванием данных после структуры EVENT_TRACE_PROPERTIES. Использование функции Pad позволяет решить эту проблему, выровняв данные по 8-байтной границе. Это необходимо для корректной работы с ETW трассировкой в Windows.
Пользователь столкнулся с технической проблемой при работе с Event Tracing for Windows (ETW) в среде разработки Delphi, связанной с ошибкой `ERROR_INVALID_PARAMETER` из-за неправильного выравнивания данных в памяти.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.