Compartilhar via


Função EtwWrite (wdm.h)

A função EtwWrite é uma função de rastreamento para publicar eventos no código do driver no modo kernel.

Sintaxe

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

Parâmetros

[in] RegHandle

Um ponteiro para o identificador de registro do provedor de eventos, que é retornado pela função EtwRegister se o registro do provedor de eventos for bem-sucedido.

[in] EventDescriptor

Um ponteiro para a estrutura EVENT_DESCRIPTOR .

[in, optional] ActivityId

O identificador que indica a atividade associada ao evento. A ActivityID fornece uma maneira de agrupar eventos relacionados e é usada no rastreamento de ponta a ponta.

[in] UserDataCount

O número de estruturas de EVENT_DATA_DESCRIPTOR no UserData.

[in, optional] UserData

Um ponteiro para a matriz de estruturas de EVENT_DATA_DESCRIPTOR.

Retornar valor

Se o evento tiver sido publicado com êxito, EtwWrite retornará STATUS_SUCCESS.

Se o ponteiro para o identificador de registro do provedor de eventos for inválido, EtwWrite retornará STATUS_INVALID_HANDLE. O provedor de eventos deve ser registrado antes que o EtwWrite seja chamado. EtwWrite também poderá retornar STATUS_INVALID_HANDLE se não for possível registrar o evento.

Se o número de estruturas de EVENT_DATA_DESCRIPTOR especificadas em UserDataCount for maior que o máximo permitido (128), EtwWrite retornará STATUS_INVALID_PARAMETER.

Se ActivityID for especificado, mas não houver memória suficiente disponível para registrar os dados associados ao evento, EtwWrite retornará STATUS_NO_MEMORY.

Se o provedor não estiver habilitado para nenhuma sessão, o EtwWrite retornará STATUS_SUCCESS e os eventos não serão registrados.

Os eventos podem ser perdidos por vários motivos; por exemplo, se a taxa de eventos for muito alta ou se o tamanho do evento for maior que o tamanho do buffer. Nesses casos, o contador EventsLost , membro da estrutura EVENT_TRACE_PROPERTIES do agente correspondente, é atualizado com o número de eventos que não foram registrados.

Comentários

A função EtwWrite é o equivalente ao modo kernel da função EventWrite do modo de usuário. Para garantir que haja um consumidor para o evento que você está publicando, você pode preceder a chamada para EtwWrite com uma chamada para EtwEventEnabled ou EtwProviderEnabled.

Antes de chamar a função EtwWrite para publicar um evento, registre o provedor com EtwRegister. Nenhuma chamada de rastreamento deve ser feita que fique fora do código delimitado pelas funções EtwRegister e EtwUnregister . Para obter o melhor desempenho, você pode chamar a função EtwRegister em sua rotina DriverEntry e a função EtwUnregister em sua rotina DriverUnload .

Se você estiver usando o parâmetro UserData opcional na função EtwWrite para registrar dados de evento adicionais, poderá usar a macro EventDataDescCreate para simplificar a criação das estruturas de EVENT_DATA_DESCRIPTOR. O exemplo a seguir usa a macro EventDataDescCreate para inicializar estruturas EVENT_DATA_DESCRIPTOR com o nome do dispositivo e seu status. A macro EventDataDescCreate armazena ponteiros para os dados (ou seja, ele não armazena cópias dos dados). Os ponteiros devem permanecer válidos até que a chamada para EtwWrite retorne.

Você pode chamar EtwWrite em qualquer IRQL. No entanto, quando IRQL é maior que APC_LEVEL, todos os dados passados para as funções EtwWrite, EtwWriteEx, EtwWriteString, EtwWriteTransfer não devem ser pagináveis. Ou seja, qualquer rotina de modo kernel em execução no IRQL maior que APC_LEVEL não pode acessar a memória paginável. Os dados passados para as funções EtwWrite, EtwWriteEx, EtwWriteString e EtwWriteTransfer devem residir na memória do espaço do sistema, independentemente do que seja o IRQL.

Exemplo

 
 //
 // 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
    }              

//

Requisitos

Requisito Valor
Plataforma de Destino Universal
Cabeçalho wdm.h (inclua Wdm.h, Ntddk.h)
Biblioteca NtosKrnl.lib
DLL NtosKrnl.exe
IRQL Qualquer nível (consulte a seção Comentários.)

Confira também

EtwEventEnabled

EtwProviderEnabled

EtwRegister

EtwUnregister

EtwWriteEx

EtwWriteString

EtwWriteTransfer

EventDataDescCreate