#include "precomp.h"

#include <inetcpl.h>

#include "rsop.h"
#include "resource.h"

#include <tchar.h>

// Private forward decalarations
static void pxyEnableDlgItems(HWND hDlg, BOOL fSame, BOOL fUseProxy);

static INT_PTR CALLBACK importConnSettingsRSoPProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);

// defines for tree view image list
#define BITMAP_WIDTH    16
#define BITMAP_HEIGHT   16
#define CONN_BITMAPS    2
#define IMAGE_LAN       0
#define IMAGE_MODEM     1

/////////////////////////////////////////////////////////////////////
void InitCSDlgInRSoPMode(HWND hDlg, CDlgRSoPData *pDRD)
{
    __try
    {
        BOOL bImport = FALSE;
        _bstr_t bstrClass = L"RSOP_IEConnectionSettings";
        HRESULT hr = pDRD->GetArrayOfPSObjects(bstrClass, L"rsopPrecedence");
        if (SUCCEEDED(hr))
        {
            CPSObjData **paCSObj = pDRD->GetCSObjArray();
            long nCSObjects = pDRD->GetCSObjCount();

            BOOL bImportHandled = FALSE;
            BOOL bDeleteHandled = FALSE;
            for (long nObj = 0; nObj < nCSObjects; nObj++)
            {
                // importCurrentConnSettings field
                _variant_t vtValue;
                if (!bImportHandled)
                {
                    hr = paCSObj[nObj]->pObj->Get(L"importCurrentConnSettings", 0, &vtValue, NULL, NULL);
                    if (SUCCEEDED(hr) && !IsVariantNull(vtValue))
                    {
                        bImport = (bool)vtValue ? TRUE : FALSE;
                        CheckRadioButton(hDlg, IDC_CSNOIMPORT, IDC_CSIMPORT,
                                        (bool)vtValue ? IDC_CSIMPORT : IDC_CSNOIMPORT);
                        bImportHandled = TRUE;

                        DWORD dwCurGPOPrec = GetGPOPrecedence(paCSObj[nObj]->pObj, L"rsopPrecedence");
                        pDRD->SetImportedConnSettPrec(dwCurGPOPrec);
                    }
                }

                // deleteExistingConnSettings field
                if (!bDeleteHandled)
                {
                    hr = paCSObj[nObj]->pObj->Get(L"deleteExistingConnSettings", 0, &vtValue, NULL, NULL);
                    if (SUCCEEDED(hr) && !IsVariantNull(vtValue))
                    {
                        CheckDlgButton(hDlg, IDC_DELCONNECT, BST_CHECKED);
                        bDeleteHandled = TRUE;
                    }
                }

                // no need to process other GPOs since enabled properties have been found
                if (bImportHandled && bDeleteHandled)
                    break;
            }
        }

        EnableDlgItem2(hDlg, IDC_CSNOIMPORT, FALSE);
        EnableDlgItem2(hDlg, IDC_CSIMPORT, FALSE);
        EnableDlgItem2(hDlg, IDC_MODIFYCONNECT, bImport);

        EnableDlgItem2(hDlg, IDC_DELCONNECT, FALSE);
    }
    __except(TRUE)
    {
    }
}

/////////////////////////////////////////////////////////////////////
HRESULT InitCSPrecPage(CDlgRSoPData *pDRD, HWND hwndList)
{
    HRESULT hr = NOERROR;
    __try
    {
        _bstr_t bstrClass = L"RSOP_IEConnectionSettings";
        hr = pDRD->GetArrayOfPSObjects(bstrClass);
        if (SUCCEEDED(hr))
        {
            CPSObjData **paCSObj = pDRD->GetCSObjArray();
            long nCSObjects = pDRD->GetCSObjCount();
            for (long nObj = 0; nObj < nCSObjects; nObj++)
            {
                _bstr_t bstrGPOName = pDRD->GetGPONameFromPSAssociation(paCSObj[nObj]->pObj,
                                                                        L"rsopPrecedence");

                // importCurrentConnSettings field
                BOOL bImport = FALSE;
                _variant_t vtValue;
                hr = paCSObj[nObj]->pObj->Get(L"importCurrentConnSettings", 0, &vtValue, NULL, NULL);
                if (SUCCEEDED(hr) && !IsVariantNull(vtValue))
                    bImport = (bool)vtValue ? TRUE : FALSE;

                // deleteExistingConnSettings field
                BOOL bDelete = FALSE;
                hr = paCSObj[nObj]->pObj->Get(L"deleteExistingConnSettings", 0, &vtValue, NULL, NULL);
                if (SUCCEEDED(hr) && !IsVariantNull(vtValue))
                    bDelete = (bool)vtValue ? TRUE : FALSE;

                _bstr_t bstrSetting;
                UINT iSettingString = 0;
                WCHAR wszTemp[128];
                if (bImport && bDelete)
                    iSettingString = IDS_CS_IMP_DEL_SETTING;
                else if (bImport)
                    iSettingString = IDS_CS_IMPORT_SETTING;
                else if (bDelete)
                    iSettingString = IDS_CS_DELETE_SETTING;
                else
                    bstrSetting = GetDisabledString();

                if (iSettingString > 0)
                {
                    LoadString(g_hInstance, iSettingString, wszTemp, countof(wszTemp));
                    bstrSetting = wszTemp;
                }

                InsertPrecedenceListItem(hwndList, nObj, bstrGPOName, bstrSetting);
            }
        }
    }
    __except(TRUE)
    {
    }
    return hr;
}

