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

**Разбираемся с ошибкой `ERROR_INVALID_PARAMETER` при использовании `StartTrace` для ETW трассировки в Delphi**

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

Описание проблемы

При работе с 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




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


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


реклама


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

Время компиляции файла: 2024-12-22 20:14:06
2024-12-26 14:27:11/0.0018219947814941/0