HRESULT GetAgentParamsFromRegistry()

in host/common/hostagenthelpers.cpp [4862:5694]


HRESULT GetAgentParamsFromRegistry( const char *pszSVRootKey,
                                   SV_HOST_AGENT_PARAMS *pSV_HOST_AGENT_PARAMS, SV_HOST_AGENT_TYPE AgentType )
{
    DebugPrintf(SV_LOG_DEBUG, "Entering %s\n", __FUNCTION__);
    HRESULT hr = S_OK;
    char szValue[ 4*MAX_PATH ];
    CRegKey cregkey;
    DWORD httpsvalue = 0;

    do
    {
        DebugPrintf( "@ LINE %d in FILE %s \n", __LINE__, __FILE__ );
        DebugPrintf( "ENTERED GetAgentParamsFromRegistry()...\n" );

        if( ( NULL == pszSVRootKey ) ||
            ( NULL == pSV_HOST_AGENT_PARAMS ) )
        {
            hr = E_INVALIDARG;
            DebugPrintf( "@ LINE %d in FILE %s \n", __LINE__, __FILE__ );
            DebugPrintf( hr, "FAILED GetAgentParamsFromRegistry()... hr = %08X\n", hr );
            break;
        }

        ZeroMemory( pSV_HOST_AGENT_PARAMS, sizeof( *pSV_HOST_AGENT_PARAMS ) );

        USES_CONVERSION;
        //
        // 
        //
        DWORD dwResult = ERROR_SUCCESS;
        dwResult = cregkey.Open( HKEY_LOCAL_MACHINE,
            pszSVRootKey );
        if( ERROR_SUCCESS != dwResult )
        {
            hr = HRESULT_FROM_WIN32( dwResult );
            DebugPrintf( "@ LINE %d in FILE %s \n", __LINE__, __FILE__ );
            DebugPrintf( hr, "FAILED cregkey.Open()... hr = %08X\n", hr );
            break;
        }


        DWORD dwCount = sizeof( szValue );
        
        dwResult = cregkey.QueryStringValue( SV_SERVER_NAME_VALUE_NAME, szValue, &dwCount );
        if( ERROR_SUCCESS != dwResult )
        {
            hr = HRESULT_FROM_WIN32( dwResult );
            DebugPrintf( "@ LINE %d in FILE %s \n", __LINE__, __FILE__ );
            DebugPrintf( hr, "FAILED cregkey.QueryValue()... key: %s; hr = %08X\n", SV_SERVER_NAME_VALUE_NAME, hr );
            break;
        }

        inm_strcpy_s( pSV_HOST_AGENT_PARAMS->szSVServerName, ARRAYSIZE(pSV_HOST_AGENT_PARAMS->szSVServerName), szValue );
        dwCount = sizeof( szValue );

        //Akshay - Server HTTP Port defaults to 80
        dwResult = cregkey.QueryDWORDValue( SV_SERVER_HTTP_PORT_VALUE_NAME, pSV_HOST_AGENT_PARAMS->ServerHttpPort);
        if( ERROR_SUCCESS != dwResult )
        {
            pSV_HOST_AGENT_PARAMS->ServerHttpPort = INTERNET_DEFAULT_HTTP_PORT;

            hr = HRESULT_FROM_WIN32( dwResult );
            DebugPrintf( "@ LINE %d in FILE %s \n", __LINE__, __FILE__ );
            DebugPrintf( hr, "FAILED cregkey.QueryValue()... key: %s; hr = %08X\n", SV_SERVER_HTTP_PORT_VALUE_NAME, hr );
            break;
        }
        else if(pSV_HOST_AGENT_PARAMS->ServerHttpPort > 65535 || pSV_HOST_AGENT_PARAMS->ServerHttpPort <= 0 )
        {
            pSV_HOST_AGENT_PARAMS->ServerHttpPort = INTERNET_DEFAULT_HTTP_PORT;
            DebugPrintf( "@ LINE %d in FILE %s \n", __LINE__, __FILE__ );
            DebugPrintf( hr, "Port is out of range \n");
            break;

        }
        //Reading Https Reg Key value 
            
        dwResult = cregkey.QueryDWORDValue( "Https",httpsvalue);

        if( ERROR_SUCCESS != dwResult )
        {
            DebugPrintf( "@ LINE %d in FILE %s \n", __LINE__, __FILE__ );
            DebugPrintf( "ERROR failed to Read Https Key\n" );
        }
        else
        {
            DebugPrintf( "Successfully Read Https Key %d\n",httpsvalue );
            if(httpsvalue==1)
            {
                pSV_HOST_AGENT_PARAMS->Https = true;
                DebugPrintf( "Successfully Read Https Key  and value %d \n",pSV_HOST_AGENT_PARAMS->Https );

            }
            else
            {
                pSV_HOST_AGENT_PARAMS->Https = false;
                DebugPrintf( "Https Key value is not set value=%d\n",pSV_HOST_AGENT_PARAMS->Https );
            
            }
        }
        

        if( AgentType  == SV_AGENT_FILE_REPLICATION) {
            DWORD value = 0;
            dwResult = cregkey.QueryDWORDValue( SV_DEBUG_LOG_LEVEL_VALUE_NAME, value);
            if( ERROR_SUCCESS != dwResult )
                SetLogLevel(SV_LOG_DISABLE);
            else
                SetLogLevel(value);
        }
        // Throttle Bootstrap
        dwResult = cregkey.QueryStringValue( THROTTLE_BOOTSTRAP_URL, szValue, &dwCount );
        if( ERROR_SUCCESS == dwResult )
        {
            inm_strcpy_s( pSV_HOST_AGENT_PARAMS->szThrottleBootstrapURL, ARRAYSIZE(pSV_HOST_AGENT_PARAMS->szThrottleBootstrapURL), szValue );
            dwCount = sizeof( szValue );
        }
        else 
        {
            hr = HRESULT_FROM_WIN32( dwResult );
            DebugPrintf( "@ LINE %d in FILE %s \n", __LINE__, __FILE__ );
            DebugPrintf( hr, "WARNING cregkey.QueryValue(), using default. key: %s; hr = %08X\n", THROTTLE_BOOTSTRAP_URL, hr );
            inm_strcpy_s( pSV_HOST_AGENT_PARAMS->szThrottleBootstrapURL, ARRAYSIZE(pSV_HOST_AGENT_PARAMS->szThrottleBootstrapURL), "/throttle_bootstrap.php" );
            dwCount = sizeof("/throttle_bootstrap.php");
        }

        // Throttle Sentinel
        dwResult = cregkey.QueryStringValue( THROTTLE_SENTINEL_URL, szValue, &dwCount );
        if( ERROR_SUCCESS == dwResult )
        {
            inm_strcpy_s( pSV_HOST_AGENT_PARAMS->szThrottleSentinelURL, ARRAYSIZE(pSV_HOST_AGENT_PARAMS->szThrottleSentinelURL), szValue );
            dwCount = sizeof( szValue );
        }
        else 
        {
            hr = HRESULT_FROM_WIN32( dwResult );
            DebugPrintf( "@ LINE %d in FILE %s \n", __LINE__, __FILE__ );
            DebugPrintf( hr, "FAILED cregkey.QueryValue(), using default. key: %s; hr = %08X\n", THROTTLE_SENTINEL_URL, hr );
            inm_strcpy_s( pSV_HOST_AGENT_PARAMS->szThrottleSentinelURL, ARRAYSIZE(pSV_HOST_AGENT_PARAMS->szThrottleSentinelURL), "/throttle_sentinel.php" );
            dwCount = sizeof("/throttle_sentinel.php");
        }

        // Throttle OA
        dwResult = cregkey.QueryStringValue( THROTTLE_OUTPOST_URL, szValue, &dwCount );
        if( ERROR_SUCCESS == dwResult )
        {
            inm_strcpy_s( pSV_HOST_AGENT_PARAMS->szThrottleOutpostURL, ARRAYSIZE(pSV_HOST_AGENT_PARAMS->szThrottleOutpostURL), szValue );
            dwCount = sizeof( szValue );
        }
        else 
        {
            hr = HRESULT_FROM_WIN32( dwResult );
            DebugPrintf( "@ LINE %d in FILE %s \n", __LINE__, __FILE__ );
            DebugPrintf( hr, "FAILED cregkey.QueryValue()... key: %s; hr = %08X\n", THROTTLE_OUTPOST_URL, hr );
            inm_strcpy_s( pSV_HOST_AGENT_PARAMS->szThrottleOutpostURL, ARRAYSIZE(pSV_HOST_AGENT_PARAMS->szThrottleOutpostURL), "/throttle_outpost.php" );
            dwCount = sizeof( "/throttle_outpost.php" );
        }

        //Throttle url added 2/2/2006 
        
        dwResult = cregkey.QueryStringValue( THROTTLE_AGENT_URL, szValue, &dwCount );
        if( ERROR_SUCCESS == dwResult )
        {
            inm_strcpy_s( pSV_HOST_AGENT_PARAMS->szThrottleURL, ARRAYSIZE(pSV_HOST_AGENT_PARAMS->szThrottleURL), szValue );
            dwCount = sizeof( szValue );
        }
        else 
        {
            hr = HRESULT_FROM_WIN32( dwResult );
            DebugPrintf( "@ LINE %d in FILE %s \n", __LINE__, __FILE__ );
            DebugPrintf( hr, "FAILED cregkey.QueryValue()... key: %s; hr = %08X\n", THROTTLE_AGENT_URL, hr );
            inm_strcpy_s( pSV_HOST_AGENT_PARAMS->szThrottleURL, ARRAYSIZE(pSV_HOST_AGENT_PARAMS->szThrottleURL), "/throttle_agent.php" );
            dwCount = sizeof( "/throttle_agent.php" );
        }


        if( SV_AGENT_FILE_REPLICATION == AgentType )
        {
            inm_strcpy_s( szValue, ARRAYSIZE(szValue), "FileReplicationAgent" );
        }
        else
        {
            inm_strcpy_s( szValue, ARRAYSIZE(szValue), "VxAgent" );
        }

        inm_strcpy_s( pSV_HOST_AGENT_PARAMS->szSVHostAgentType, ARRAYSIZE(pSV_HOST_AGENT_PARAMS->szSVHostAgentType), szValue );
        inm_strcpy_s( pSV_HOST_AGENT_PARAMS->szSVHostAgentRegKey, ARRAYSIZE(pSV_HOST_AGENT_PARAMS->szSVHostAgentRegKey), pszSVRootKey );
        inm_strcat_s( pSV_HOST_AGENT_PARAMS->szSVHostAgentRegKey, ARRAYSIZE(pSV_HOST_AGENT_PARAMS->szSVHostAgentRegKey), "\\" );
        inm_strcat_s( pSV_HOST_AGENT_PARAMS->szSVHostAgentRegKey, ARRAYSIZE(pSV_HOST_AGENT_PARAMS->szSVHostAgentRegKey), 
            pSV_HOST_AGENT_PARAMS->szSVHostAgentType );

        cregkey.Close();
        dwResult = cregkey.Open( HKEY_LOCAL_MACHINE,
            pSV_HOST_AGENT_PARAMS->szSVHostAgentRegKey );
        if( ERROR_SUCCESS != dwResult )
        {
            hr = HRESULT_FROM_WIN32( dwResult );
            DebugPrintf( "@ LINE %d in FILE %s \n", __LINE__, __FILE__ );
            DebugPrintf( hr,
                "FAILED cregkey.Open()... key: %s; hr = %08X\n",
                pSV_HOST_AGENT_PARAMS->szSVHostAgentRegKey,
                hr );
            break;
        }

        dwCount = sizeof( szValue );
        dwResult = cregkey.QueryStringValue( SV_REGISTER_URL_VALUE_NAME, szValue, &dwCount );
        if( ERROR_SUCCESS != dwResult )
        {
            hr = HRESULT_FROM_WIN32( dwResult );
            DebugPrintf( "@ LINE %d in FILE %s \n", __LINE__, __FILE__ );
            DebugPrintf( hr, "FAILED cregkey.QueryValue()... key: %s; hr = %08X\n", SV_REGISTER_URL_VALUE_NAME, hr );
            break;
        }

        inm_strcpy_s( pSV_HOST_AGENT_PARAMS->szSVRegisterURL, ARRAYSIZE(pSV_HOST_AGENT_PARAMS->szSVRegisterURL), szValue );

        //Reading IsFxUpgraded Key for Fx _upgraded case start

        dwResult = cregkey.QueryDWORDValue( SV_FX_UPGRADED, pSV_HOST_AGENT_PARAMS->Fx_Upgraded );

        if( ERROR_SUCCESS != dwResult )
        {
            DebugPrintf( "@ LINE %d in FILE %s \n", __LINE__, __FILE__ );
            DebugPrintf( hr, "FAILED cregkey.QueryValue()... key: %s; hr = %08X\n", SV_FX_UPGRADED, hr );
        }
        else
        {
            DebugPrintf( " Successfully Read SV_FX_UPGRADED value = %d \n", pSV_HOST_AGENT_PARAMS->Fx_Upgraded );    
        }
        //Reading IsFxUpgraded Key for Fx _upgraded case end
        dwCount = sizeof( szValue );
        dwResult = cregkey.QueryStringValue( SV_UNREGISTER_URL_VALUE_NAME, szValue, &dwCount );
        if( ERROR_SUCCESS != dwResult )
        {
            hr = HRESULT_FROM_WIN32( dwResult );
            DebugPrintf( "@ LINE %d in FILE %s \n", __LINE__, __FILE__ );
            DebugPrintf( hr, "FAILED cregkey.QueryValue()... key: %s; hr = %08X\n", SV_UNREGISTER_URL_VALUE_NAME, hr );
            break;
        }

        inm_strcpy_s( pSV_HOST_AGENT_PARAMS->szUnregisterURL, ARRAYSIZE(pSV_HOST_AGENT_PARAMS->szUnregisterURL), szValue );

        dwCount = sizeof( szValue );

        dwResult = cregkey.QueryStringValue( SV_PROTECTED_DRIVES_URL_VALUE_NAME, szValue, &dwCount );
        if( ERROR_SUCCESS != dwResult )
        {
            hr = HRESULT_FROM_WIN32( dwResult );
            DebugPrintf( "@ LINE %d in FILE %s \n", __LINE__, __FILE__ );
            DebugPrintf( hr, "FAILED cregkey.QueryValue()... key: %s; hr = %08X\n", SV_PROTECTED_DRIVES_URL_VALUE_NAME, hr );
            break;
        }

        inm_strcpy_s( pSV_HOST_AGENT_PARAMS->szSVGetProtectedDrivesURL, ARRAYSIZE(pSV_HOST_AGENT_PARAMS->szSVGetProtectedDrivesURL), szValue );

        dwCount = sizeof( szValue );
        dwResult = cregkey.QueryStringValue( SV_TARGET_DRIVES_URL_VALUE_NAME, szValue, &dwCount );
        if( ERROR_SUCCESS != dwResult )
        {
            hr = HRESULT_FROM_WIN32( dwResult );
            DebugPrintf( "@ LINE %d in FILE %s \n", __LINE__, __FILE__ );
            DebugPrintf( hr, "WARNING cregkey.QueryValue()... key: %s; hr = %08X\n", SV_TARGET_DRIVES_URL_VALUE_NAME, hr );
            hr = S_FALSE;
            szValue[ 0 ] = 0;
        }
        inm_strcpy_s( pSV_HOST_AGENT_PARAMS->szSVGetTargetDrivesURL, ARRAYSIZE(pSV_HOST_AGENT_PARAMS->szSVGetTargetDrivesURL), szValue );

        hr = GetHostId( szValue, sizeof( szValue ) );
        if( FAILED( hr ) )
        {
            DebugPrintf( "FAILED Couldn't get host id, hr = %08X\n", hr );
            break;
        }

        inm_strcpy_s( pSV_HOST_AGENT_PARAMS->szSVHostID, ARRAYSIZE(pSV_HOST_AGENT_PARAMS->szSVHostID), szValue );

        dwResult = cregkey.QueryDWORDValue( SV_AVAILABLE_DRIVES_VALUE_NAME, pSV_HOST_AGENT_PARAMS->AvailableDrives);
        if( ERROR_SUCCESS != dwResult )
        {
            hr = HRESULT_FROM_WIN32( dwResult );
            DebugPrintf( "@ LINE %d in FILE %s \n", __LINE__, __FILE__ );
            DebugPrintf( hr, "FAILED cregkey.QueryValue()... key: %s; hr = %08X\n", SV_AVAILABLE_DRIVES_VALUE_NAME, hr );
            break;
        }

        //
        // NOTE: Do not set protected drives == dwAvailable drives as a safety precaution against 
        // protected drives == 0. It's okay to have no protected drives; we don't want to start protecting
        // drives that were unprotected, just because the sentinel restarted.
        //
        dwResult = cregkey.QueryDWORDValue( SV_PROTECTED_DRIVES_VALUE_NAME, pSV_HOST_AGENT_PARAMS->ProtectedDrives );
        if( ERROR_SUCCESS != dwResult )
        {
            hr = HRESULT_FROM_WIN32( dwResult );
            DebugPrintf( "@ LINE %d in FILE %s \n", __LINE__, __FILE__ );
            DebugPrintf( hr, "WARNING cregkey.QueryValue()... key: %s; hr = %08X\n", SV_PROTECTED_DRIVES_VALUE_NAME, hr );
            //break;
        }

        // Get Protected Volume Settings
        dwCount = sizeof( szValue );

        dwResult = cregkey.QueryStringValue( SV_PROTECTED_VOLUME_SETTINGS_URL, szValue,&dwCount);
        if( ERROR_SUCCESS != dwResult )
        {
            hr = HRESULT_FROM_WIN32( dwResult );
            DebugPrintf( "@ LINE %d in FILE %s \n", __LINE__, __FILE__ );
            DebugPrintf( hr, "WARNING cregkey.QueryValue()... key: %s; hr = %08X\n", SV_PROTECTED_VOLUME_SETTINGS_URL, hr );
            //break;
        }
        inm_strcpy_s( pSV_HOST_AGENT_PARAMS->szProtectedVolumeSettingsURL, ARRAYSIZE(pSV_HOST_AGENT_PARAMS->szProtectedVolumeSettingsURL), szValue );

        //
        // Optional: MAX_SENTINEL_PAYLOAD
        //
        pSV_HOST_AGENT_PARAMS->cbMaxSentinelPayload = 0;
        dwResult = cregkey.QueryDWORDValue( SV_MAX_SENTINEL_PAYLOAD_VALUE_NAME, pSV_HOST_AGENT_PARAMS->cbMaxSentinelPayload );
        if( ERROR_SUCCESS != dwResult )
        {
            DebugPrintf( "@ LINE %d in FILE %s \n", __LINE__, __FILE__ );
            DebugPrintf( SV_LOG_DEBUG, "WARNING cregkey.QueryValue()... key: %s; hr = %08X\n", SV_MAX_SENTINEL_PAYLOAD_VALUE_NAME, hr );
        }

        //
        // Get 'report if resync required' url. If not present, use a default.
        //
        dwCount = sizeof( szValue );
        dwResult = cregkey.QueryStringValue( SV_REPORT_RESYNC_REQUIRED_URL_VALUE_NAME, szValue, &dwCount );

        if( ERROR_SUCCESS != dwResult )
        {
            char const* pszDefaultUrl = "/report_resync_required.php";

            hr = HRESULT_FROM_WIN32( dwResult );
            DebugPrintf( "@ LINE %d in FILE %s \n", __LINE__, __FILE__ );
            DebugPrintf( hr, "WARNING cregkey.QueryValue()... key: %s; hr = %08X, using default %s\n", SV_REPORT_RESYNC_REQUIRED_URL_VALUE_NAME, hr, pszDefaultUrl );

            inm_strncpy_s( pSV_HOST_AGENT_PARAMS->szReportResyncRequiredURL, ARRAYSIZE(pSV_HOST_AGENT_PARAMS->szReportResyncRequiredURL), pszDefaultUrl, sizeof( pSV_HOST_AGENT_PARAMS->szReportResyncRequiredURL ) );
            hr = S_FALSE;
        }
        else
        {
            inm_strncpy_s( pSV_HOST_AGENT_PARAMS->szReportResyncRequiredURL, ARRAYSIZE(pSV_HOST_AGENT_PARAMS->szReportResyncRequiredURL), szValue, sizeof( pSV_HOST_AGENT_PARAMS->szReportResyncRequiredURL ) );
        }

        //
        // Get update_status url. If not present, use a default.
        //
        dwCount = sizeof( szValue );
        dwResult = cregkey.QueryStringValue( SV_UPDATE_STATUS_URL_VALUE_NAME, szValue, &dwCount );

        if( ERROR_SUCCESS != dwResult )
        {
            char const* pszDefaultUrl = "/update_status.php";

            hr = HRESULT_FROM_WIN32( dwResult );
            DebugPrintf( "@ LINE %d in FILE %s \n", __LINE__, __FILE__ );
            DebugPrintf( hr, "WARNING cregkey.QueryValue()... key: %s; hr = %08X, using default %s\n", SV_UPDATE_STATUS_URL_VALUE_NAME, hr, pszDefaultUrl );

            inm_strncpy_s( pSV_HOST_AGENT_PARAMS->szUpdateStatusURL, ARRAYSIZE(pSV_HOST_AGENT_PARAMS->szUpdateStatusURL), pszDefaultUrl, sizeof( pSV_HOST_AGENT_PARAMS->szUpdateStatusURL ) );
            hr = S_FALSE;
        }
        else
        {
            inm_strncpy_s( pSV_HOST_AGENT_PARAMS->szUpdateStatusURL, ARRAYSIZE(pSV_HOST_AGENT_PARAMS->szUpdateStatusURL), szValue, sizeof( pSV_HOST_AGENT_PARAMS->szUpdateStatusURL ) );
        }

        //
        // Get the CacheDirectory.
        //
        dwCount = sizeof( szValue );
        dwResult = cregkey.QueryStringValue( SV_CACHE_DIRECTORY_VALUE_NAME, szValue, &dwCount );

        if( ERROR_SUCCESS != dwResult )
        {
            hr = HRESULT_FROM_WIN32( dwResult );
            DebugPrintf( "@ LINE %d in FILE %s \n", __LINE__, __FILE__ );
            DebugPrintf( hr, "FAILED cregkey.QueryValue()... key: %s; hr = %08X\n", SV_CACHE_DIRECTORY_VALUE_NAME, hr );
            break;
        }
        else
        {
            inm_strncpy_s( pSV_HOST_AGENT_PARAMS->szCacheDirectory, ARRAYSIZE(pSV_HOST_AGENT_PARAMS->szCacheDirectory), szValue, sizeof( pSV_HOST_AGENT_PARAMS->szCacheDirectory )-1 );
        }

        //
        // Optional parameter: CxupdateIntervel
        //
        dwResult = cregkey.QueryDWORDValue( SV_CX_UPDATE_INTERVAL, pSV_HOST_AGENT_PARAMS->CxUpdateInterval);
        if( ERROR_SUCCESS != dwResult )
        {
            
            hr = HRESULT_FROM_WIN32( dwResult );
            DebugPrintf( "@ LINE %d in FILE %s \n", __LINE__, __FILE__ );
            DebugPrintf( SV_LOG_DEBUG, "Warning cregkey.QueryValue()... key: %s; using default value. hr = %08X\n", SV_CX_UPDATE_INTERVAL, hr );
            pSV_HOST_AGENT_PARAMS->CxUpdateInterval = DEFAULT_CX_UPDATE_INTERVAL;
        }

        //
        // Optional parameter: FileTransport. Default is FTP.
        //
        dwResult = cregkey.QueryDWORDValue( SV_FILE_TRANSPORT_VALUE_NAME, (DWORD&) pSV_HOST_AGENT_PARAMS->FileTransport);

        if( ERROR_SUCCESS != dwResult )
        {
            DebugPrintf( "@ LINE %d in FILE %s \n", __LINE__, __FILE__ );
            DebugPrintf( SV_LOG_DEBUG, "WARNING cregkey.QueryValue()... key: %s; using default value. hr = %08X\n", SV_FILE_TRANSPORT_VALUE_NAME, hr );
            pSV_HOST_AGENT_PARAMS->FileTransport = SV_HOST_AGENT_PARAMS::FILE_TRANSPORT_FTP;
        }

        //
        // Optional parameter: ShouldResync. By default, use 0.
        //
        DWORD dwTemp = 0;
        dwResult = cregkey.QueryDWORDValue( SV_SHOULD_RESYNC_VALUE_NAME, dwTemp );
        pSV_HOST_AGENT_PARAMS->ShouldResync = 0 != dwTemp;

        if( ERROR_SUCCESS != dwResult )
        {
            DebugPrintf( "@ LINE %d in FILE %s \n", __LINE__, __FILE__ );
            DebugPrintf( SV_LOG_DEBUG, "WARNING cregkey.QueryValue()... key: %s; using default value. hr = %08X\n", SV_SHOULD_RESYNC_VALUE_NAME, HRESULT_FROM_WIN32( GetLastError() ) );
            pSV_HOST_AGENT_PARAMS->ShouldResync = false;
        }

        //
        // Optional parameter: GetFileReplicationConfigurationURL
        //
        dwCount = sizeof( szValue );
        dwResult = cregkey.QueryStringValue( SV_GET_FILE_REPLICATION_CONFIGURATION_URL_VALUE_NAME, szValue, &dwCount );

        if( ERROR_SUCCESS != dwResult )
        {
            //DebugPrintf( "@ LINE %d in FILE %s \n", __LINE__, __FILE__ );
            //DebugPrintf( hr, "WARNING read key: %s; using default value. hr = %08X\n", SV_GET_FILE_REPLICATION_CONFIGURATION_URL_VALUE_NAME, HRESULT_FROM_WIN32( GetLastError() ) );

            inm_strcpy_s( szValue, ARRAYSIZE(szValue), "/get_file_replication_config.php" );
        }
        inm_strcpy_s( pSV_HOST_AGENT_PARAMS->szGetFileReplicationConfigurationURL, ARRAYSIZE(pSV_HOST_AGENT_PARAMS->szGetFileReplicationConfigurationURL), szValue );

        //
        // Optional parameter: UpdateFileReplicationStatusURL
        //
        dwCount = sizeof( szValue );
        dwResult = cregkey.QueryStringValue( SV_UPDATE_FILE_REPLICATION_STATUS_URL_VALUE_NAME, szValue, &dwCount );

        if( ERROR_SUCCESS != dwResult )
        {
            //DebugPrintf( "@ LINE %d in FILE %s \n", __LINE__, __FILE__ );
            //DebugPrintf( hr, "WARNING read key: %s; using default value. hr = %08X\n", SV_UPDATE_FILE_REPLICATION_STATUS_URL_VALUE_NAME, HRESULT_FROM_WIN32( GetLastError() ) );

            inm_strcpy_s( szValue, ARRAYSIZE(szValue), "/update_file_replication_status.php" );
        }
        inm_strcpy_s( pSV_HOST_AGENT_PARAMS->szUpdateFileReplicationStatusURL, ARRAYSIZE(pSV_HOST_AGENT_PARAMS->szUpdateFileReplicationStatusURL), szValue );

        //
        // Optional parameter: InmSyncExe
        //
        dwCount = sizeof( szValue );
        dwResult = cregkey.QueryStringValue( SV_INMSYNC_EXE_VALUE_NAME, szValue, &dwCount );

        if( ERROR_SUCCESS != dwResult )
        {
            //DebugPrintf( "@ LINE %d in FILE %s \n", __LINE__, __FILE__ );
            //DebugPrintf( hr, "WARNING read key: %s; using default value. hr = %08X\n", SV_RSYNC_EXE_VALUE_NAME, HRESULT_FROM_WIN32( GetLastError() ) );

            inm_strcpy_s( szValue, ARRAYSIZE(szValue), "" );
        }
        inm_strcpy_s( pSV_HOST_AGENT_PARAMS->szInmsyncExe, ARRAYSIZE(pSV_HOST_AGENT_PARAMS->szInmsyncExe), szValue );


        //
        // Optional parameter: InmsyncExe timeout
        //
        if (!GetInmsyncTimeoutFromRegistry(pSV_HOST_AGENT_PARAMS->RsyncTimeOut)) {
            pSV_HOST_AGENT_PARAMS->RsyncTimeOut = 1800; // default seconds
        }


        //
        // Optional parameter: ShellCommand
        //
        dwCount = sizeof( szValue );
        dwResult = cregkey.QueryStringValue( SV_SHELL_COMMAND_VALUE_NAME, szValue, &dwCount );

        if( ERROR_SUCCESS != dwResult )
        {
            //DebugPrintf( "@ LINE %d in FILE %s \n", __LINE__, __FILE__ );
            //DebugPrintf( hr, "WARNING read key: %s; using default value. hr = %08X\n", SV_SHELL_COMMAND_VALUE_NAME, HRESULT_FROM_WIN32( GetLastError() ) );

            inm_strcpy_s( szValue, ARRAYSIZE(szValue), "" );
        }
        inm_strcpy_s( pSV_HOST_AGENT_PARAMS->szShellCommand, ARRAYSIZE(pSV_HOST_AGENT_PARAMS->szShellCommand), szValue );

        //now get Transport parameters
        // BUGBUG: should not fail if params not available. Use default values.
        hr = GetFTPParamsFromRegistry(SV_TRANSPORT_VALUE_NAME,pSV_HOST_AGENT_PARAMS);   
        if(S_OK != hr)
        {
            DebugPrintf( "@ LINE %d in FILE %s \n", __LINE__, __FILE__ );
            DebugPrintf( hr, "WARNING GetFTPParamsFromRegistry FAILED()... hr = %08X\n", hr ) ;
        }
        DebugPrintf( "@ LINE %d in FILE %s \n", __LINE__, __FILE__ );
        DebugPrintf("[INFO] Host agent type = %s\n", pSV_HOST_AGENT_PARAMS->szSVHostAgentType ) ;
        //AutoFS parameters
        if( SV_AGENT_FILE_REPLICATION != AgentType )
        {
            SV_AUTO_FS_PARAMETERS autoFSParams;
            hr = GetAutoFSInfoFromRegistry( pSV_HOST_AGENT_PARAMS->szSVHostAgentRegKey, &autoFSParams );

            if( FAILED( hr ) )
            {
                DebugPrintf( SV_LOG_ERROR, "FAILED Couldn't read AutoFS parameters, hr %08X\n", hr );
                break;
            }

            inm_strncpy_s(pSV_HOST_AGENT_PARAMS->szSVGetVisibleReadOnlyDrivesURL, ARRAYSIZE(pSV_HOST_AGENT_PARAMS->szSVGetVisibleReadOnlyDrivesURL), autoFSParams.szGetVisibleReadOnlyDrivesURL, INTERNET_MAX_URL_LENGTH);
            pSV_HOST_AGENT_PARAMS->szSVGetVisibleReadOnlyDrivesURL[INTERNET_MAX_URL_LENGTH] = '\0';

            inm_strncpy_s(pSV_HOST_AGENT_PARAMS->szSVGetVisibleReadWriteDrivesURL, ARRAYSIZE(pSV_HOST_AGENT_PARAMS->szSVGetVisibleReadWriteDrivesURL), autoFSParams.szGetVisibleReadWriteDrivesURL, INTERNET_MAX_URL_LENGTH);
            pSV_HOST_AGENT_PARAMS->szSVGetVisibleReadWriteDrivesURL[INTERNET_MAX_URL_LENGTH] = '\0';

            inm_strncpy_s(pSV_HOST_AGENT_PARAMS->szSVShouldUpdateResyncDrivesURL, ARRAYSIZE(pSV_HOST_AGENT_PARAMS->szSVShouldUpdateResyncDrivesURL), autoFSParams.szUpdateShouldResyncDrive, INTERNET_MAX_URL_LENGTH);
            pSV_HOST_AGENT_PARAMS->szSVShouldUpdateResyncDrivesURL[INTERNET_MAX_URL_LENGTH] = '\0';
        }


        //
        // Optional parameter: EnableFrLogFileDeletion
        //
        dwResult = cregkey.QueryDWORDValue( SV_ENABLE_FR_LOG_FILE_DELETION, pSV_HOST_AGENT_PARAMS->EnableFrLogFileDeletion );

        if( ERROR_SUCCESS != dwResult )
        {
            //DebugPrintf( "@ LINE %d in FILE %s \n", __LINE__, __FILE__ );
            //DebugPrintf( "WARNING read key: %s; using default value 0. hr = %08X\n", SV_ENABLE_FR_LOG_FILE_DELETION, HRESULT_FROM_WIN32( GetLastError() ) );
        }

        //
        // Optional parameter: EnableFrDeleteOptions
        //
        dwResult = cregkey.QueryDWORDValue( SV_ENABLE_FR_DELETE_OPTIONS, pSV_HOST_AGENT_PARAMS->EnableFrDeleteOptions );

        if( ERROR_SUCCESS != dwResult )
        {
            //DebugPrintf( "@ LINE %d in FILE %s \n", __LINE__, __FILE__ );
            //DebugPrintf( "WARNING read key: %s; using default value 0. hr = %08X\n", SV_ENABLE_FR_DELETE_OPTIONS, HRESULT_FROM_WIN32( GetLastError() ) );
        }

        //
        // Optional parameter: UseConfiguredIP
        //
        DWORD dwUseConfiguredIP = 0;
        dwResult = cregkey.QueryDWORDValue( SV_USE_CONFIGURED_IP, dwUseConfiguredIP );

        if( ERROR_SUCCESS != dwResult )
        {
            //DebugPrintf( "@ LINE %d in FILE %s \n", __LINE__, __FILE__ );
            //DebugPrintf( "WARNING read key: %s; using default value 0. hr = %08X\n", SV_USE_CONFIGURED_IP, HRESULT_FROM_WIN32( GetLastError() ) );
        }

        if( dwUseConfiguredIP )
        {
            ULONG cChars = sizeof( s_szConfiguredIP );
            dwResult = cregkey.QueryStringValue( SV_CONFIGURED_IP, s_szConfiguredIP, &cChars );

            if( ERROR_SUCCESS != dwResult )
            {
                hr = GetLastError();
                DebugPrintf( "@ LINE %d in FILE %s \n", __LINE__, __FILE__ );
                DebugPrintf( "FAILED Configured IP not read, err %d\n", GetLastError() );
            }
        }
        else
        {
            s_szConfiguredIP[ 0 ] = 0;
        }

        //
        // Optional parameter: UseConfiguredHostname
        //
        DWORD dwUseConfiguredHostname = 0;
        dwResult = cregkey.QueryDWORDValue( SV_USE_CONFIGURED_HOSTNAME, dwUseConfiguredHostname );

        if( ERROR_SUCCESS != dwResult )
        {
            //DebugPrintf( "@ LINE %d in FILE %s \n", __LINE__, __FILE__ );
            //DebugPrintf( "WARNING read key: %s; using default value 0. hr = %08X\n", SV_USE_CONFIGURED_HOSTNAME, HRESULT_FROM_WIN32( GetLastError() ) );
        }

        if( dwUseConfiguredHostname )
        {
            ULONG cChars = sizeof( s_szConfiguredHostname );
            dwResult = cregkey.QueryStringValue( SV_CONFIGURED_HOSTNAME, s_szConfiguredHostname, &cChars );

            if( ERROR_SUCCESS != dwResult )
            {
                hr = GetLastError();
                DebugPrintf( "@ LINE %d in FILE %s \n", __LINE__, __FILE__ );
                DebugPrintf( "FAILED Configured hostname not read, err %d\n", GetLastError() );
            }
        }
        else
        {
            s_szConfiguredHostname[ 0 ] = 0;
        }

        dwResult = cregkey.QueryDWORDValue( SV_MAX_FR_LOG_PAYLOAD_VALUE_NAME, pSV_HOST_AGENT_PARAMS->MaxFrLogPayload );

        if( ERROR_SUCCESS != dwResult || 0 == pSV_HOST_AGENT_PARAMS->MaxFrLogPayload )
        {
            //DebugPrintf( "@ LINE %d in FILE %s \n", __LINE__, __FILE__ );
            //DebugPrintf( "WARNING read key: %s; using default value 500K. hr = %08X\n", SV_MAX_FR_LOG_PAYLOAD_VALUE_NAME, HRESULT_FROM_WIN32( GetLastError() ) );
            pSV_HOST_AGENT_PARAMS->MaxFrLogPayload = 500 * 1024;
        }

        //
        // Optional: FR uses 'SendSignalExe' to send signals to rsync
        //
        char szSendSignalExe[ SV_MAX_PATH+1 ];
        ULONG cChars = sizeof( szSendSignalExe );
        dwResult = cregkey.QueryStringValue( SV_FR_SEND_SIGNAL_EXE, szSendSignalExe, &cChars );

        if( ERROR_SUCCESS != dwResult )
        {
            DebugPrintf( "@ LINE %d in FILE %s \n", __LINE__, __FILE__ );
            DebugPrintf( "WARNING Couldn't read %s, err %d\n", SV_FR_SEND_SIGNAL_EXE, GetLastError() );
        }
        else
        {
            inm_strncpy_s(pSV_HOST_AGENT_PARAMS->szSendSignalExe, ARRAYSIZE(pSV_HOST_AGENT_PARAMS->szSendSignalExe), szSendSignalExe, ARRAYSIZE(szSendSignalExe));
        }

        DWORD dwenableEncryption = 0;
        dwResult = cregkey.QueryDWORDValue( SV_FR_ENABLE_ENCRYPTION, dwenableEncryption );
        if( ERROR_SUCCESS == dwResult )
        {
            if(dwenableEncryption == 1 )
            {    
                bEnableEncryption =  true;
                DebugPrintf(SV_LOG_DEBUG, "Encryption is Enabled\n");
            }
            else
            {
                bEnableEncryption = false;
                DebugPrintf(SV_LOG_DEBUG, "Encryption is disabled\n");
            }
        }
        else
        {
            bEnableEncryption =  true;
            DebugPrintf(SV_LOG_DEBUG, "Encryption is Enabled\n");
        }
        DWORD dwRegisterHostTimeIntervel = 0;
        dwResult = cregkey.QueryDWORDValue( SV_FR_REGISTER_HOST_INTERVEL, dwRegisterHostTimeIntervel );
        if( ERROR_SUCCESS == dwResult )
        {
            RegisterHostIntervel =     dwRegisterHostTimeIntervel;
            DebugPrintf(SV_LOG_DEBUG, "RegisterHost call for every %d seconds\n",RegisterHostIntervel);
        }
        else
        {
            RegisterHostIntervel =  180;
            DebugPrintf(SV_LOG_DEBUG, "RegisterHost call for every %d seconds\n",RegisterHostIntervel);
        }

        // SV_REGISTER_CLUSTER_INFO_URL_VALUE_NAME
        dwCount = sizeof(szValue);
        dwResult = cregkey.QueryStringValue(SV_REGISTER_CLUSTER_INFO_URL_VALUE_NAME, szValue, &dwCount);
        if (ERROR_SUCCESS != dwResult) {
            char const* pszDefaultUrl = "/register_cluster_info.php";
            hr = HRESULT_FROM_WIN32(dwResult);
            DebugPrintf("@ LINE %d in FILE %s \n", __LINE__, __FILE__);
            DebugPrintf(hr, "WARNING cregkey.QueryValue()... key: %s; hr = %08X, using default %s\n", SV_REGISTER_CLUSTER_INFO_URL_VALUE_NAME, hr, pszDefaultUrl);
            inm_strncpy_s(pSV_HOST_AGENT_PARAMS->szRegisterClusterInfoURL, ARRAYSIZE(pSV_HOST_AGENT_PARAMS->szRegisterClusterInfoURL), pszDefaultUrl, sizeof(pSV_HOST_AGENT_PARAMS->szRegisterClusterInfoURL));
            hr = S_FALSE;
        } else {
            inm_strncpy_s(pSV_HOST_AGENT_PARAMS->szRegisterClusterInfoURL, ARRAYSIZE(pSV_HOST_AGENT_PARAMS->szRegisterClusterInfoURL), szValue, sizeof(pSV_HOST_AGENT_PARAMS->szRegisterClusterInfoURL));
        }

        // SV_UPDATE_AGENT_LOG_URL_VALUE_NAME
        dwCount = sizeof(szValue);
        dwResult = cregkey.QueryStringValue(SV_UPDATE_AGENT_LOG_URL_VALUE_NAME, szValue, &dwCount);
        if (ERROR_SUCCESS != dwResult) {
            char const* pszDefaultUrl = "/update_agent_log.php";
            hr = HRESULT_FROM_WIN32(dwResult);
            DebugPrintf("@ LINE %d in FILE %s \n", __LINE__, __FILE__);
            DebugPrintf(hr, "WARNING cregkey.QueryValue()... key: %s; hr = %08X, using default %s\n", SV_UPDATE_AGENT_LOG_URL_VALUE_NAME, hr, pszDefaultUrl);
            inm_strncpy_s(pSV_HOST_AGENT_PARAMS->szUpdateAgentLogURL, ARRAYSIZE(pSV_HOST_AGENT_PARAMS->szUpdateAgentLogURL), pszDefaultUrl, sizeof(pSV_HOST_AGENT_PARAMS->szUpdateAgentLogURL));
            hr = S_FALSE;
        } else {
            inm_strncpy_s(pSV_HOST_AGENT_PARAMS->szUpdateAgentLogURL, ARRAYSIZE(pSV_HOST_AGENT_PARAMS->szUpdateAgentLogURL), szValue, sizeof(pSV_HOST_AGENT_PARAMS->szUpdateAgentLogURL));
        }

        // SV_GET_VOLUME_GROUP_SETTINGS_URL_VALUE_NAME
        dwCount = sizeof(szValue);
        dwResult = cregkey.QueryStringValue(SV_GET_VOLUME_GROUP_SETTINGS_URL_VALUE_NAME, szValue, &dwCount);
        if (ERROR_SUCCESS != dwResult) {
            char const* pszDefaultUrl = "/get_volume_group_settings.php";
            hr = HRESULT_FROM_WIN32(dwResult);
            DebugPrintf("@ LINE %d in FILE %s \n", __LINE__, __FILE__);
            DebugPrintf(hr, "WARNING cregkey.QueryValue()... key: %s; hr = %08X, using default %s\n", SV_GET_VOLUME_GROUP_SETTINGS_URL_VALUE_NAME, hr, pszDefaultUrl);
            inm_strncpy_s(pSV_HOST_AGENT_PARAMS->szGetVolumeGroupSettingsUrl, ARRAYSIZE(pSV_HOST_AGENT_PARAMS->szGetVolumeGroupSettingsUrl), pszDefaultUrl, sizeof(pSV_HOST_AGENT_PARAMS->szGetVolumeGroupSettingsUrl));
            hr = S_FALSE;
        } else {
            inm_strncpy_s(pSV_HOST_AGENT_PARAMS->szGetVolumeGroupSettingsUrl, ARRAYSIZE(pSV_HOST_AGENT_PARAMS->szGetVolumeGroupSettingsUrl), szValue, sizeof(pSV_HOST_AGENT_PARAMS->szGetVolumeGroupSettingsUrl));
        }
        
        if( SV_AGENT_FILE_REPLICATION == AgentType ) {
            // SV_UPDATE_PERMISSION_STATE_URL_VALUE_NAME
        dwCount = sizeof(szValue);
            dwResult = cregkey.QueryStringValue(SV_UPDATE_PERMISSION_STATE_URL_VALUE_NAME, szValue, &dwCount);
        if (ERROR_SUCCESS != dwResult) {
                char const* pszDefaultUrl = "/update_permission_state.php";
            hr = HRESULT_FROM_WIN32(dwResult);
            DebugPrintf("@ LINE %d in FILE %s \n", __LINE__, __FILE__);
                DebugPrintf(hr, "WARNING cregkey.QueryValue()... key: %s; hr = %08X, using default %s\n", SV_UPDATE_PERMISSION_STATE_URL_VALUE_NAME, hr, pszDefaultUrl);
                inm_strncpy_s(pSV_HOST_AGENT_PARAMS->szUpdatePermissionStateUrl, ARRAYSIZE(pSV_HOST_AGENT_PARAMS->szUpdatePermissionStateUrl), pszDefaultUrl, sizeof(pSV_HOST_AGENT_PARAMS->szUpdatePermissionStateUrl));
            hr = S_FALSE;
        } else {
                inm_strncpy_s(pSV_HOST_AGENT_PARAMS->szUpdatePermissionStateUrl, ARRAYSIZE(pSV_HOST_AGENT_PARAMS->szUpdatePermissionStateUrl), szValue, sizeof(pSV_HOST_AGENT_PARAMS->szUpdatePermissionStateUrl));
            }
        }  

        // fast sync compare sizes
        dwResult = cregkey.QueryDWORDValue(FAST_SYNC_MAX_CHUNK_SIZE_NAME, pSV_HOST_AGENT_PARAMS->fastSyncMaxChunkSize);
        if (ERROR_SUCCESS != dwResult) {
            DebugPrintf(SV_LOG_WARNING, "WARNING GetAgentParamsFromRegistry query %s failed (settting to default value): %d\n", 
                        FAST_SYNC_MAX_CHUNK_SIZE_NAME, dwResult);
            pSV_HOST_AGENT_PARAMS->fastSyncMaxChunkSize = FAST_SYNC_MAX_CHUNK_SIZE_DEFAULT;  // default value to use 64MB 
            dwResult = cregkey.SetDWORDValue(FAST_SYNC_MAX_CHUNK_SIZE_NAME, pSV_HOST_AGENT_PARAMS->fastSyncMaxChunkSize);
            if (ERROR_SUCCESS != dwResult) {
                DebugPrintf(SV_LOG_WARNING, "WARNING GetAgentParamsFromRegistry set failed (using default value): %d\n", 
                             FAST_SYNC_MAX_CHUNK_SIZE_NAME, dwResult);
            }
        }

        dwResult = cregkey.QueryDWORDValue(FAST_SYNC_HASH_COMPARE_DATA_SIZE_NAME, pSV_HOST_AGENT_PARAMS->fastSyncHashCompareDataSize);
        if (ERROR_SUCCESS != dwResult) {
            DebugPrintf(SV_LOG_WARNING, "WARNING GetAgentParamsFromRegistry query %s failed (settting to default value): %d\n", 
                        FAST_SYNC_HASH_COMPARE_DATA_SIZE_NAME, dwResult);
            pSV_HOST_AGENT_PARAMS->fastSyncHashCompareDataSize = FAST_SYNC_HASH_COMPARE_DATA_SIZE_DEFAULT; 
            dwResult = cregkey.SetDWORDValue(FAST_SYNC_HASH_COMPARE_DATA_SIZE_NAME, pSV_HOST_AGENT_PARAMS->fastSyncHashCompareDataSize);
            if (ERROR_SUCCESS != dwResult) {
                DebugPrintf(SV_LOG_WARNING, "WARNING GetAgentParamsFromRegistry set %s failed (using default value): %d\n", 
                            FAST_SYNC_HASH_COMPARE_DATA_SIZE_NAME, dwResult);
            }
        } 

        // resync source directory path (i.e. cx location)
        dwCount = sizeof( pSV_HOST_AGENT_PARAMS->szResyncSourceDirectoryPath );
        dwResult = cregkey.QueryStringValue(RESYNC_SOURCE_DIRECTORY_PATH_NAME, pSV_HOST_AGENT_PARAMS->szResyncSourceDirectoryPath, &dwCount );
        if( ERROR_SUCCESS != dwResult )
        {
            hr = HRESULT_FROM_WIN32( dwResult );            
            DebugPrintf( SV_LOG_ERROR, "FAILED GetAgentParamsFromRegistry query %s: hr =  %08X\n",RESYNC_SOURCE_DIRECTORY_PATH_NAME, hr );
            break;
        }

        // max resync threads
        dwResult = cregkey.QueryDWORDValue( SV_MAX_RESYNC_THREADS_VALUE_NAME, pSV_HOST_AGENT_PARAMS->maxRsyncThreads );
        if (ERROR_SUCCESS != dwResult) {
            DebugPrintf(SV_LOG_WARNING, "WARNING GetAgentParamsFromRegistry query %s failed (settting to default value): %d\n", 
                SV_MAX_RESYNC_THREADS_VALUE_NAME, dwResult);
            pSV_HOST_AGENT_PARAMS->maxRsyncThreads = DEFAULT_RESYNC_THREADS;
            dwResult = cregkey.SetDWORDValue(SV_MAX_RESYNC_THREADS_VALUE_NAME, pSV_HOST_AGENT_PARAMS->maxRsyncThreads);
            if (ERROR_SUCCESS != dwResult) {
                DebugPrintf(SV_LOG_WARNING, "WARNING GetAgentParamsFromRegistry set %s failed (using default value): %d\n", 
                    SV_MAX_RESYNC_THREADS_VALUE_NAME, dwResult);
            }
        } 

        // settings polling interval 
        dwResult = cregkey.QueryDWORDValue( SV_SETTINGS_POLLING_INTERVAL, pSV_HOST_AGENT_PARAMS->settingsPollingInterval );
        if (ERROR_SUCCESS != dwResult) {
            DebugPrintf(SV_LOG_WARNING, "WARNING GetAgentParamsFromRegistry query %s failed (settting to default value): %d\n", 
                SV_SETTINGS_POLLING_INTERVAL, dwResult);
            pSV_HOST_AGENT_PARAMS->settingsPollingInterval = DEFAULT_SETTINGS_POLLING_INTERVAL;
        }

        // Query the agent install path
        CRegKey cregkeyInstall;

        if( SV_AGENT_FILE_REPLICATION == AgentType )
            dwResult = cregkeyInstall.Open(HKEY_LOCAL_MACHINE, SV_FILEREP_AGENT_VALUE_NAME);
        else
            dwResult = cregkeyInstall.Open(HKEY_LOCAL_MACHINE, SV_VXAGENT_VALUE_NAME);

        if (ERROR_SUCCESS != dwResult) {
            DebugPrintf(SV_LOG_WARNING, "WARNING GetAgentParamsFromRegistry cregKeyInstall.open() to %s or %s failed. Error=%d\n", 
                SV_FILEREP_AGENT_VALUE_NAME, SV_VXAGENT_VALUE_NAME, dwResult);
        }
        else
        {
            DWORD dwCount = sizeof( pSV_HOST_AGENT_PARAMS->AgentInstallPath );
            dwResult = cregkeyInstall.QueryStringValue(SV_AGENT_INSTALL_LOCATON_VALUE_NAME, pSV_HOST_AGENT_PARAMS->AgentInstallPath, &dwCount);
            if (ERROR_SUCCESS != dwResult) {
                DebugPrintf(SV_LOG_WARNING, "WARNING GetAgentParamsFromRegistry cregKeyInstall.QueryStringValue() for %s failed. Error=%d\n", 
                SV_VXAGENT_VALUE_NAME, dwResult);
            }
        }

        // min cache free disk space percent
        dwResult = cregkey.QueryDWORDValue( SV_MIN_CACHE_FREE_DISK_SPACE_PERCENT, pSV_HOST_AGENT_PARAMS->minCacheFreeDiskSpacePercent );
        if (ERROR_SUCCESS != dwResult) {
            DebugPrintf(SV_LOG_WARNING, "WARNING GetAgentParamsFromRegistry query %s failed (settting to default value): %d\n", 
                SV_MIN_CACHE_FREE_DISK_SPACE_PERCENT, dwResult);
            pSV_HOST_AGENT_PARAMS->minCacheFreeDiskSpacePercent = DEFAULT_MIN_CACHE_FREE_DISK_SPACE_PERCENT;
            dwResult = cregkey.SetDWORDValue(SV_MIN_CACHE_FREE_DISK_SPACE_PERCENT, pSV_HOST_AGENT_PARAMS->minCacheFreeDiskSpacePercent);
            if (ERROR_SUCCESS != dwResult) {
                DebugPrintf(SV_LOG_WARNING, "WARNING GetAgentParamsFromRegistry set %s failed (using default value): %d\n", 
                    SV_MIN_CACHE_FREE_DISK_SPACE_PERCENT, dwResult);
            }
        } 

        // min cache free disk space 
        dwResult = cregkey.QueryDWORDValue( SV_MIN_CACHE_FREE_DISK_SPACE, pSV_HOST_AGENT_PARAMS->minCacheFreeDiskSpace );
        if (ERROR_SUCCESS != dwResult) {
            DebugPrintf(SV_LOG_WARNING, "WARNING GetAgentParamsFromRegistry query %s failed (settting to default value): %d\n", 
                SV_MIN_CACHE_FREE_DISK_SPACE, dwResult);
            pSV_HOST_AGENT_PARAMS->minCacheFreeDiskSpace = DEFAULT_MIN_CACHE_FREE_DISK_SPACE;
            dwResult = cregkey.SetDWORDValue(SV_MIN_CACHE_FREE_DISK_SPACE, pSV_HOST_AGENT_PARAMS->minCacheFreeDiskSpace);
            if (ERROR_SUCCESS != dwResult) {
                DebugPrintf(SV_LOG_WARNING, "WARNING GetAgentParamsFromRegistry set %s failed (using default value): %d\n", 
                    SV_MIN_CACHE_FREE_DISK_SPACE, dwResult);
            }
        } 
    }
    while( false );

    cregkey.Close();
    DebugPrintf(SV_LOG_DEBUG, "Exiting %s\n", __FUNCTION__);
    return( hr );
}