/////////////////////////////////////////////////////////////////////
void InitAutoConfigDlgInRSoPMode(HWND hDlg, CDlgRSoPData *pDRD)
{
    __try
    {
        _bstr_t bstrClass = L"RSOP_IEConnectionSettings";
        HRESULT hr = pDRD->GetArrayOfPSObjects(bstrClass, L"rsopPrecedence");
        if (SUCCEEDED(hr))
        {
            CPSObjData **paCSObj = pDRD->GetCSObjArray();
            long nCSObjects = pDRD->GetCSObjCount();

            BOOL bDetectHandled = FALSE;
            BOOL bEnableHandled = FALSE;
            for (long nObj = 0; nObj < nCSObjects; nObj++)
            {
                // autoDetectConfigSettings field
                _variant_t vtValue;
                if (!bDetectHandled)
                {
                    hr = paCSObj[nObj]->pObj->Get(L"autoDetectConfigSettings", 0, &vtValue, NULL, NULL);
                    if (SUCCEEDED(hr) && !IsVariantNull(vtValue))
                    {
                        CheckDlgButton(hDlg, IDC_AUTODETECT, BST_CHECKED);
                        bDetectHandled = TRUE;
                    }
                }

                // autoConfigEnable field
                if (!bEnableHandled)
                {
                    hr = paCSObj[nObj]->pObj->Get(L"autoConfigEnable", 0, &vtValue, NULL, NULL);
                    if (SUCCEEDED(hr) && !IsVariantNull(vtValue))
                    {
                        CheckDlgButton(hDlg, IDC_YESAUTOCON, BST_CHECKED);
                        bEnableHandled = TRUE;

                        // autoConfigTime
                        hr = paCSObj[nObj]->pObj->Get(L"autoConfigTime", 0, &vtValue, NULL, NULL);
                        if (SUCCEEDED(hr) && !IsVariantNull(vtValue))
                        {
                            TCHAR szTime[10] = _T("");
                            wnsprintf(szTime, countof(szTime), _T("%ld"), (long)vtValue);
                            SetDlgItemText(hDlg, IDE_AUTOCONFIGTIME, szTime);
                        }

                        // autoConfigURL
                        _bstr_t bstrValue;
                        hr = paCSObj[nObj]->pObj->Get(L"autoConfigURL", 0, &vtValue, NULL, NULL);
                        if (SUCCEEDED(hr) && !IsVariantNull(vtValue))
                        {
                            bstrValue = vtValue;
                            SetDlgItemText(hDlg, IDE_AUTOCONFIGURL, (LPCTSTR)bstrValue);
                        }

                        // autoProxyURL
                        hr = paCSObj[nObj]->pObj->Get(L"autoProxyURL", 0, &vtValue, NULL, NULL);
                        if (SUCCEEDED(hr) && !IsVariantNull(vtValue))
                        {
                            bstrValue = vtValue;
                            SetDlgItemText(hDlg, IDE_AUTOPROXYURL, (LPCTSTR)bstrValue);
                        }

                    }
                }

                // no need to process other GPOs since enabled properties have been found
                if (bDetectHandled && bEnableHandled)
                    break;
            }
        }

        EnableDlgItem2(hDlg, IDC_AUTODETECT, FALSE);

        EnableDlgItem2(hDlg, IDC_YESAUTOCON, FALSE);
        EnableDlgItem2(hDlg, IDE_AUTOCONFIGTIME, FALSE);
        EnableDlgItem2(hDlg, IDE_AUTOCONFIGURL, FALSE);
        EnableDlgItem2(hDlg, IDE_AUTOPROXYURL, FALSE);
    }
    __except(TRUE)
    {
    }
}

/////////////////////////////////////////////////////////////////////
HRESULT InitAutoDetectCfgPrecPage(CDlgRSoPData *pDRD, HWND hwndList)
{
    HRESULT hr = NOERROR;
    __try
    {
        _bstr_t bstrClass = L"RSOP_IEConnectionSettings";
        hr = pDRD->GetArrayOfPSObjects(bstrClass);
        if (SUCCEEDED(hr))
        {
            CPSObjData **paCSObj = pDRD->GetCSObjArray();
            long nCSObjects = pDRD->GetCSObjCount();
            for (long nObj = 0; nObj < nCSObjects; nObj++)
            {
                _bstr_t bstrGPOName = pDRD->GetGPONameFromPSAssociation(paCSObj[nObj]->pObj,
                                                                        L"rsopPrecedence");

                // autoDetectConfigSettings field
                BOOL bDetect = FALSE;
                _variant_t vtValue;
                hr = paCSObj[nObj]->pObj->Get(L"autoDetectConfigSettings", 0, &vtValue, NULL, NULL);
                if (SUCCEEDED(hr) && !IsVariantNull(vtValue))
                    bDetect = (bool)vtValue ? TRUE : FALSE;

                _bstr_t bstrSetting;
                if (bDetect)
                    bstrSetting = GetEnabledString();
                else
                    bstrSetting = GetDisabledString();

                InsertPrecedenceListItem(hwndList, nObj, bstrGPOName, bstrSetting);
            }
        }
    }
    __except(TRUE)
    {
    }
    return hr;
}

/////////////////////////////////////////////////////////////////////
HRESULT InitAutoCfgEnablePrecPage(CDlgRSoPData *pDRD, HWND hwndList)
{
    HRESULT hr = NOERROR;
    __try
    {
        _bstr_t bstrClass = L"RSOP_IEConnectionSettings";
        hr = pDRD->GetArrayOfPSObjects(bstrClass);
        if (SUCCEEDED(hr))
        {
            CPSObjData **paCSObj = pDRD->GetCSObjArray();
            long nCSObjects = pDRD->GetCSObjCount();
            for (long nObj = 0; nObj < nCSObjects; nObj++)
            {
                _bstr_t bstrGPOName = pDRD->GetGPONameFromPSAssociation(paCSObj[nObj]->pObj,
                                                                        L"rsopPrecedence");

                // autoConfigEnable field
                BOOL bEnable = FALSE;
                _variant_t vtValue;
                hr = paCSObj[nObj]->pObj->Get(L"autoConfigEnable", 0, &vtValue, NULL, NULL);
                if (SUCCEEDED(hr) && !IsVariantNull(vtValue))
                    bEnable = (bool)vtValue ? TRUE : FALSE;

                _bstr_t bstrSetting;
                if (bEnable)
                    bstrSetting = GetEnabledString();
                else
                    bstrSetting = GetDisabledString();

                InsertPrecedenceListItem(hwndList, nObj, bstrGPOName, bstrSetting);
            }
        }
    }
    __except(TRUE)
    {
    }
    return hr;
}

