in v2/src/log_sink_etw.c [572:619]
static int log_sink_etw_init(void)
{
int result;
if (log_sink_etw_state == LOG_SINK_ETW_STATE_NOT_INITIALIZED)
{
/* Codes_SRS_LOG_SINK_ETW_01_006: [ log_sink_etw.init shall register the ETW TraceLogging provider by calling TraceLoggingRegister (TraceLoggingRegister_EventRegister_EventSetInformation). ]*/
TLG_STATUS register_result = TraceLoggingRegister(log_sink_etw_provider);
if (!SUCCEEDED(register_result))
{
/* Codes_SRS_LOG_SINK_ETW_01_088: [ If TraceLoggingRegister fails, log_sink_etw.init shall fail and return a non-zero value. ]*/
(void)printf("ETW provider was NOT registered (register_result=0x%08x).\r\n", register_result);
result = MU_FAILURE;
}
else
{
char temp_executable_full_path_name[MAX_PATH];
const char* executable_full_path_name;
if (!GetModuleFileNameA(NULL, temp_executable_full_path_name, sizeof(temp_executable_full_path_name)))
{
/* Codes_SRS_LOG_SINK_ETW_01_083: [ If GetModuleFileNameA fails, the executable shall be printed as UNKNOWN. ]*/
executable_full_path_name = "UNKNOWN";
}
else
{
executable_full_path_name = temp_executable_full_path_name;
}
/* Codes_SRS_LOG_SINK_ETW_01_008: [ log_sink_etw.init shall emit a LOG_LEVEL_INFO event as a self test, printing the fact that the provider was registered and from which executable (as obtained by calling GetModuleFileNameA). ]*/
internal_emit_self_described_event(event_name_info, sizeof(event_name_info), TRACE_LEVEL_INFORMATION, NULL, 0, __FILE__, __FUNCTION__, __LINE__, "ETW provider was registered succesfully (self test). Executable file full path name = %s", executable_full_path_name);
log_sink_etw_state = LOG_SINK_ETW_STATE_INITIALIZED;
/* Codes_SRS_LOG_SINK_ETW_01_091: [ log_sink_etw.init shall succeed and return 0. ] */
result = 0;
}
}
else
{
/* Codes_SRS_LOG_SINK_ETW_01_092: [ If the module is already initialized, log_sink_etw.init shall fail and return a non-zero value. ]*/
(void)printf("log_sink_etw_init called in %" PRI_MU_ENUM "\r\n", MU_ENUM_VALUE(LOG_SINK_ETW_STATE, log_sink_etw_state));
result = MU_FAILURE;
}
return result;
}