static int log_sink_etw_init()

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