/////////////////////////////////////////////////////////////////////
void InitProxyDlgInRSoPMode(HWND hDlg, CDlgRSoPData *pDRD)
{
    __try
    {
        _bstr_t bstrClass = L"RSOP_IEConnectionSettings";
        HRESULT hr = pDRD->GetArrayOfPSObjects(bstrClass, L"rsopPrecedence");
        if (SUCCEEDED(hr))
        {
            CPSObjData **paCSObj = pDRD->GetCSObjArray();
            long nCSObjects = pDRD->GetCSObjCount();

            for (long nObj = 0; nObj < nCSObjects; nObj++)
            {
                // enableProxy field
                _variant_t vtValue;
                hr = paCSObj[nObj]->pObj->Get(L"enableProxy", 0, &vtValue, NULL, NULL);
                if (SUCCEEDED(hr) && !IsVariantNull(vtValue))
                {
                    if ((bool)vtValue)
                        CheckDlgButton(hDlg, IDC_YESPROXY, BST_CHECKED);

                    // httpProxyServer
                    _bstr_t bstrValue;
                    hr = paCSObj[nObj]->pObj->Get(L"httpProxyServer", 0, &vtValue, NULL, NULL);
                    if (SUCCEEDED(hr) && !IsVariantNull(vtValue))
                    {
                        bstrValue = vtValue;
                        SetProxyDlg(hDlg, (LPCTSTR)bstrValue, IDE_HTTPPROXY, IDE_HTTPPORT, TRUE);
                    }

                    // useSameProxy
                    hr = paCSObj[nObj]->pObj->Get(L"useSameProxy", 0, &vtValue, NULL, NULL);
                    if (SUCCEEDED(hr) && !IsVariantNull(vtValue))
                    {
                        if ((bool)vtValue)
                        {
                            CheckDlgButton(hDlg, IDC_SAMEFORALL, BST_CHECKED);

                            SetProxyDlg(hDlg, (LPCTSTR)bstrValue, IDE_FTPPROXY,    IDE_FTPPORT,    TRUE);
                            SetProxyDlg(hDlg, (LPCTSTR)bstrValue, IDE_GOPHERPROXY, IDE_GOPHERPORT, TRUE);
                            SetProxyDlg(hDlg, (LPCTSTR)bstrValue, IDE_SECPROXY,    IDE_SECPORT,    TRUE);
                            SetProxyDlg(hDlg, (LPCTSTR)bstrValue, IDE_SOCKSPROXY,  IDE_SOCKSPORT,  FALSE);
                        }
                        else
                        {
                            // ftpProxyServer
                            hr = paCSObj[nObj]->pObj->Get(L"ftpProxyServer", 0, &vtValue, NULL, NULL);
                            if (SUCCEEDED(hr) && !IsVariantNull(vtValue))
                            {
                                bstrValue = vtValue;
                                SetProxyDlg(hDlg, (LPCTSTR)bstrValue, IDE_FTPPROXY,    IDE_FTPPORT,    TRUE);
                            }

                            // gopherProxyServer
                            hr = paCSObj[nObj]->pObj->Get(L"gopherProxyServer", 0, &vtValue, NULL, NULL);
                            if (SUCCEEDED(hr) && !IsVariantNull(vtValue))
                            {
                                bstrValue = vtValue;
                                SetProxyDlg(hDlg, (LPCTSTR)bstrValue, IDE_GOPHERPROXY, IDE_GOPHERPORT, TRUE);
                            }

                            // secureProxyServer
                            hr = paCSObj[nObj]->pObj->Get(L"secureProxyServer", 0, &vtValue, NULL, NULL);
                            if (SUCCEEDED(hr) && !IsVariantNull(vtValue))
                            {
                                bstrValue = vtValue;
                                SetProxyDlg(hDlg, (LPCTSTR)bstrValue, IDE_SECPROXY,    IDE_SECPORT,    TRUE);
                            }

                            // socksProxyServer
                            hr = paCSObj[nObj]->pObj->Get(L"socksProxyServer", 0, &vtValue, NULL, NULL);
                            if (SUCCEEDED(hr) && !IsVariantNull(vtValue))
                            {
                                bstrValue = vtValue;
                                SetProxyDlg(hDlg, (LPCTSTR)bstrValue, IDE_SOCKSPROXY,  IDE_SOCKSPORT,  FALSE);
                            }
                        }
                    }

                    // proxyOverride
                    hr = paCSObj[nObj]->pObj->Get(L"proxyOverride", 0, &vtValue, NULL, NULL);
                    if (SUCCEEDED(hr) && !IsVariantNull(vtValue))
                    {
                        bstrValue = vtValue;

                        TCHAR szProxy[MAX_PATH];
                        StrCpy(szProxy, (LPCTSTR)bstrValue);

                        if (TEXT('\0') == szProxy[0])
                            StrCpy(szProxy, LOCALPROXY);

                        LPTSTR pszLocal = StrStr(szProxy, LOCALPROXY);
                        if (NULL != pszLocal)
                        {
                            if (pszLocal == szProxy)
                            {
                                LPTSTR pszSemicolon = pszLocal + countof(LOCALPROXY)-1;
                                if (TEXT(';') == *pszSemicolon)
                                    pszSemicolon++;

                                StrCpy(pszLocal, pszSemicolon);
                            }
                            else if (TEXT('\0') == *(pszLocal + countof(LOCALPROXY)-1))
                                *(pszLocal - 1) = TEXT('\0');

                            CheckDlgButton(hDlg, IDC_DISPROXYLOCAL, TRUE);
                        }
                        SetDlgItemText(hDlg, IDE_DISPROXYADR, szProxy);
                    }

                    break;
                }
            }
        }

        EnableDlgItem2(hDlg, IDC_YESPROXY, FALSE);
        EnableDlgItem2(hDlg, IDC_SAMEFORALL, FALSE);

        EnableDlgItem2(hDlg, IDE_HTTPPROXY, FALSE);
        EnableDlgItem2(hDlg, IDE_HTTPPORT, FALSE);
        EnableDlgItem2(hDlg, IDE_FTPPROXY, FALSE);
        EnableDlgItem2(hDlg, IDE_FTPPORT, FALSE);
        EnableDlgItem2(hDlg, IDE_GOPHERPROXY, FALSE);
        EnableDlgItem2(hDlg, IDE_GOPHERPORT, FALSE);
        EnableDlgItem2(hDlg, IDE_SECPROXY, FALSE);
        EnableDlgItem2(hDlg, IDE_SECPORT, FALSE);
        EnableDlgItem2(hDlg, IDE_SOCKSPROXY, FALSE);
        EnableDlgItem2(hDlg, IDE_SOCKSPORT, FALSE);

        EnableDlgItem2(hDlg, IDC_DISPROXYLOCAL, FALSE);
        EnableDlgItem2(hDlg, IDE_DISPROXYADR, FALSE);
    }
    __except(TRUE)
    {
    }
}

/////////////////////////////////////////////////////////////////////
HRESULT InitProxyPrecPage(CDlgRSoPData *pDRD, HWND hwndList)
{
    HRESULT hr = NOERROR;
    __try
    {
        _bstr_t bstrClass = L"RSOP_IEConnectionSettings";
        hr = pDRD->GetArrayOfPSObjects(bstrClass);
        if (SUCCEEDED(hr))
        {
            CPSObjData **paCSObj = pDRD->GetCSObjArray();
            long nCSObjects = pDRD->GetCSObjCount();
            for (long nObj = 0; nObj < nCSObjects; nObj++)
            {
                _bstr_t bstrGPOName = pDRD->GetGPONameFromPSAssociation(paCSObj[nObj]->pObj,
                                                                        L"rsopPrecedence");

                // enableProxy field
                BOOL bEnable = FALSE;
                _variant_t vtValue;
                hr = paCSObj[nObj]->pObj->Get(L"enableProxy", 0, &vtValue, NULL, NULL);
                if (SUCCEEDED(hr) && !IsVariantNull(vtValue))
                    bEnable = (bool)vtValue ? TRUE : FALSE;

                _bstr_t bstrSetting;
                if (bEnable)
                    bstrSetting = GetEnabledString();
                else
                    bstrSetting = GetDisabledString();

                InsertPrecedenceListItem(hwndList, nObj, bstrGPOName, bstrSetting);
            }
        }
    }
    __except(TRUE)
    {
    }
    return hr;
}

