MI_Result InitHandler()

in LCM/dsc/engine/ConfigurationManager/LocalConfigManagerHelper.c [172:330]


MI_Result InitHandler(
    _In_z_ const MI_Char* methodName,
    _Outptr_result_maybenull_ MI_Instance **cimErrorDetails)
{
    MI_Uint32 error;
    MI_Result result = MI_RESULT_OK;
    int initState;

    if (cimErrorDetails == NULL)
    {        
        return MI_RESULT_INVALID_PARAMETER; 
    }
    *cimErrorDetails = NULL;    // Explicitly set *cimErrorDetails to NULL as _Outptr_ requires setting this at least once. 

    initState = (int)Atomic_CompareAndSwap(&g_InitializationState, (ptrdiff_t)RUNNING_INITIALIZATION, (ptrdiff_t)NOT_INITIALIZED);
    if (initState == INITIALIZED)
    {
        // already initialized.
        return MI_RESULT_OK;
    }
    else if (initState == RUNNING_INITIALIZATION)
    {
        // currently going on.
        return GetCimMIError3Params(MI_RESULT_FAILED, cimErrorDetails, ID_LCM_MULTIPLE_METHOD_REQUEST, methodName, (const MI_Char*)g_inializingOperationMethodName, methodName);
    }

    InitLocTable();

    g_inializingOperationMethodName = (MI_Char*)methodName;

    error = DSC_EventRegister();
    if (error != 0)
    {
        Atomic_Swap(&g_InitializationState, NOT_INITIALIZED);
        g_inializingOperationMethodName = NULL;
        return GetCimWin32Error(error, cimErrorDetails, ID_LCMHELPER_ETWREGISTREATION_FAILED);
    }

    result = InitCAHandler(cimErrorDetails);
    if (result != MI_RESULT_OK)
    {
        DSC_EventUnRegister();
        Atomic_Swap(&g_InitializationState, NOT_INITIALIZED);
        g_inializingOperationMethodName = NULL;
        return result;
    }

    g_PendingConfigFileName = NULL;
    g_PendingConfigTmpFileName = NULL;
    g_CurrentConfigFileName = NULL;
    g_PreviousConfigFileName = NULL;
    g_GetConfigFileName = NULL;
    g_InventoryFileName = NULL;
    g_InventoryReportFileName = NULL;
    g_MetaConfigFileName = NULL;
    g_MetaConfigTmpFileName = NULL;
    g_ConfigChecksumFileName = NULL;
    g_PullRunLogFileName = NULL;
    g_LCMStatusCodeHistory = NULL;
    g_PartialConfigDataStoreName = NULL;
    g_PartialConfigBaseDocumentInstanceFileName = NULL;
    g_PartialConfigBaseDocumentInstanceTmpFileName = NULL;

    result = InitPath(cimErrorDetails);
    if (result != MI_RESULT_OK)
    {
        DSC_EventUnRegister();
        DSC_free(g_PendingConfigFileName);
        DSC_free(g_CurrentConfigFileName);
        DSC_free(g_PreviousConfigFileName);
        DSC_free(g_GetConfigFileName);
        DSC_free(g_InventoryFileName);
        DSC_free(g_InventoryReportFileName);
        DSC_free(g_MetaConfigFileName);
        DSC_free(g_MetaConfigTmpFileName);
        DSC_free(g_ConfigChecksumFileName);
        DSC_free(g_PullRunLogFileName);
        DSC_free(g_LCMStatusCodeHistory);

        g_PendingConfigFileName = NULL;
        g_CurrentConfigFileName = NULL;
        g_PreviousConfigFileName = NULL;
        g_GetConfigFileName = NULL;
        g_InventoryFileName = NULL;
        g_InventoryReportFileName = NULL;
        g_MetaConfigFileName = NULL;
        g_MetaConfigTmpFileName = NULL;
        g_ConfigChecksumFileName = NULL;
        g_PullRunLogFileName = NULL;
        g_LCMStatusCodeHistory = NULL;

        DSC_free(g_PendingConfigTmpFileName);
        DSC_free(g_PartialConfigDataStoreName);
        DSC_free(g_PartialConfigBaseDocumentInstanceFileName);
        DSC_free(g_PartialConfigBaseDocumentInstanceTmpFileName);
        g_PendingConfigTmpFileName = NULL;
        g_PartialConfigDataStoreName = NULL;
        g_PartialConfigBaseDocumentInstanceFileName = NULL;
        g_PartialConfigBaseDocumentInstanceTmpFileName = NULL;

        RecursiveLock_Release(&g_cs_CurrentWmiv2Operation);
        Sem_Destroy(&g_h_ConfigurationStoppedEvent);
        Atomic_Swap(&g_InitializationState, NOT_INITIALIZED);
        g_inializingOperationMethodName = NULL;
        return result;
    } 

    g_DSCInternalCache = NULL;
    result = InitCacheAndMetaConfig(&g_metaConfig, &g_DSCInternalCache, cimErrorDetails);
    if (result != MI_RESULT_OK)
    {
        DSC_EventUnRegister();
        DSC_free(g_PendingConfigFileName);
        DSC_free(g_CurrentConfigFileName);
        DSC_free(g_PreviousConfigFileName);
        DSC_free(g_GetConfigFileName);
        DSC_free(g_InventoryFileName);
        DSC_free(g_InventoryReportFileName);
        DSC_free(g_MetaConfigFileName);
        DSC_free(g_MetaConfigTmpFileName);
        DSC_free(g_ConfigChecksumFileName);
        DSC_free(g_PullRunLogFileName);
        DSC_free(g_LCMStatusCodeHistory);

        g_PendingConfigFileName = NULL;
        g_CurrentConfigFileName = NULL;
        g_PreviousConfigFileName = NULL;
        g_GetConfigFileName = NULL;
        g_InventoryFileName = NULL;
        g_InventoryReportFileName = NULL;
        g_MetaConfigFileName = NULL;
        g_MetaConfigTmpFileName = NULL;
        g_ConfigChecksumFileName = NULL;
        g_PullRunLogFileName = NULL;
        g_LCMStatusCodeHistory = NULL;

        DSC_free(g_PendingConfigTmpFileName);
        DSC_free(g_PartialConfigDataStoreName);
        DSC_free(g_PartialConfigBaseDocumentInstanceFileName);
        DSC_free(g_PartialConfigBaseDocumentInstanceTmpFileName);
        g_PendingConfigTmpFileName = NULL;
        g_PartialConfigDataStoreName = NULL;
        g_PartialConfigBaseDocumentInstanceFileName = NULL;
        g_PartialConfigBaseDocumentInstanceTmpFileName = NULL;

        RecursiveLock_Release(&g_cs_CurrentWmiv2Operation);
        Sem_Destroy(&g_h_ConfigurationStoppedEvent);
        Atomic_Swap(&g_InitializationState, NOT_INITIALIZED);
        g_inializingOperationMethodName = NULL;
        return result;
    }
    SetJobDeviceName();

    RegistrationManager_New((RegistrationManager**)&(g_registrationManager), cimErrorDetails);

    Atomic_Swap(&g_InitializationState, INITIALIZED);
    g_inializingOperationMethodName = NULL;
    return MI_RESULT_OK;
}