//**********************************************************************` | |
//* This is an include file generated by Message Compiler. *` | |
//* *` | |
//* Copyright (c) Microsoft Corporation. All Rights Reserved. *` | |
//**********************************************************************` | |
#pragma once | |
#include <wmistr.h> | |
#include <evntrace.h> | |
#include "evntprov.h" | |
// | |
// Initial Defs | |
// | |
#if !defined(ETW_INLINE) | |
#define ETW_INLINE DECLSPEC_NOINLINE __inline | |
#endif | |
#if defined(__cplusplus) | |
extern "C" { | |
#endif | |
// | |
// Allow disabling of code generation | |
// | |
#ifndef MCGEN_DISABLE_PROVIDER_CODE_GENERATION | |
#if !defined(McGenDebug) | |
#define McGenDebug(a,b) | |
#endif | |
#if !defined(MCGEN_TRACE_CONTEXT_DEF) | |
#define MCGEN_TRACE_CONTEXT_DEF | |
typedef struct _MCGEN_TRACE_CONTEXT | |
{ | |
TRACEHANDLE RegistrationHandle; | |
TRACEHANDLE Logger; | |
ULONGLONG MatchAnyKeyword; | |
ULONGLONG MatchAllKeyword; | |
ULONG Flags; | |
ULONG IsEnabled; | |
UCHAR Level; | |
UCHAR Reserve; | |
USHORT EnableBitsCount; | |
PULONG EnableBitMask; | |
const ULONGLONG* EnableKeyWords; | |
const UCHAR* EnableLevel; | |
} MCGEN_TRACE_CONTEXT, *PMCGEN_TRACE_CONTEXT; | |
#endif | |
#if !defined(MCGEN_LEVEL_KEYWORD_ENABLED_DEF) | |
#define MCGEN_LEVEL_KEYWORD_ENABLED_DEF | |
FORCEINLINE | |
BOOLEAN | |
McGenLevelKeywordEnabled( | |
_In_ PMCGEN_TRACE_CONTEXT EnableInfo, | |
_In_ UCHAR Level, | |
_In_ ULONGLONG Keyword | |
) | |
{ | |
// | |
// Check if the event Level is lower than the level at which | |
// the channel is enabled. | |
// If the event Level is 0 or the channel is enabled at level 0, | |
// all levels are enabled. | |
// | |
if ((Level <= EnableInfo->Level) || // This also covers the case of Level == 0. | |
(EnableInfo->Level == 0)) { | |
// | |
// Check if Keyword is enabled | |
// | |
if ((Keyword == (ULONGLONG)0) || | |
((Keyword & EnableInfo->MatchAnyKeyword) && | |
((Keyword & EnableInfo->MatchAllKeyword) == EnableInfo->MatchAllKeyword))) { | |
return TRUE; | |
} | |
} | |
return FALSE; | |
} | |
#endif | |
#if !defined(MCGEN_EVENT_ENABLED_DEF) | |
#define MCGEN_EVENT_ENABLED_DEF | |
FORCEINLINE | |
BOOLEAN | |
McGenEventEnabled( | |
_In_ PMCGEN_TRACE_CONTEXT EnableInfo, | |
_In_ PCEVENT_DESCRIPTOR EventDescriptor | |
) | |
{ | |
return McGenLevelKeywordEnabled(EnableInfo, EventDescriptor->Level, EventDescriptor->Keyword); | |
} | |
#endif | |
// | |
// EnableCheckMacro | |
// | |
#ifndef MCGEN_ENABLE_CHECK | |
#define MCGEN_ENABLE_CHECK(Context, Descriptor) (Context.IsEnabled && McGenEventEnabled(&Context, &Descriptor)) | |
#endif | |
#if !defined(MCGEN_CONTROL_CALLBACK) | |
#define MCGEN_CONTROL_CALLBACK | |
DECLSPEC_NOINLINE __inline | |
VOID | |
__stdcall | |
McGenControlCallbackV2( | |
_In_ LPCGUID SourceId, | |
_In_ ULONG ControlCode, | |
_In_ UCHAR Level, | |
_In_ ULONGLONG MatchAnyKeyword, | |
_In_ ULONGLONG MatchAllKeyword, | |
_In_opt_ PEVENT_FILTER_DESCRIPTOR FilterData, | |
_Inout_opt_ PVOID CallbackContext | |
) | |
/*++ | |
Routine Description: | |
This is the notification callback for Windows Vista and later. | |
Arguments: | |
SourceId - The GUID that identifies the session that enabled the provider. | |
ControlCode - The parameter indicates whether the provider | |
is being enabled or disabled. | |
Level - The level at which the event is enabled. | |
MatchAnyKeyword - The bitmask of keywords that the provider uses to | |
determine the category of events that it writes. | |
MatchAllKeyword - This bitmask additionally restricts the category | |
of events that the provider writes. | |
FilterData - The provider-defined data. | |
CallbackContext - The context of the callback that is defined when the provider | |
called EtwRegister to register itself. | |
Remarks: | |
ETW calls this function to notify provider of enable/disable | |
--*/ | |
{ | |
PMCGEN_TRACE_CONTEXT Ctx = (PMCGEN_TRACE_CONTEXT)CallbackContext; | |
ULONG Ix; | |
#ifndef MCGEN_PRIVATE_ENABLE_CALLBACK_V2 | |
UNREFERENCED_PARAMETER(SourceId); | |
UNREFERENCED_PARAMETER(FilterData); | |
#endif | |
if (Ctx == NULL) { | |
return; | |
} | |
switch (ControlCode) { | |
case EVENT_CONTROL_CODE_ENABLE_PROVIDER: | |
Ctx->Level = Level; | |
Ctx->MatchAnyKeyword = MatchAnyKeyword; | |
Ctx->MatchAllKeyword = MatchAllKeyword; | |
Ctx->IsEnabled = EVENT_CONTROL_CODE_ENABLE_PROVIDER; | |
for (Ix = 0; Ix < Ctx->EnableBitsCount; Ix += 1) { | |
if (McGenLevelKeywordEnabled(Ctx, Ctx->EnableLevel[Ix], Ctx->EnableKeyWords[Ix]) != FALSE) { | |
Ctx->EnableBitMask[Ix >> 5] |= (1 << (Ix % 32)); | |
} else { | |
Ctx->EnableBitMask[Ix >> 5] &= ~(1 << (Ix % 32)); | |
} | |
} | |
break; | |
case EVENT_CONTROL_CODE_DISABLE_PROVIDER: | |
Ctx->IsEnabled = EVENT_CONTROL_CODE_DISABLE_PROVIDER; | |
Ctx->Level = 0; | |
Ctx->MatchAnyKeyword = 0; | |
Ctx->MatchAllKeyword = 0; | |
if (Ctx->EnableBitsCount > 0) { | |
RtlZeroMemory(Ctx->EnableBitMask, (((Ctx->EnableBitsCount - 1) / 32) + 1) * sizeof(ULONG)); | |
} | |
break; | |
default: | |
break; | |
} | |
#ifdef MCGEN_PRIVATE_ENABLE_CALLBACK_V2 | |
// | |
// Call user defined callback | |
// | |
MCGEN_PRIVATE_ENABLE_CALLBACK_V2( | |
SourceId, | |
ControlCode, | |
Level, | |
MatchAnyKeyword, | |
MatchAllKeyword, | |
FilterData, | |
CallbackContext | |
); | |
#endif | |
return; | |
} | |
#endif | |
#endif // MCGEN_DISABLE_PROVIDER_CODE_GENERATION | |
//+ | |
// Provider Chrome Event Count 1 | |
//+ | |
EXTERN_C __declspec(selectany) const GUID CHROME = {0xd2d578d9, 0x2936, 0x45b6, {0xa0, 0x9f, 0x30, 0xe3, 0x27, 0x15, 0xf4, 0x2d}}; | |
// | |
// Channel | |
// | |
#define CHROME_CHANNEL_SYSTEM 0x8 | |
// | |
// Event Descriptors | |
// | |
EXTERN_C __declspec(selectany) const EVENT_DESCRIPTOR ChromeEvent = {0x1, 0x0, 0x8, 0x4, 0x0, 0x0, 0x8000000000000000}; | |
#define ChromeEvent_value 0x1 | |
// | |
// Note on Generate Code from Manifest for Windows Vista and above | |
// | |
//Structures : are handled as a size and pointer pairs. The macro for the event will have an extra | |
//parameter for the size in bytes of the structure. Make sure that your structures have no extra padding. | |
// | |
//Strings: There are several cases that can be described in the manifest. For array of variable length | |
//strings, the generated code will take the count of characters for the whole array as an input parameter. | |
// | |
//SID No support for array of SIDs, the macro will take a pointer to the SID and use appropriate | |
//GetLengthSid function to get the length. | |
// | |
// | |
// Allow disabling of code generation | |
// | |
#ifndef MCGEN_DISABLE_PROVIDER_CODE_GENERATION | |
// | |
// Globals | |
// | |
// | |
// Event Enablement Bits | |
// | |
EXTERN_C __declspec(selectany) DECLSPEC_CACHEALIGN ULONG ChromeEnableBits[1]; | |
EXTERN_C __declspec(selectany) const ULONGLONG ChromeKeywords[1] = {0x8000000000000000}; | |
EXTERN_C __declspec(selectany) const UCHAR ChromeLevels[1] = {4}; | |
EXTERN_C __declspec(selectany) MCGEN_TRACE_CONTEXT CHROME_Context = {0, 0, 0, 0, 0, 0, 0, 0, 1, ChromeEnableBits, ChromeKeywords, ChromeLevels}; | |
EXTERN_C __declspec(selectany) REGHANDLE ChromeHandle = (REGHANDLE)0; | |
#if !defined(McGenEventRegisterUnregister) | |
#define McGenEventRegisterUnregister | |
#pragma warning(push) | |
#pragma warning(disable:6103) | |
DECLSPEC_NOINLINE __inline | |
ULONG __stdcall | |
McGenEventRegister( | |
_In_ LPCGUID ProviderId, | |
_In_opt_ PENABLECALLBACK EnableCallback, | |
_In_opt_ PVOID CallbackContext, | |
_Inout_ PREGHANDLE RegHandle | |
) | |
/*++ | |
Routine Description: | |
This function registers the provider with ETW USER mode. | |
Arguments: | |
ProviderId - Provider ID to be register with ETW. | |
EnableCallback - Callback to be used. | |
CallbackContext - Context for this provider. | |
RegHandle - Pointer to registration handle. | |
Remarks: | |
If the handle != NULL will return ERROR_SUCCESS | |
--*/ | |
{ | |
ULONG Error; | |
if (*RegHandle) { | |
// | |
// already registered | |
// | |
return ERROR_SUCCESS; | |
} | |
Error = EventRegister( ProviderId, EnableCallback, CallbackContext, RegHandle); | |
return Error; | |
} | |
#pragma warning(pop) | |
DECLSPEC_NOINLINE __inline | |
ULONG __stdcall | |
McGenEventUnregister(_Inout_ PREGHANDLE RegHandle) | |
/*++ | |
Routine Description: | |
Unregister from ETW USER mode | |
Arguments: | |
RegHandle this is the pointer to the provider context | |
Remarks: | |
If provider has not been registered, RegHandle == NULL, | |
return ERROR_SUCCESS | |
--*/ | |
{ | |
ULONG Error; | |
if(!(*RegHandle)) { | |
// | |
// Provider has not registerd | |
// | |
return ERROR_SUCCESS; | |
} | |
Error = EventUnregister(*RegHandle); | |
*RegHandle = (REGHANDLE)0; | |
return Error; | |
} | |
#endif | |
// | |
// Register with ETW Vista + | |
// | |
#ifndef EventRegisterChrome | |
#define EventRegisterChrome() McGenEventRegister(&CHROME, McGenControlCallbackV2, &CHROME_Context, &ChromeHandle) | |
#endif | |
// | |
// UnRegister with ETW | |
// | |
#ifndef EventUnregisterChrome | |
#define EventUnregisterChrome() McGenEventUnregister(&ChromeHandle) | |
#endif | |
// | |
// Enablement check macro for ChromeEvent | |
// | |
#define EventEnabledChromeEvent() ((ChromeEnableBits[0] & 0x00000001) != 0) | |
// | |
// Event Macro for ChromeEvent | |
// | |
#define EventWriteChromeEvent(Name, Phase, Arg_Name_1, Arg_Value_1, Arg_Name_2, Arg_Value_2, Arg_Name_3, Arg_Value_3)\ | |
EventEnabledChromeEvent() ?\ | |
Template_ssssssss(ChromeHandle, &ChromeEvent, Name, Phase, Arg_Name_1, Arg_Value_1, Arg_Name_2, Arg_Value_2, Arg_Name_3, Arg_Value_3)\ | |
: ERROR_SUCCESS\ | |
#endif // MCGEN_DISABLE_PROVIDER_CODE_GENERATION | |
// | |
// Allow Diasabling of code generation | |
// | |
#ifndef MCGEN_DISABLE_PROVIDER_CODE_GENERATION | |
// | |
// Template Functions | |
// | |
// | |
//Template from manifest : tid_chrome_event | |
// | |
#ifndef Template_ssssssss_def | |
#define Template_ssssssss_def | |
ETW_INLINE | |
ULONG | |
Template_ssssssss( | |
_In_ REGHANDLE RegHandle, | |
_In_ PCEVENT_DESCRIPTOR Descriptor, | |
_In_opt_ LPCSTR _Arg0, | |
_In_opt_ LPCSTR _Arg1, | |
_In_opt_ LPCSTR _Arg2, | |
_In_opt_ LPCSTR _Arg3, | |
_In_opt_ LPCSTR _Arg4, | |
_In_opt_ LPCSTR _Arg5, | |
_In_opt_ LPCSTR _Arg6, | |
_In_opt_ LPCSTR _Arg7 | |
) | |
{ | |
#define ARGUMENT_COUNT_ssssssss 8 | |
EVENT_DATA_DESCRIPTOR EventData[ARGUMENT_COUNT_ssssssss]; | |
EventDataDescCreate(&EventData[0], | |
(_Arg0 != NULL) ? _Arg0 : "NULL", | |
(_Arg0 != NULL) ? (ULONG)((strlen(_Arg0) + 1) * sizeof(CHAR)) : (ULONG)sizeof("NULL")); | |
EventDataDescCreate(&EventData[1], | |
(_Arg1 != NULL) ? _Arg1 : "NULL", | |
(_Arg1 != NULL) ? (ULONG)((strlen(_Arg1) + 1) * sizeof(CHAR)) : (ULONG)sizeof("NULL")); | |
EventDataDescCreate(&EventData[2], | |
(_Arg2 != NULL) ? _Arg2 : "NULL", | |
(_Arg2 != NULL) ? (ULONG)((strlen(_Arg2) + 1) * sizeof(CHAR)) : (ULONG)sizeof("NULL")); | |
EventDataDescCreate(&EventData[3], | |
(_Arg3 != NULL) ? _Arg3 : "NULL", | |
(_Arg3 != NULL) ? (ULONG)((strlen(_Arg3) + 1) * sizeof(CHAR)) : (ULONG)sizeof("NULL")); | |
EventDataDescCreate(&EventData[4], | |
(_Arg4 != NULL) ? _Arg4 : "NULL", | |
(_Arg4 != NULL) ? (ULONG)((strlen(_Arg4) + 1) * sizeof(CHAR)) : (ULONG)sizeof("NULL")); | |
EventDataDescCreate(&EventData[5], | |
(_Arg5 != NULL) ? _Arg5 : "NULL", | |
(_Arg5 != NULL) ? (ULONG)((strlen(_Arg5) + 1) * sizeof(CHAR)) : (ULONG)sizeof("NULL")); | |
EventDataDescCreate(&EventData[6], | |
(_Arg6 != NULL) ? _Arg6 : "NULL", | |
(_Arg6 != NULL) ? (ULONG)((strlen(_Arg6) + 1) * sizeof(CHAR)) : (ULONG)sizeof("NULL")); | |
EventDataDescCreate(&EventData[7], | |
(_Arg7 != NULL) ? _Arg7 : "NULL", | |
(_Arg7 != NULL) ? (ULONG)((strlen(_Arg7) + 1) * sizeof(CHAR)) : (ULONG)sizeof("NULL")); | |
return EventWrite(RegHandle, Descriptor, ARGUMENT_COUNT_ssssssss, EventData); | |
} | |
#endif | |
#endif // MCGEN_DISABLE_PROVIDER_CODE_GENERATION | |
#if defined(__cplusplus) | |
}; | |
#endif | |
#define MSG_ChromeEvent_EventMessage 0x00000001L |