/////////////////////////////////////////////////////////////////////
INT_PTR CALLBACK ConnectSetDlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
{
    // Retrieve Property Sheet Page info for each call into dlg proc.
    LPPROPSHEETCOOKIE psCookie = (LPPROPSHEETCOOKIE)GetWindowLongPtr(hDlg, DWLP_USER);

    TCHAR szWorkDir[MAX_PATH];
    BOOL  fImport;

    switch (msg) {
    case WM_INITDIALOG:
        SetPropSheetCookie(hDlg, lParam);

        // find out if this dlg is in RSoP mode
        psCookie = (LPPROPSHEETCOOKIE)GetWindowLongPtr(hDlg, DWLP_USER);
        if (psCookie->pCS->IsRSoP())
        {
            TCHAR szViewSettings[128];
            LoadString(g_hInstance, IDS_VIEW_SETTINGS, szViewSettings, countof(szViewSettings));
            SetDlgItemText(hDlg, IDC_MODIFYCONNECT, szViewSettings);

            CDlgRSoPData *pDRD = GetDlgRSoPData(hDlg, psCookie->pCS);
                        if (pDRD)
                           InitCSDlgInRSoPMode(hDlg, pDRD);
        }
        break;

    case WM_DESTROY:
        if (psCookie->pCS->IsRSoP())
            DestroyDlgRSoPData(hDlg);
        break;

    case WM_COMMAND:
        if (BN_CLICKED != GET_WM_COMMAND_CMD(wParam, lParam))
            return FALSE;

        switch (GET_WM_COMMAND_ID(wParam, lParam)) {
        case IDC_CSNOIMPORT:
            DisableDlgItem(hDlg, IDC_MODIFYCONNECT);
            break;

        case IDC_CSIMPORT:
            EnableDlgItem(hDlg, IDC_MODIFYCONNECT);
            break;

        case IDC_MODIFYCONNECT:
            if (psCookie->pCS->IsRSoP())
            {
                CDlgRSoPData *pDRD = GetDlgRSoPData(hDlg, psCookie->pCS);
                if (NULL != pDRD)
                {
                    CreateINetCplLookALikePage(hDlg, IDD_IMPORTEDCONNSETTINGS,
                                                importConnSettingsRSoPProc, (LPARAM)pDRD);
                }
            }
            else
                ShowInetcpl(hDlg, INET_PAGE_CONNECTION);
            break;

        default:
            return FALSE;
        }
        break;

    case WM_NOTIFY:
        switch (((LPNMHDR)lParam)->code) {
        case PSN_SETACTIVE:
            // don't do any of this stuff in RSoP mode
            if (!psCookie->pCS->IsRSoP())
            {
                fImport = InsGetBool(IS_CONNECTSET, IK_OPTION, FALSE, GetInsFile(hDlg));
                CheckRadioButton(hDlg, IDC_CSNOIMPORT, IDC_CSIMPORT, fImport ? IDC_CSIMPORT : IDC_CSNOIMPORT);
                EnableDlgItem2  (hDlg, IDC_MODIFYCONNECT, fImport);

                ReadBoolAndCheckButton(IS_CONNECTSET, IK_DELETECONN, FALSE, GetInsFile(hDlg), hDlg, IDC_DELCONNECT);
            }
            break;

        case PSN_HELP:
            ShowHelpTopic(hDlg);
            break;

        case PSN_APPLY:
            if (psCookie->pCS->IsRSoP())
                return FALSE;
            else
            {
                CNewCursor cur(IDC_WAIT);

                CreateWorkDir(GetInsFile(hDlg), IEAK_GPE_BRANDING_SUBDIR TEXT("\\cs"), szWorkDir);
                fImport = (BST_CHECKED == IsDlgButtonChecked(hDlg, IDC_CSIMPORT));

                if (!AcquireWriteCriticalSection(hDlg)) {
                    SetWindowLongPtr(hDlg, DWLP_MSGRESULT, PSNRET_INVALID_NOCHANGEPAGE);
                    break;
                }

                ImportConnectSet(GetInsFile(hDlg), szWorkDir, szWorkDir, fImport, IEM_GP);
                CheckButtonAndWriteBool(hDlg, IDC_DELCONNECT, IS_CONNECTSET, IK_DELETECONN, GetInsFile(hDlg));

                if (PathIsDirectoryEmpty(szWorkDir))
                    PathRemovePath(szWorkDir);

                SignalPolicyChanged(hDlg, FALSE, TRUE, &g_guidClientExt, &g_guidSnapinExt);
            }
            break;

        default:
            return FALSE;
        }
        break;

    case WM_HELP:
        ShowHelpTopic(hDlg);
        break;

    default:
        return FALSE;
    }

    return TRUE;
}

