/*++ Copyright (c) Microsoft Corporation. All rights reserved. Module Name: evntprov.h Abstract: This defines the unified provider side user mode API. Revision History: --*/ #ifndef _EVNTPROV_H_ #define _EVNTPROV_H_ #pragma once #ifndef EVNTAPI #ifndef MIDL_PASS #ifdef _EVNT_SOURCE_ #define EVNTAPI __stdcall #else #define EVNTAPI DECLSPEC_IMPORT __stdcall #endif // _EVNT_SOURCE_ #endif // MIDL_PASS #endif // EVNTAPI #ifdef __cplusplus extern "C" { #endif #define EVENT_MIN_LEVEL (0) #define EVENT_MAX_LEVEL (0xff) #define EVENT_ACTIVITY_CTRL_GET_ID (1) #define EVENT_ACTIVITY_CTRL_SET_ID (2) #define EVENT_ACTIVITY_CTRL_CREATE_ID (3) #define EVENT_ACTIVITY_CTRL_GET_SET_ID (4) #define EVENT_ACTIVITY_CTRL_CREATE_SET_ID (5) typedef ULONGLONG REGHANDLE, *PREGHANDLE; #define MAX_EVENT_DATA_DESCRIPTORS (128) #define MAX_EVENT_FILTER_DATA_SIZE (1024) #define EVENT_FILTER_TYPE_SCHEMATIZED (0x80000000) // // EVENT_DATA_DESCRIPTOR is used to pass in user data items // in events. // typedef struct _EVENT_DATA_DESCRIPTOR { ULONGLONG Ptr; // Pointer to data ULONG Size; // Size of data in bytes ULONG Reserved; } EVENT_DATA_DESCRIPTOR, *PEVENT_DATA_DESCRIPTOR; // // EVENT_DESCRIPTOR describes and categorizes an event. // typedef struct _EVENT_DESCRIPTOR { USHORT Id; UCHAR Version; UCHAR Channel; UCHAR Level; UCHAR Opcode; USHORT Task; ULONGLONG Keyword; } EVENT_DESCRIPTOR, *PEVENT_DESCRIPTOR; typedef const EVENT_DESCRIPTOR *PCEVENT_DESCRIPTOR; // // EVENT_FILTER_DESCRIPTOR is used to pass in enable filter // data item to a user callback function. // typedef struct _EVENT_FILTER_DESCRIPTOR { ULONGLONG Ptr; ULONG Size; ULONG Type; } EVENT_FILTER_DESCRIPTOR, *PEVENT_FILTER_DESCRIPTOR; typedef struct _EVENT_FILTER_HEADER { USHORT Id; UCHAR Version; UCHAR Reserved[5]; ULONGLONG InstanceId; ULONG Size; ULONG NextOffset; } EVENT_FILTER_HEADER, *PEVENT_FILTER_HEADER; #ifndef _ETW_KM_ // // Optional callback function that users provide // typedef VOID (NTAPI *PENABLECALLBACK) ( __in LPCGUID SourceId, __in ULONG IsEnabled, __in UCHAR Level, __in ULONGLONG MatchAnyKeyword, __in ULONGLONG MatchAllKeyword, __in_opt PEVENT_FILTER_DESCRIPTOR FilterData, __inout_opt PVOID CallbackContext ); // // Registration APIs // #if (WINVER >= _WIN32_WINNT_VISTA) ULONG EVNTAPI EventRegister( __in LPCGUID ProviderId, __in_opt PENABLECALLBACK EnableCallback, __in_opt PVOID CallbackContext, __out PREGHANDLE RegHandle ); #endif #if (WINVER >= _WIN32_WINNT_VISTA) ULONG EVNTAPI EventUnregister( __in REGHANDLE RegHandle ); #endif // // Control (Is Enabled) APIs // #if (WINVER >= _WIN32_WINNT_VISTA) BOOLEAN EVNTAPI EventEnabled( __in REGHANDLE RegHandle, __in PCEVENT_DESCRIPTOR EventDescriptor ); #endif #if (WINVER >= _WIN32_WINNT_VISTA) BOOLEAN EVNTAPI EventProviderEnabled( __in REGHANDLE RegHandle, __in UCHAR Level, __in ULONGLONG Keyword ); #endif // // Writing (Publishing/Logging) APIs // #if (WINVER >= _WIN32_WINNT_VISTA) ULONG EVNTAPI EventWrite( __in REGHANDLE RegHandle, __in PCEVENT_DESCRIPTOR EventDescriptor, __in ULONG UserDataCount, __in_ecount_opt(UserDataCount) PEVENT_DATA_DESCRIPTOR UserData ); #endif #if (WINVER >= _WIN32_WINNT_VISTA) ULONG EVNTAPI EventWriteTransfer( __in REGHANDLE RegHandle, __in PCEVENT_DESCRIPTOR EventDescriptor, __in_opt LPCGUID ActivityId, __in_opt LPCGUID RelatedActivityId, __in ULONG UserDataCount, __in_ecount_opt(UserDataCount) PEVENT_DATA_DESCRIPTOR UserData ); #endif #if (WINVER >= _WIN32_WINNT_WIN7) ULONG EVNTAPI EventWriteEx( __in REGHANDLE RegHandle, __in PCEVENT_DESCRIPTOR EventDescriptor, __in ULONG64 Filter, __in ULONG Flags, __in_opt LPCGUID ActivityId, __in_opt LPCGUID RelatedActivityId, __in ULONG UserDataCount, __in_ecount_opt(UserDataCount) PEVENT_DATA_DESCRIPTOR UserData ); #endif #if (WINVER >= _WIN32_WINNT_VISTA) ULONG EVNTAPI EventWriteString( __in REGHANDLE RegHandle, __in UCHAR Level, __in ULONGLONG Keyword, __in PCWSTR String ); #endif // // ActivityId Control APIs // #if (WINVER >= _WIN32_WINNT_VISTA) ULONG EVNTAPI EventActivityIdControl( __in ULONG ControlCode, __inout LPGUID ActivityId ); #endif #endif // _ETW_KM_ // // Macros to create Event and Event Data Descriptors // FORCEINLINE VOID EventDataDescCreate( __out PEVENT_DATA_DESCRIPTOR EventDataDescriptor, __in const VOID* DataPtr, __in ULONG DataSize ) { EventDataDescriptor->Ptr = (ULONGLONG)(ULONG_PTR)DataPtr; EventDataDescriptor->Size = DataSize; EventDataDescriptor->Reserved = 0; return; } FORCEINLINE VOID EventDescCreate( __out PEVENT_DESCRIPTOR EventDescriptor, __in USHORT Id, __in UCHAR Version, __in UCHAR Channel, __in UCHAR Level, __in USHORT Task, __in UCHAR Opcode, __in ULONGLONG Keyword ) { EventDescriptor->Id = Id; EventDescriptor->Version = Version; EventDescriptor->Channel = Channel; EventDescriptor->Level = Level; EventDescriptor->Task = Task; EventDescriptor->Opcode = Opcode; EventDescriptor->Keyword = Keyword; return; } FORCEINLINE VOID EventDescZero( __out PEVENT_DESCRIPTOR EventDescriptor ) { memset(EventDescriptor, 0, sizeof(EVENT_DESCRIPTOR)); return; } // // Macros to extract info from an Event Descriptor // FORCEINLINE USHORT EventDescGetId( __in PCEVENT_DESCRIPTOR EventDescriptor ) { return (EventDescriptor->Id); } FORCEINLINE UCHAR EventDescGetVersion( __in PCEVENT_DESCRIPTOR EventDescriptor ) { return (EventDescriptor->Version); } FORCEINLINE USHORT EventDescGetTask( __in PCEVENT_DESCRIPTOR EventDescriptor ) { return (EventDescriptor->Task); } FORCEINLINE UCHAR EventDescGetOpcode( __in PCEVENT_DESCRIPTOR EventDescriptor ) { return (EventDescriptor->Opcode); } FORCEINLINE UCHAR EventDescGetChannel( __in PCEVENT_DESCRIPTOR EventDescriptor ) { return (EventDescriptor->Channel); } FORCEINLINE UCHAR EventDescGetLevel( __in PCEVENT_DESCRIPTOR EventDescriptor ) { return (EventDescriptor->Level); } FORCEINLINE ULONGLONG EventDescGetKeyword( __in PCEVENT_DESCRIPTOR EventDescriptor ) { return (EventDescriptor->Keyword); } // // Macros to set info into an Event Descriptor // FORCEINLINE PEVENT_DESCRIPTOR EventDescSetId( __in PEVENT_DESCRIPTOR EventDescriptor, __in USHORT Id ) { EventDescriptor->Id = Id; return (EventDescriptor); } FORCEINLINE PEVENT_DESCRIPTOR EventDescSetVersion( __in PEVENT_DESCRIPTOR EventDescriptor, __in UCHAR Version ) { EventDescriptor->Version = Version; return (EventDescriptor); } FORCEINLINE PEVENT_DESCRIPTOR EventDescSetTask( __in PEVENT_DESCRIPTOR EventDescriptor, __in USHORT Task ) { EventDescriptor->Task = Task; return (EventDescriptor); } FORCEINLINE PEVENT_DESCRIPTOR EventDescSetOpcode( __in PEVENT_DESCRIPTOR EventDescriptor, __in UCHAR Opcode ) { EventDescriptor->Opcode = Opcode; return (EventDescriptor); } FORCEINLINE PEVENT_DESCRIPTOR EventDescSetLevel( __in PEVENT_DESCRIPTOR EventDescriptor, __in UCHAR Level ) { EventDescriptor->Level = Level; return (EventDescriptor); } FORCEINLINE PEVENT_DESCRIPTOR EventDescSetChannel( __in PEVENT_DESCRIPTOR EventDescriptor, __in UCHAR Channel ) { EventDescriptor->Channel = Channel; return (EventDescriptor); } FORCEINLINE PEVENT_DESCRIPTOR EventDescSetKeyword( __in PEVENT_DESCRIPTOR EventDescriptor, __in ULONGLONG Keyword ) { EventDescriptor->Keyword = Keyword; return (EventDescriptor); } FORCEINLINE PEVENT_DESCRIPTOR EventDescOrKeyword( __in PEVENT_DESCRIPTOR EventDescriptor, __in ULONGLONG Keyword ) { EventDescriptor->Keyword |= Keyword; return (EventDescriptor); } #ifdef __cplusplus } #endif #endif