Поделиться через


Функция EtwWrite (wdm.h)

Функция EtwWrite — это функция трассировки для публикации событий в коде драйвера в режиме ядра.

Синтаксис

NTSTATUS EtwWrite(
  [in]           REGHANDLE              RegHandle,
  [in]           PCEVENT_DESCRIPTOR     EventDescriptor,
  [in, optional] LPCGUID                ActivityId,
  [in]           ULONG                  UserDataCount,
  [in, optional] PEVENT_DATA_DESCRIPTOR UserData
);

Параметры

[in] RegHandle

Указатель на дескриптор регистрации поставщика событий, который возвращается функцией EtwRegister в случае успешной регистрации поставщика событий.

[in] EventDescriptor

Указатель на структуру EVENT_DESCRIPTOR .

[in, optional] ActivityId

Идентификатор, указывающий действие, связанное с событием. ActivityID предоставляет способ группировки связанных событий и используется для сквозной трассировки.

[in] UserDataCount

Количество EVENT_DATA_DESCRIPTOR структур в UserData.

[in, optional] UserData

Указатель на массив EVENT_DATA_DESCRIPTOR структур.

Возвращаемое значение

Если событие было успешно опубликовано, функция EtwWrite возвращает STATUS_SUCCESS.

Если указатель на дескриптор регистрации поставщика событий недопустим, функция EtwWrite возвращает STATUS_INVALID_HANDLE. Поставщик событий должен быть зарегистрирован перед вызовом EtwWrite . EtwWrite также может возвращать STATUS_INVALID_HANDLE, если не удается записать событие в журнал.

Если число EVENT_DATA_DESCRIPTOR структур, указанных в UserDataCount , превышает максимально допустимое значение (128), функция EtwWrite возвращает STATUS_INVALID_PARAMETER.

Если параметр ActivityID указан, но доступной памяти для записи в журнал данных, связанных с событием, функция EtwWrite возвращает STATUS_NO_MEMORY.

Если поставщик не включен для какого-либо сеанса, функция EtwWrite возвращает STATUS_SUCCESS и события не регистрируются.

События могут быть потеряны по ряду причин; например, если частота событий слишком высока или размер события больше размера буфера. В таких случаях счетчик EventsLost , член структуры EVENT_TRACE_PROPERTIES для соответствующего средства ведения журнала, обновляется с учетом количества событий, которые не были записаны.

Комментарии

Функция EtwWrite является эквивалентом функции EventWrite в пользовательском режиме. Чтобы убедиться, что для публикуемого события есть потребитель, можно перед вызовом EtwWrite вызвать EtwEventEnabled или EtwProviderEnabled.

Перед вызовом функции EtwWrite для публикации события необходимо зарегистрировать поставщик в EtwRegister. Не следует выполнять вызовы трассировки, которые выходят за пределы кода, ограниченного функциями EtwRegister и EtwUnregister . Для достижения наилучшей производительности можно вызвать функцию EtwRegister в процедуре DriverEntry и функцию EtwUnregister в процедуре DriverUnload .

Если вы используете необязательный параметр UserData в функции EtwWrite для регистрации дополнительных данных событий, можно использовать макрос EventDataDescCreate , чтобы упростить создание структур EVENT_DATA_DESCRIPTOR. В следующем примере используется макрос EventDataDescCreate для инициализации EVENT_DATA_DESCRIPTOR структур с именем устройства и его состоянием. Макрос EventDataDescCreate хранит указатели на данные (то есть не хранит копии данных). Указатели должны оставаться действительными до тех пор, пока не будет возвращен вызов etwWrite .

EtwWrite можно вызвать в любом IRQL. Однако если значение IRQL больше APC_LEVEL, все данные, передаваемые в функции EtwWrite, EtwWriteEx, EtwWriteString, EtwWriteTransfer , не должны быть доступны для страниц. Это значит, что любая подпрограмма в режиме ядра, выполняющаяся в IRQL больше APC_LEVEL, не может получить доступ к памяти, доступной для страниц. Данные, передаваемые в функции EtwWrite, EtwWriteEx, EtwWriteString и EtwWriteTransfer , должны находиться в памяти системного пространства, независимо от того, что такое IRQL.

Пример

 
 //
 // Register the provider with ETW in DriverEntry
 // Unregister the provider in DriverUnload 
    //
 //  Build the EVENT_DATA_DESCRIPTOR structures using 
 //   the EventDataDescCreate macros 
 
 if (RegHandle != (REGHANDLE)NULL) {
 //
 // Log an Event with : DeviceNameLength
 //                      DeviceName
 //                      Status
 //
 
 EventDataDescCreate(&EventDataDescriptor[0],
                            (PVOID)&DeviceName.Length,
 sizeof(USHORT));
 

 EventDataDescCreate(&EventDataDescriptor[1],
                            (PVOID)DeviceName.Buffer,
 DeviceName.Length);
 
 EventDataDescCreate(&EventDataDescriptor[2],
                            (PVOID)&Status,
 sizeof(ULONG));
 
 EtwWrite(RegHandle,            // Handle from EtwRegister
                 &StartEvent,          // EventDescriptor
                 NULL,                 // Activity ID
                 3,                    // Number of data items
 EventDataDescriptor); // Array of data descriptors
    }              

//

Требования

Требование Значение
Целевая платформа Универсальное
Верхняя часть wdm.h (включая Wdm.h, Ntddk.h)
Библиотека NtosKrnl.lib
DLL NtosKrnl.exe
IRQL Любой уровень (см. раздел Комментарии).

См. также раздел

EtwEventEnabled

EtwProviderEnabled

EtwRegister

EtwUnregister

EtwWriteEx

EtwWriteString

EtwWriteTransfer

EventDataDescCreate