/////////////////////////////////////////////////////////////////////
INT_PTR CALLBACK AutoconfigDlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
{
    // Retrieve Property Sheet Page info for each call into dlg proc.
    LPPROPSHEETCOOKIE psCookie = (LPPROPSHEETCOOKIE)GetWindowLongPtr(hDlg, DWLP_USER);

    TCHAR szAutoConfigURL[INTERNET_MAX_URL_LENGTH],
          szAutoProxyURL[INTERNET_MAX_URL_LENGTH],
          szAutoConfigTime[7];
    BOOL  fDetectConfig,
          fUseAutoConfig;

    switch (msg) {
    case WM_INITDIALOG:
    {
        SetPropSheetCookie(hDlg, lParam);

        // find out if this dlg is in RSoP mode
        psCookie = (LPPROPSHEETCOOKIE)GetWindowLongPtr(hDlg, DWLP_USER);
        BOOL bIsRSoP = psCookie->pCS->IsRSoP();
        if (bIsRSoP)
        {
            CDlgRSoPData *pDRD = GetDlgRSoPData(hDlg, psCookie->pCS);
            if (pDRD)
                InitAutoConfigDlgInRSoPMode(hDlg, pDRD);
        }
        else
        {
            // warn the user that settings on this page will override imported connection settings
            if (InsGetBool(IS_CONNECTSET, IK_OPTION, FALSE, GetInsFile(hDlg)))
                ErrorMessageBox(hDlg, IDS_CONNECTSET_WARN);

            DisableDBCSChars(hDlg, IDE_AUTOCONFIGTIME);
        }

            EnableDBCSChars(hDlg, IDE_AUTOCONFIGURL);
            EnableDBCSChars(hDlg, IDE_AUTOPROXYURL);

        if (!bIsRSoP)
        {
            Edit_LimitText(GetDlgItem(hDlg, IDE_AUTOCONFIGTIME), countof(szAutoConfigTime) - 1);
            Edit_LimitText(GetDlgItem(hDlg, IDE_AUTOCONFIGURL),  countof(szAutoConfigURL)  - 1);
            Edit_LimitText(GetDlgItem(hDlg, IDE_AUTOPROXYURL),   countof(szAutoProxyURL)   - 1);
        }
        break;
    }

    case WM_DESTROY:
        if (psCookie->pCS->IsRSoP())
            DestroyDlgRSoPData(hDlg);
        break;

    case WM_COMMAND:
        if (BN_CLICKED != GET_WM_COMMAND_CMD(wParam, lParam))
            return FALSE;

        switch(GET_WM_COMMAND_ID(wParam, lParam)) {
        case IDC_YESAUTOCON:
            fUseAutoConfig = (BST_CHECKED == IsDlgButtonChecked(hDlg, IDC_YESAUTOCON));

            EnableDlgItem2(hDlg, IDE_AUTOCONFIGTIME,    fUseAutoConfig);
            EnableDlgItem2(hDlg, IDC_AUTOCONFIGTEXT2,   fUseAutoConfig);
            EnableDlgItem2(hDlg, IDC_AUTOCONFIGTEXT3,   fUseAutoConfig);
            EnableDlgItem2(hDlg, IDE_AUTOCONFIGURL,     fUseAutoConfig);
            EnableDlgItem2(hDlg, IDC_AUTOCONFIGURL_TXT, fUseAutoConfig);
            EnableDlgItem2(hDlg, IDE_AUTOPROXYURL,      fUseAutoConfig);
            EnableDlgItem2(hDlg, IDC_AUTOPROXYURL_TXT,  fUseAutoConfig);
            break;

        default:
            return FALSE;
        }
        break;

    case WM_NOTIFY:
        switch (((LPNMHDR)lParam)->code) {
        case PSN_SETACTIVE:
            // don't do any of this stuff in RSoP mode
            if (!psCookie->pCS->IsRSoP())
            {
                fDetectConfig = InsGetBool(IS_URL, IK_DETECTCONFIG, TRUE, GetInsFile(hDlg));
                CheckDlgButton(hDlg, IDC_AUTODETECT, fDetectConfig  ? BST_CHECKED : BST_UNCHECKED);

                fUseAutoConfig = InsGetBool(IS_URL, IK_USEAUTOCONF,  FALSE, GetInsFile(hDlg));
                CheckDlgButton(hDlg, IDC_YESAUTOCON, fUseAutoConfig ? BST_CHECKED : BST_UNCHECKED);

                InsGetString(IS_URL, IK_AUTOCONFTIME, szAutoConfigTime, countof(szAutoConfigTime), GetInsFile(hDlg));
                SetDlgItemText(hDlg, IDE_AUTOCONFIGTIME, szAutoConfigTime);
                EnableDlgItem2(hDlg, IDE_AUTOCONFIGTIME, fUseAutoConfig);
                EnableDlgItem2(hDlg, IDC_AUTOCONFIGTEXT2, fUseAutoConfig);
                EnableDlgItem2(hDlg, IDC_AUTOCONFIGTEXT3, fUseAutoConfig);

                InsGetString(IS_URL, IK_AUTOCONFURL, szAutoConfigURL, countof(szAutoConfigURL), GetInsFile(hDlg));
                SetDlgItemText(hDlg, IDE_AUTOCONFIGURL, szAutoConfigURL);
                EnableDlgItem2(hDlg, IDE_AUTOCONFIGURL, fUseAutoConfig);
                EnableDlgItem2(hDlg, IDC_AUTOCONFIGURL_TXT, fUseAutoConfig);

                InsGetString(IS_URL, IK_AUTOCONFURLJS, szAutoProxyURL, countof(szAutoProxyURL), GetInsFile(hDlg));
                SetDlgItemText(hDlg, IDE_AUTOPROXYURL, szAutoProxyURL);
                EnableDlgItem2(hDlg, IDE_AUTOPROXYURL, fUseAutoConfig);
                EnableDlgItem2(hDlg, IDC_AUTOPROXYURL_TXT, fUseAutoConfig);
            }
            break;

        case PSN_HELP:
            ShowHelpTopic(hDlg);
            break;

        case PSN_APPLY:
            if (psCookie->pCS->IsRSoP())
                return FALSE;
            else
            {
                fDetectConfig  = (BST_CHECKED == IsDlgButtonChecked(hDlg, IDC_AUTODETECT));
                fUseAutoConfig = (BST_CHECKED == IsDlgButtonChecked(hDlg, IDC_YESAUTOCON));

                GetDlgItemText(hDlg, IDE_AUTOCONFIGTIME, szAutoConfigTime, countof(szAutoConfigTime));
                GetDlgItemText(hDlg, IDE_AUTOCONFIGURL,  szAutoConfigURL,  countof(szAutoConfigURL));
                GetDlgItemText(hDlg, IDE_AUTOPROXYURL,   szAutoProxyURL,   countof(szAutoProxyURL));

                // do error checking
                if (fUseAutoConfig) {
                    if (IsWindowEnabled(GetDlgItem(hDlg, IDE_AUTOCONFIGTIME)) &&
                        !CheckField(hDlg, IDE_AUTOCONFIGTIME, FC_NUMBER)) {
                        SetWindowLongPtr(hDlg, DWLP_MSGRESULT, PSNRET_INVALID_NOCHANGEPAGE);
                        return TRUE;
                    }

                    if (*szAutoConfigURL == TEXT('\0') && *szAutoProxyURL == TEXT('\0')) {
                        ErrorMessageBox(hDlg, IDS_AUTOCONFIG_NULL);
                        SetFocus(GetDlgItem(hDlg, IDE_AUTOCONFIGURL));
                        SetWindowLongPtr(hDlg, DWLP_MSGRESULT, PSNRET_INVALID_NOCHANGEPAGE);
                        return TRUE;
                    }

                    if (!CheckField(hDlg, IDE_AUTOCONFIGURL, FC_URL) ||
                        !CheckField(hDlg, IDE_AUTOPROXYURL,  FC_URL)) {
                        SetWindowLongPtr(hDlg, DWLP_MSGRESULT, PSNRET_INVALID_NOCHANGEPAGE);
                        return TRUE;
                    }
                }

                // write the values to the ins file
                if (!AcquireWriteCriticalSection(hDlg)) {
                    SetWindowLongPtr(hDlg, DWLP_MSGRESULT, PSNRET_INVALID_NOCHANGEPAGE);
                    break;
                }

                InsWriteBoolEx(IS_URL, IK_DETECTCONFIG,  fDetectConfig,    GetInsFile(hDlg));
                InsWriteBoolEx(IS_URL, IK_USEAUTOCONF,   fUseAutoConfig,   GetInsFile(hDlg));
                InsWriteString(IS_URL, IK_AUTOCONFTIME,  szAutoConfigTime, GetInsFile(hDlg));
                InsWriteString(IS_URL, IK_AUTOCONFURL,   szAutoConfigURL,  GetInsFile(hDlg));
                InsWriteString(IS_URL, IK_AUTOCONFURLJS, szAutoProxyURL,   GetInsFile(hDlg));

                SignalPolicyChanged(hDlg, FALSE, TRUE, &g_guidClientExt, &g_guidSnapinExt);
            }
            break;

        default:
            return FALSE;
        }
        break;

    case WM_HELP:
        ShowHelpTopic(hDlg);
        break;

    default:
        return FALSE;
    }

    return TRUE;
}

/////////////////////////////////////////////////////////////////////
INT_PTR CALLBACK ProxyDlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
{
    // Retrieve Property Sheet Page info for each call into dlg proc.
    LPPROPSHEETCOOKIE psCookie = (LPPROPSHEETCOOKIE)GetWindowLongPtr(hDlg, DWLP_USER);

    TCHAR szProxy[MAX_PATH];
    PTSTR pszLocal;
    BOOL  fSameProxy,
          fUseProxy,
          fLocal;

    switch (msg) {
    case WM_INITDIALOG:
    {
        SetPropSheetCookie(hDlg, lParam);

        // find out if this dlg is in RSoP mode
        psCookie = (LPPROPSHEETCOOKIE)GetWindowLongPtr(hDlg, DWLP_USER);
        BOOL bIsRSoP = psCookie->pCS->IsRSoP();
        if (bIsRSoP)
        {
            CDlgRSoPData *pDRD = GetDlgRSoPData(hDlg, psCookie->pCS);
            if (pDRD)
                InitProxyDlgInRSoPMode(hDlg, pDRD);
        }
        else
        {
            // warn the user that settings on this page will override imported connection settings
            if (InsGetBool(IS_CONNECTSET, IK_OPTION, FALSE, GetInsFile(hDlg)))
                ErrorMessageBox(hDlg, IDS_CONNECTSET_WARN);
        }

        EnableDBCSChars(hDlg, IDE_HTTPPROXY);
        EnableDBCSChars(hDlg, IDE_SECPROXY);
        EnableDBCSChars(hDlg, IDE_FTPPROXY);
        EnableDBCSChars(hDlg, IDE_GOPHERPROXY);
        EnableDBCSChars(hDlg, IDE_SOCKSPROXY);
        EnableDBCSChars(hDlg, IDE_DISPROXYADR);

        if (!bIsRSoP)
        {
            Edit_LimitText(GetDlgItem(hDlg, IDE_HTTPPORT),   5);
            Edit_LimitText(GetDlgItem(hDlg, IDE_FTPPORT),    5);
            Edit_LimitText(GetDlgItem(hDlg, IDE_GOPHERPORT), 5);
            Edit_LimitText(GetDlgItem(hDlg, IDE_SECPORT),    5);
            Edit_LimitText(GetDlgItem(hDlg, IDE_SOCKSPORT),  5);
            Edit_LimitText(GetDlgItem(hDlg, IDE_DISPROXYADR),(MAX_PATH - 11)); //size of <local>, etc
        }
        break;
    }

    case WM_DESTROY:
        if (psCookie->pCS->IsRSoP())
            DestroyDlgRSoPData(hDlg);
        break;

    case WM_COMMAND:
        fSameProxy = fUseProxy = fLocal = FALSE;
        if (BN_CLICKED == GET_WM_COMMAND_CMD(wParam, lParam)) {
            fSameProxy = IsDlgButtonChecked(hDlg, IDC_SAMEFORALL);
            fUseProxy  = IsDlgButtonChecked(hDlg, IDC_YESPROXY);
            fLocal     = IsDlgButtonChecked(hDlg, IDC_DISPROXYLOCAL);
        }

        switch (GET_WM_COMMAND_ID(wParam, lParam)) {
        case IDC_SAMEFORALL:
            if (BN_CLICKED != GET_WM_COMMAND_CMD(wParam, lParam))
                return FALSE;

            GetProxyDlg(hDlg, szProxy, IDE_HTTPPROXY, IDE_HTTPPORT);
            if (fSameProxy) {
                SetProxyDlg(hDlg, szProxy, IDE_HTTPPROXY,   IDE_HTTPPORT,   TRUE);
                SetProxyDlg(hDlg, szProxy, IDE_FTPPROXY,    IDE_FTPPORT,    TRUE);
                SetProxyDlg(hDlg, szProxy, IDE_GOPHERPROXY, IDE_GOPHERPORT, TRUE);
                SetProxyDlg(hDlg, szProxy, IDE_SECPROXY,    IDE_SECPORT,    TRUE);
                SetProxyDlg(hDlg, szProxy, IDE_SOCKSPROXY,  IDE_SOCKSPORT,  FALSE);
            }
            // fallthrough

        case IDC_YESPROXY:
            if (BN_CLICKED != GET_WM_COMMAND_CMD(wParam, lParam))
                return FALSE;

            pxyEnableDlgItems(hDlg, fSameProxy, fUseProxy);
            break;

        case IDE_HTTPPROXY:
        case IDE_HTTPPORT:
            if (EN_UPDATE != GET_WM_COMMAND_CMD(wParam, lParam))
                return FALSE;

            if (fSameProxy) {
                GetProxyDlg(hDlg, szProxy, IDE_HTTPPROXY,   IDE_HTTPPORT);

                SetProxyDlg(hDlg, szProxy, IDE_FTPPROXY,    IDE_FTPPORT,    TRUE);
                SetProxyDlg(hDlg, szProxy, IDE_GOPHERPROXY, IDE_GOPHERPORT, TRUE);
                SetProxyDlg(hDlg, szProxy, IDE_SECPROXY,    IDE_SECPORT,    TRUE);
                SetProxyDlg(hDlg, szProxy, IDE_SOCKSPROXY,  IDE_SOCKSPORT,  FALSE);
            }
            break;

        default:
            return FALSE;
        }
        break;

    case WM_NOTIFY:
        switch (((LPNMHDR)lParam)->code) {
        case PSN_SETACTIVE:
            // don't do any of this stuff in RSoP mode
            if (!psCookie->pCS->IsRSoP())
            {
                fUseProxy = InsGetBool(IS_PROXY, IK_PROXYENABLE, FALSE, GetInsFile(hDlg));
                CheckDlgButton(hDlg, IDC_YESPROXY, fUseProxy);

                fSameProxy = InsGetBool(IS_PROXY, IK_SAMEPROXY, TRUE, GetInsFile(hDlg));
                CheckDlgButton(hDlg, IDC_SAMEFORALL, fSameProxy);

                InsGetString(IS_PROXY, IK_HTTPPROXY, szProxy, countof(szProxy), GetInsFile(hDlg));

                if (fSameProxy) {
                    SetProxyDlg(hDlg, szProxy, IDE_HTTPPROXY,   IDE_HTTPPORT,   TRUE);
                    SetProxyDlg(hDlg, szProxy, IDE_FTPPROXY,    IDE_FTPPORT,    TRUE);
                    SetProxyDlg(hDlg, szProxy, IDE_GOPHERPROXY, IDE_GOPHERPORT, TRUE);
                    SetProxyDlg(hDlg, szProxy, IDE_SECPROXY,    IDE_SECPORT,    TRUE);
                    SetProxyDlg(hDlg, szProxy, IDE_SOCKSPROXY,  IDE_SOCKSPORT,  FALSE);
                }
                else {
                    SetProxyDlg(hDlg, szProxy, IDE_HTTPPROXY, IDE_HTTPPORT, TRUE);

                    InsGetString(IS_PROXY, IK_FTPPROXY, szProxy, countof(szProxy), GetInsFile(hDlg));
                    SetProxyDlg(hDlg, szProxy, IDE_FTPPROXY, IDE_FTPPORT, TRUE);

                    InsGetString(IS_PROXY, IK_GOPHERPROXY, szProxy, countof(szProxy), GetInsFile(hDlg));
                    SetProxyDlg(hDlg, szProxy, IDE_GOPHERPROXY, IDE_GOPHERPORT, TRUE);

                    InsGetString(IS_PROXY, IK_SECPROXY, szProxy, countof(szProxy), GetInsFile(hDlg));
                    SetProxyDlg(hDlg, szProxy, IDE_SECPROXY, IDE_SECPORT, TRUE);

                    InsGetString(IS_PROXY, IK_SOCKSPROXY, szProxy, countof(szProxy), GetInsFile(hDlg));
                    if (TEXT('\0') != szProxy[0])
                        SetProxyDlg(hDlg, szProxy, IDE_SOCKSPROXY, IDE_SOCKSPORT, FALSE);
                }

                InsGetString(IS_PROXY, IK_PROXYOVERRIDE, szProxy, countof(szProxy), GetInsFile(hDlg));
                if (TEXT('\0') == szProxy[0])
                    StrCpy(szProxy, LOCALPROXY);

                pszLocal = StrStr(szProxy, LOCALPROXY);
                fLocal   = FALSE;
                if (NULL != pszLocal) {
                    if (pszLocal == szProxy) {
                        PTSTR pszSemicolon;

                        pszSemicolon = pszLocal + countof(LOCALPROXY)-1;
                        if (TEXT(';') == *pszSemicolon)
                            pszSemicolon++;

                        StrCpy(pszLocal, pszSemicolon);
                    }
                    else if (TEXT('\0') == *(pszLocal + countof(LOCALPROXY)-1))
                        *(pszLocal - 1) = TEXT('\0');

                    fLocal = TRUE;
                }
                CheckDlgButton(hDlg, IDC_DISPROXYLOCAL, fLocal);

                SetDlgItemText(hDlg, IDE_DISPROXYADR, szProxy);
                pxyEnableDlgItems(hDlg, fSameProxy, fUseProxy);
            }
            break;

        case PSN_HELP:
            ShowHelpTopic(hDlg);
            break;

        case PSN_APPLY:
            if (psCookie->pCS->IsRSoP())
                return FALSE;
            else
            {
                if (!CheckField(hDlg, IDE_HTTPPORT,   FC_NUMBER) ||
                    !CheckField(hDlg, IDE_FTPPORT,    FC_NUMBER) ||
                    !CheckField(hDlg, IDE_GOPHERPORT, FC_NUMBER) ||
                    !CheckField(hDlg, IDE_SECPORT,    FC_NUMBER) ||
                    !CheckField(hDlg, IDE_SOCKSPORT,  FC_NUMBER))
                    return TRUE;

                fUseProxy  = IsDlgButtonChecked(hDlg, IDC_YESPROXY);
                fSameProxy = IsDlgButtonChecked(hDlg, IDC_SAMEFORALL);
                fLocal     = IsDlgButtonChecked(hDlg, IDC_DISPROXYLOCAL);

                if (!AcquireWriteCriticalSection(hDlg)) {
                    SetWindowLongPtr(hDlg, DWLP_MSGRESULT, PSNRET_INVALID_NOCHANGEPAGE);
                    break;
                }

                InsWriteBoolEx(IS_PROXY, IK_PROXYENABLE, fUseProxy, GetInsFile(hDlg));

                GetProxyDlg(hDlg, szProxy, IDE_HTTPPROXY, IDE_HTTPPORT);
                InsWriteString(IS_PROXY, IK_HTTPPROXY, szProxy, GetInsFile(hDlg));

                GetProxyDlg(hDlg, szProxy, IDE_FTPPROXY, IDE_FTPPORT);
                InsWriteString(IS_PROXY, IK_FTPPROXY, szProxy, GetInsFile(hDlg));

                GetProxyDlg(hDlg, szProxy, IDE_GOPHERPROXY, IDE_GOPHERPORT);
                InsWriteString(IS_PROXY, IK_GOPHERPROXY, szProxy, GetInsFile(hDlg));

                GetProxyDlg(hDlg, szProxy, IDE_SECPROXY, IDE_SECPORT);
                InsWriteString(IS_PROXY, IK_SECPROXY, szProxy, GetInsFile(hDlg));

                GetProxyDlg(hDlg, szProxy, IDE_SOCKSPROXY, IDE_SOCKSPORT);
                InsWriteString(IS_PROXY, IK_SOCKSPROXY, szProxy, GetInsFile(hDlg));

                InsWriteBoolEx(IS_PROXY, IK_SAMEPROXY, fSameProxy, GetInsFile(hDlg));

                GetDlgItemText(hDlg, IDE_DISPROXYADR, szProxy, countof(szProxy));
                if (fLocal) {
                    if (TEXT('\0') != szProxy[0]) {
                        TCHAR szAux[MAX_PATH];

                        StrRemoveAllWhiteSpace(szProxy);
                        wnsprintf(szAux, countof(szAux), TEXT("%s;%s"), szProxy, LOCALPROXY);
                        InsWriteQuotedString(IS_PROXY, IK_PROXYOVERRIDE, szAux, GetInsFile(hDlg));
                    }
                    else 
                        InsWriteString(IS_PROXY, IK_PROXYOVERRIDE, LOCALPROXY, GetInsFile(hDlg));
                }
                else
                    InsWriteString(IS_PROXY, IK_PROXYOVERRIDE, szProxy, GetInsFile(hDlg));

                SignalPolicyChanged(hDlg, FALSE, TRUE, &g_guidClientExt, &g_guidSnapinExt);
            }
            break;

        default:
            return FALSE;
        }
        break;

    case WM_HELP:
        ShowHelpTopic(hDlg);
        break;

    default:
        return FALSE;
    }

    return TRUE;
}


/////////////////////////////////////////////////////////////////////////////
// Implementation helper routines

static void pxyEnableDlgItems(HWND hDlg, BOOL fSame, BOOL fUseProxy)
{
    EnableDlgItem2(hDlg, IDC_FTPPROXY1,     !fSame && fUseProxy);
    EnableDlgItem2(hDlg, IDE_FTPPROXY,      !fSame && fUseProxy);
    EnableDlgItem2(hDlg, IDE_FTPPORT,       !fSame && fUseProxy);
    EnableDlgItem2(hDlg, IDC_SECPROXY1,     !fSame && fUseProxy);
    EnableDlgItem2(hDlg, IDE_SECPROXY,      !fSame && fUseProxy);
    EnableDlgItem2(hDlg, IDE_SECPORT,       !fSame && fUseProxy);
    EnableDlgItem2(hDlg, IDC_GOPHERPROXY1,  !fSame && fUseProxy);
    EnableDlgItem2(hDlg, IDE_GOPHERPROXY,   !fSame && fUseProxy);
    EnableDlgItem2(hDlg, IDE_GOPHERPORT,    !fSame && fUseProxy);
    EnableDlgItem2(hDlg, IDC_SOCKSPROXY1,   !fSame && fUseProxy);
    EnableDlgItem2(hDlg, IDE_SOCKSPROXY,    !fSame && fUseProxy);
    EnableDlgItem2(hDlg, IDE_SOCKSPORT,     !fSame && fUseProxy);

    EnableDlgItem2(hDlg, IDC_HTTPPROXY1,    fUseProxy);
    EnableDlgItem2(hDlg, IDE_HTTPPROXY,     fUseProxy);
    EnableDlgItem2(hDlg, IDE_HTTPPORT,      fUseProxy);
    EnableDlgItem2(hDlg, IDC_DISPROXYADR1,  fUseProxy);
    EnableDlgItem2(hDlg, IDE_DISPROXYADR,   fUseProxy);
    EnableDlgItem2(hDlg, IDC_DISPROXYLOCAL, fUseProxy);
    EnableDlgItem2(hDlg, IDC_SAMEFORALL,    fUseProxy);
}

//*******************************************************************
// CODE FROM INETCPL
//*******************************************************************

/////////////////////////////////////////////////////////////////////
void InitImportedConnSettingsDlgInRSoPMode(HWND hDlg, CDlgRSoPData *pDRD)
{
    __try
    {
        if (NULL != pDRD->ConnectToNamespace())
        {
            // get our stored precedence value
            DWORD dwCurGPOPrec = pDRD->GetImportedConnSettPrec();

            // create the object path of the program settings for this GPO
            WCHAR wszObjPath[128];
            wnsprintf(wszObjPath, countof(wszObjPath),
                        L"RSOP_IEConnectionSettings.rsopID=\"IEAK\",rsopPrecedence=%ld", dwCurGPOPrec);
            _bstr_t bstrObjPath = wszObjPath;

            // get the RSOP_IEProgramSettings object and its properties
            ComPtr<IWbemServices> pWbemServices = pDRD->GetWbemServices();
            ComPtr<IWbemClassObject> pPSObj = NULL;
            HRESULT hr = pWbemServices->GetObject(bstrObjPath, 0L, NULL, (IWbemClassObject**)&pPSObj, NULL);
            if (SUCCEEDED(hr))
            {
                // defaultDialUpConnection field
                _variant_t vtValue;
                _bstr_t bstrDefault;
                hr = pPSObj->Get(L"defaultDialUpConnection", 0, &vtValue, NULL, NULL);
                if (SUCCEEDED(hr) && !IsVariantNull(vtValue))
                {
                    bstrDefault = vtValue;
                    if (bstrDefault.length() > 0)
                        SetDlgItemText(hDlg, IDC_DIAL_DEF_ISP, (LPCTSTR)bstrDefault);
                }

                // dialUpState field
                hr = pPSObj->Get(L"dialUpState", 0, &vtValue, NULL, NULL);
                if (SUCCEEDED(hr) && !IsVariantNull(vtValue))
                {
                    if (1 == (long)vtValue)
                        CheckRadioButton(hDlg, IDC_DIALUP_NEVER, IDC_DIALUP, IDC_DIALUP_ON_NONET);
                    else if (2 == (long)vtValue)
                        CheckRadioButton(hDlg, IDC_DIALUP_NEVER, IDC_DIALUP, IDC_DIALUP);
                    else
                        CheckRadioButton(hDlg, IDC_DIALUP_NEVER, IDC_DIALUP, IDC_DIALUP_NEVER);
                }

                // dialUpConnections field
                hr = pPSObj->Get(L"dialUpConnections", 0, &vtValue, NULL, NULL);
                if (SUCCEEDED(hr) && !IsVariantNull(vtValue))
                {
                    HWND hwndTree = GetDlgItem(hDlg, IDC_CONN_LIST);
                    ASSERT(hwndTree);

                    // init tvi and tvins
                    TVITEM tvi;
                    TVINSERTSTRUCT tvins;
                    tvi.mask = TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_PARAM;
                    tvi.lParam = 0;

                    tvins.hInsertAfter = (HTREEITEM)TVI_SORT;
                    tvins.hParent = TVI_ROOT;

                    // clear list
                    TreeView_DeleteAllItems(hwndTree);

                    SAFEARRAY *psa = vtValue.parray;
                    //-------------------------------
                    // Get the upper and lower bounds of the Names array
                    long lLower = 0;
                    long lUpper = 0;
                    hr = SafeArrayGetLBound(psa, 1, &lLower);
                    if (SUCCEEDED(hr))
                        hr = SafeArrayGetUBound(psa, 1, &lUpper);

                    // check the case of no instances or a null array
                    if (SUCCEEDED(hr) && lUpper >= lLower)
                    {
                        _bstr_t bstrName;
                        HTREEITEM hFirst = NULL, hDefault = NULL;
                        for (long lItem = lLower; lItem <= lUpper; lItem++) 
                        {
                            BSTR bstrValue = NULL;
                            hr = SafeArrayGetElement(psa, &lItem, (void*)&bstrValue);
                            if (SUCCEEDED(hr))
                            {
                                bstrName = bstrValue;

                                tvi.pszText = (LPTSTR)(LPCTSTR)bstrName;
                                tvi.iImage = IMAGE_MODEM;
                                tvi.iSelectedImage = IMAGE_MODEM;
                                tvi.lParam = lItem;

                                tvins.item = tvi;
                                HTREEITEM hItem = TreeView_InsertItem(hwndTree, &tvins);
                                if (0 == lItem)
                                    hFirst = hItem;
                                if (NULL != hItem && bstrName == bstrDefault)
                                    hDefault = hItem;
                            }
                        }

                        // select default or first entry if there is one
                        if(NULL != hDefault)
                            TreeView_Select(hwndTree, hDefault, TVGN_CARET);
                        else if (NULL != hFirst)
                            TreeView_Select(hwndTree, hFirst, TVGN_CARET);
                    }
                }
            }
        }
    }
    __except(TRUE)
    {
    }
}

/////////////////////////////////////////////////////////////////////
INT_PTR CALLBACK importConnSettingsRSoPProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    BOOL fResult = FALSE;
    switch (uMsg) {
    case WM_INITDIALOG:
    {
        // create image list for tree view
        HIMAGELIST himl = ImageList_Create(BITMAP_WIDTH, BITMAP_HEIGHT, ILC_COLOR | ILC_MASK, CONN_BITMAPS, 4 );
        HICON hIcon = LoadIcon(g_hInstance, MAKEINTRESOURCE(IDI_LAN));
        ImageList_AddIcon(himl, hIcon);
        hIcon = LoadIcon(g_hInstance, MAKEINTRESOURCE(IDI_PHONE));
        ImageList_AddIcon(himl, hIcon);

        TreeView_SetImageList(GetDlgItem(hDlg, IDC_CONN_LIST), himl, TVSIL_NORMAL);

        // init the data
        CDlgRSoPData *pDRD = (CDlgRSoPData*)((LPPROPSHEETPAGE)lParam)->lParam;
        InitImportedConnSettingsDlgInRSoPMode(hDlg, pDRD);

        // init other controls
        CheckRadioButton(hDlg, IDC_DIALUP_NEVER, IDC_DIALUP, IDC_DIALUP_NEVER);
        ShowWindow(GetDlgItem(hDlg, IDC_ENABLE_SECURITY), SW_HIDE); // only for 95 machines

        // disable everything
        EnableDlgItem2(hDlg, IDC_CONNECTION_WIZARD, FALSE);

        EnableDlgItem2(hDlg, IDC_DIALUP_ADD, FALSE);
        EnableDlgItem2(hDlg, IDC_DIALUP_REMOVE, FALSE);
        EnableDlgItem2(hDlg, IDC_MODEM_SETTINGS, FALSE);

        EnableDlgItem2(hDlg, IDC_DIALUP_NEVER, FALSE);
        EnableDlgItem2(hDlg, IDC_DIALUP_ON_NONET, FALSE);
        EnableDlgItem2(hDlg, IDC_DIALUP, FALSE);

        EnableDlgItem2(hDlg, IDC_SET_DEFAULT, FALSE);
        EnableDlgItem2(hDlg, IDC_ENABLE_SECURITY, FALSE);
        EnableDlgItem2(hDlg, IDC_CON_SHARING, FALSE);
        EnableDlgItem2(hDlg, IDC_LAN_SETTINGS, FALSE);

        fResult = TRUE;
        break;
    }

    case WM_COMMAND:
        switch (LOWORD(wParam)) {
        case IDOK:
            EndDialog(hDlg, IDOK);
            fResult = TRUE;
            break;

        case IDCANCEL:
            EndDialog(hDlg, IDCANCEL);
            fResult = TRUE;
            break;
        }
        break;
    }

    return fResult;
}