mirror of https://github.com/tongzx/nt5src
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
670 lines
20 KiB
670 lines
20 KiB
#include "pch.h"
|
|
#pragma hdrstop
|
|
#include "ncui.h"
|
|
#include "ncmisc.h"
|
|
#include "netcfgn.h"
|
|
#include "netshell.h"
|
|
#include "resource.h"
|
|
#include "nsres.h" // For Icon's
|
|
#include "wizard.h"
|
|
#include "..\folder\foldres.h"
|
|
#include "wgenericpage.h"
|
|
|
|
// Setup Wizard Global - Only used during setup.
|
|
CWizard * g_pSetupWizard = NULL;
|
|
|
|
//
|
|
// Function: HrRequestWizardPages
|
|
//
|
|
// Purpose: To supply a max count of wizard pages or to supply and actual
|
|
// count and the actual pages
|
|
//
|
|
// Parameters:
|
|
//
|
|
// Returns: HRESULT, S_OK if the function succeeded
|
|
// S_FALSE if no pages were returned
|
|
// otherwise a failure HRESULT
|
|
//
|
|
HRESULT HrRequestWizardPages(CWizard **ppWizard,
|
|
BOOL fLanPages,
|
|
ProviderList * rgpProviders,
|
|
ULONG cProviders,
|
|
HPROPSHEETPAGE* pahpsp,
|
|
UINT* pcPages,
|
|
PINTERNAL_SETUP_DATA pData,
|
|
BOOL fDeferProviderLoad)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
Assert(NULL != pData);
|
|
|
|
if ((NULL == pData) ||
|
|
(sizeof(INTERNAL_SETUP_DATA) < pData->dwSizeOf))
|
|
{
|
|
hr = E_INVALIDARG;
|
|
}
|
|
else if (pcPages && pData)
|
|
{
|
|
UINT cProviderPages = 0;
|
|
BOOL fCountOnly = (NULL == pahpsp);
|
|
CWizard * pWizard = *ppWizard;
|
|
|
|
// Create the Wizard object if not already created
|
|
if (NULL == pWizard)
|
|
{
|
|
// Create the wizard interface
|
|
HRESULT hr = CWizard::HrCreate(&pWizard, fLanPages, pData, fDeferProviderLoad);
|
|
if (FAILED(hr))
|
|
{
|
|
TraceHr(ttidWizard, FAL, hr, FALSE, "HrRequestWizardPages");
|
|
return hr;
|
|
}
|
|
|
|
Assert(NULL != pWizard);
|
|
*ppWizard = pWizard;
|
|
|
|
// If there is an unattended file, read the options (READONLY, etc)
|
|
//
|
|
ReadAnswerFileSetupOptions(pWizard);
|
|
}
|
|
|
|
// Count/Create all necessary pages
|
|
*pcPages = 0;
|
|
|
|
Assert(NULL != pWizard);
|
|
Assert(NULL != pData);
|
|
Assert(NULL != pcPages);
|
|
|
|
// Load the wizard page providers used in setup
|
|
pWizard->LoadWizProviders(cProviders, rgpProviders);
|
|
|
|
if (!pWizard->FDeferredProviderLoad())
|
|
{
|
|
// Count/Create Provider Pages first
|
|
hr = pWizard->HrCreateWizProviderPages(fCountOnly, &cProviderPages);
|
|
if (FAILED(hr))
|
|
{
|
|
goto Error;
|
|
}
|
|
|
|
(*pcPages) += cProviderPages;
|
|
}
|
|
|
|
// Count/Create all other pages
|
|
hr = HrCreateUpgradePage(pWizard, pData, fCountOnly, pcPages);
|
|
if (FAILED(hr))
|
|
{
|
|
goto Error;
|
|
}
|
|
|
|
hr = HrCreateMainIntroPage(pWizard, pData, fCountOnly, pcPages);
|
|
if (FAILED(hr))
|
|
{
|
|
goto Error;
|
|
}
|
|
|
|
hr = HrCreateMainPage(pWizard, pData, fCountOnly, pcPages);
|
|
if (FAILED(hr))
|
|
{
|
|
goto Error;
|
|
}
|
|
|
|
hr = HrCreateISPPage(pWizard, pData, fCountOnly, pcPages);
|
|
if (FAILED(hr))
|
|
{
|
|
goto Error;
|
|
}
|
|
|
|
hr = HrCreateInternetPage(pWizard, pData, fCountOnly, pcPages);
|
|
if (FAILED(hr))
|
|
{
|
|
goto Error;
|
|
}
|
|
|
|
hr = CGenericFinishPage::HrCreateCGenericFinishPagePage(IDD_FinishOtherWays, pWizard, pData, fCountOnly, pcPages);
|
|
if (FAILED(hr))
|
|
{
|
|
goto Error;
|
|
}
|
|
|
|
hr = CGenericFinishPage::HrCreateCGenericFinishPagePage(IDD_ISPSoftwareCD, pWizard, pData, fCountOnly, pcPages);
|
|
if (FAILED(hr))
|
|
{
|
|
goto Error;
|
|
}
|
|
|
|
hr = CGenericFinishPage::HrCreateCGenericFinishPagePage(IDD_Broadband_Always_On, pWizard, pData, fCountOnly, pcPages);
|
|
if (FAILED(hr))
|
|
{
|
|
goto Error;
|
|
}
|
|
|
|
hr = CGenericFinishPage::HrCreateCGenericFinishPagePage(IDD_FinishNetworkSetupWizard, pWizard, pData, fCountOnly, pcPages);
|
|
if (FAILED(hr))
|
|
{
|
|
goto Error;
|
|
}
|
|
|
|
hr = HrCreateConnectPage(pWizard, pData, fCountOnly, pcPages);
|
|
if (FAILED(hr))
|
|
{
|
|
goto Error;
|
|
}
|
|
|
|
hr = HrCreateAdvancedPage(pWizard, pData, fCountOnly, pcPages);
|
|
if (FAILED(hr))
|
|
{
|
|
goto Error;
|
|
}
|
|
|
|
hr = HrCreateFinishPage(pWizard, pData, fCountOnly, pcPages);
|
|
if (FAILED(hr))
|
|
{
|
|
goto Error;
|
|
}
|
|
|
|
hr = HrCreateJoinPage(pWizard, pData, fCountOnly, pcPages);
|
|
if (FAILED(hr))
|
|
{
|
|
goto Error;
|
|
}
|
|
|
|
if (*pcPages)
|
|
{
|
|
hr = HrCreateExitPage(pWizard, pData, fCountOnly, pcPages);
|
|
if (FAILED(hr))
|
|
{
|
|
goto Error;
|
|
}
|
|
}
|
|
|
|
hr = HrCreateNetDevPage(pWizard, pData, fCountOnly, pcPages);
|
|
if (FAILED(hr))
|
|
{
|
|
goto Error;
|
|
}
|
|
|
|
// Assemble all created pages into the output array
|
|
if (!fCountOnly)
|
|
{
|
|
UINT cExpected = *pcPages;
|
|
*pcPages = 0;
|
|
|
|
Assert(NULL != pahpsp);
|
|
|
|
AppendUpgradePage(pWizard, pahpsp, pcPages);
|
|
AppendMainIntroPage(pWizard, pahpsp, pcPages);
|
|
AppendMainPage(pWizard, pahpsp, pcPages);
|
|
AppendISPPage(pWizard, pahpsp, pcPages);
|
|
AppendInternetPage(pWizard, pahpsp, pcPages);
|
|
CGenericFinishPage::AppendCGenericFinishPagePage(IDD_FinishOtherWays, pWizard, pahpsp, pcPages);
|
|
CGenericFinishPage::AppendCGenericFinishPagePage(IDD_ISPSoftwareCD, pWizard, pahpsp, pcPages);
|
|
CGenericFinishPage::AppendCGenericFinishPagePage(IDD_Broadband_Always_On, pWizard, pahpsp, pcPages);
|
|
CGenericFinishPage::AppendCGenericFinishPagePage(IDD_FinishNetworkSetupWizard, pWizard, pahpsp, pcPages);
|
|
|
|
AppendConnectPage(pWizard, pahpsp, pcPages);
|
|
AppendAdvancedPage(pWizard, pahpsp, pcPages);
|
|
pWizard->AppendProviderPages(pahpsp, pcPages);
|
|
AppendFinishPage(pWizard, pahpsp, pcPages);
|
|
AppendJoinPage(pWizard, pahpsp, pcPages);
|
|
if (*pcPages)
|
|
{
|
|
AppendExitPage(pWizard, pahpsp, pcPages);
|
|
}
|
|
AppendNetDevPage(pWizard, pahpsp, pcPages);
|
|
Assert(cExpected == *pcPages);
|
|
}
|
|
|
|
if (0 == *pcPages)
|
|
{
|
|
Assert(SUCCEEDED(hr));
|
|
hr = S_FALSE;
|
|
}
|
|
}
|
|
|
|
Error:
|
|
TraceHr(ttidWizard, FAL, hr,(S_FALSE == hr), "CWizProvider::HrCreate");
|
|
return hr;
|
|
}
|
|
|
|
//
|
|
// Function: FSetupRequestWizardPages
|
|
//
|
|
// Purpose: To supply a max count of wizard pages or to supply and actual
|
|
// count and the actual pages
|
|
//
|
|
// Parameters:
|
|
//
|
|
// Returns: BOOL, TRUE if the function succeeded, false on failure
|
|
//
|
|
BOOL FSetupRequestWizardPages(HPROPSHEETPAGE* pahpsp,
|
|
UINT* pcPages,
|
|
PINTERNAL_SETUP_DATA psp)
|
|
{
|
|
HRESULT hr;
|
|
BOOL fCoUninitialze = TRUE;
|
|
ProviderList rgProviderLan[] = {{&CLSID_LanConnectionUi, 0}};
|
|
|
|
Assert(NULL == g_pSetupWizard);
|
|
|
|
#ifdef DBG
|
|
if (FIsDebugFlagSet (dfidBreakOnWizard))
|
|
{
|
|
ShellExecute(NULL, L"open", L"cmd.exe", NULL, NULL, SW_SHOW);
|
|
AssertSz(FALSE, "THIS IS NOT A BUG! The debug flag "
|
|
"\"BreakOnWizard\" has been set. Set your breakpoints now.");
|
|
}
|
|
#endif // DBG
|
|
|
|
// CoInitialize because setup doesn't do it for us
|
|
hr = CoInitializeEx(NULL, COINIT_DISABLE_OLE1DDE | COINIT_APARTMENTTHREADED);
|
|
if (RPC_E_CHANGED_MODE == hr)
|
|
{
|
|
// Ignore any change mode error
|
|
hr = S_OK;
|
|
fCoUninitialze = FALSE;
|
|
}
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
hr = HrRequestWizardPages(&g_pSetupWizard, TRUE, rgProviderLan,
|
|
celems(rgProviderLan), pahpsp, pcPages,
|
|
psp, FALSE);
|
|
if (S_OK == hr)
|
|
{
|
|
Assert(NULL != g_pSetupWizard);
|
|
g_pSetupWizard->SetCoUninit(fCoUninitialze);
|
|
return TRUE;
|
|
}
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Function: HrSetWizardTaskbarIcon
|
|
//
|
|
// Purpose: Setup the wizard's taskbar icon.
|
|
//
|
|
// Arguments:
|
|
// hwndDlg [in] Dialog handle
|
|
// uMsg [in] Message value
|
|
// lparam [in] Long parameter
|
|
//
|
|
// Returns: 0
|
|
//
|
|
// Notes: A standard Win32 commctrl PropSheetProc always return 0.
|
|
// See MSDN documentation.
|
|
//
|
|
int CALLBACK HrSetWizardTaskbarIcon(
|
|
IN HWND hwndDlg,
|
|
IN UINT uMsg,
|
|
IN LPARAM lparam)
|
|
|
|
{
|
|
|
|
HICON hIcon;
|
|
|
|
|
|
switch (uMsg)
|
|
{
|
|
case PSCB_INITIALIZED:
|
|
|
|
// Set the dialog window's icon
|
|
hIcon = LoadIcon(_Module.GetResourceInstance(),
|
|
MAKEINTRESOURCE(IDI_CONFOLD_WIZARD));
|
|
|
|
Assert(hIcon);
|
|
|
|
if (hIcon)
|
|
{
|
|
SendMessage(hwndDlg,
|
|
WM_SETICON,
|
|
ICON_BIG,
|
|
(LPARAM)(HICON)hIcon);
|
|
}
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
//
|
|
// Function: FSetupFreeWizardPages
|
|
//
|
|
// Purpose: To clean up after the wizard has been used by setup
|
|
//
|
|
// Parameters:
|
|
//
|
|
// Returns: BOOL, TRUE if the function succeeded, false on failure
|
|
//
|
|
BOOL FSetupFreeWizardPages()
|
|
{
|
|
delete g_pSetupWizard;
|
|
g_pSetupWizard = NULL;
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
EXTERN_C
|
|
HRESULT
|
|
WINAPI
|
|
HrRunWizard(HWND hwnd, BOOL fPnpAddAdapter, INetConnection ** ppConn, DWORD dwFirstPage)
|
|
{
|
|
DWORD adwTestedPages[] = {0, CHK_MAIN_VPN, IDD_Connect};
|
|
|
|
CWizard * pWizard = NULL;
|
|
PROPSHEETHEADER psh;
|
|
HRESULT hr = S_OK;
|
|
HPROPSHEETPAGE * phPages = NULL;
|
|
INT nRet = 0;
|
|
UINT cPages = 0;
|
|
PRODUCT_FLAVOR pf;
|
|
ProviderList * rgpProviders;
|
|
ULONG culProviders;
|
|
INTERNAL_SETUP_DATA sp = {0};
|
|
|
|
BOOL fIsRequestedPageTested = FALSE;
|
|
|
|
for (DWORD dwCount = 0; dwCount < celems(adwTestedPages); dwCount++)
|
|
{
|
|
if (adwTestedPages[dwCount] == dwFirstPage)
|
|
{
|
|
fIsRequestedPageTested = TRUE;
|
|
}
|
|
}
|
|
|
|
if (!fIsRequestedPageTested)
|
|
{
|
|
#ifdef DBG
|
|
AssertSz(NULL, "The requested start page passed to HrRunWizard/StartNCW has not been certified to work through the API. "
|
|
"If this page indeed works correctly according to your specifications, please update the Requested pages list "
|
|
"inside this file. In FRE builds this API will open page 0 instead of asserting.")
|
|
#else
|
|
dwFirstPage = 0;
|
|
#endif
|
|
}
|
|
|
|
|
|
if (NULL != ppConn)
|
|
{
|
|
*ppConn = NULL;
|
|
}
|
|
|
|
// ISSUE - the order of these is critical.
|
|
// Backup becomes a problem if the last item is not a provider from the
|
|
// advanced dialog. The problem is that whatever provider is the last
|
|
// in the list it automatically backs up to the advanced page.
|
|
// This should be investigated further after Whistler.
|
|
//
|
|
// Bug 233403: Add an entry for internet connection through dialup. ICW is no longer called.
|
|
|
|
ProviderList rgProviderRas[] = {{&CLSID_PPPoEUi, CHK_MAIN_PPPOE},
|
|
{&CLSID_VpnConnectionUi, CHK_MAIN_VPN},
|
|
{&CLSID_InternetConnectionUi, CHK_MAIN_INTERNET},
|
|
{&CLSID_DialupConnectionUi, CHK_MAIN_DIALUP},
|
|
{&CLSID_InboundConnectionUi, CHK_MAIN_INBOUND},
|
|
{&CLSID_DirectConnectionUi, CHK_MAIN_DIRECT}};
|
|
|
|
// Begin the wait cursor
|
|
{
|
|
BOOL fJumpToProviderPage = FALSE;
|
|
CWaitCursor wc;
|
|
|
|
if ((dwFirstPage >= CHK_MAIN_DIALUP) &&
|
|
(dwFirstPage <= CHK_MAIN_ADVANCED))
|
|
{
|
|
fJumpToProviderPage = TRUE;
|
|
}
|
|
|
|
INITCOMMONCONTROLSEX iccex = {0};
|
|
iccex.dwSize = sizeof(INITCOMMONCONTROLSEX);
|
|
iccex.dwICC = ICC_LISTVIEW_CLASSES |
|
|
ICC_ANIMATE_CLASS |
|
|
ICC_USEREX_CLASSES;
|
|
SideAssert(InitCommonControlsEx(&iccex));
|
|
|
|
sp.OperationFlags = SETUPOPER_POSTSYSINSTALL;
|
|
sp.dwSizeOf = sizeof(INTERNAL_SETUP_DATA);
|
|
sp.SetupMode = SETUPMODE_TYPICAL;
|
|
sp.WizardTitle = SzLoadIds(IDS_WIZARD_CAPTION);
|
|
sp.SourcePath = NULL;
|
|
sp.UnattendFile = NULL;
|
|
sp.LegacySourcePath = NULL;
|
|
|
|
GetProductFlavor (NULL, &pf);
|
|
sp.ProductType = (PF_WORKSTATION == pf) ? PRODUCT_WORKSTATION
|
|
: PRODUCT_SERVER_STANDALONE;
|
|
|
|
Assert(!fPnpAddAdapter);
|
|
|
|
culProviders = celems(rgProviderRas);
|
|
rgpProviders = rgProviderRas;
|
|
|
|
hr = HrRequestWizardPages(&pWizard, fPnpAddAdapter, rgpProviders,
|
|
culProviders, NULL, &cPages, &sp, !fJumpToProviderPage);
|
|
if ((S_OK != hr) || (0 == cPages) || (NULL == pWizard))
|
|
{
|
|
goto Done;
|
|
}
|
|
|
|
Assert(pWizard);
|
|
|
|
if (dwFirstPage)
|
|
{
|
|
pWizard->SetFirstPage(dwFirstPage);
|
|
}
|
|
|
|
// Allocate the requested pages
|
|
phPages = reinterpret_cast<HPROPSHEETPAGE *>
|
|
(MemAlloc(sizeof(HPROPSHEETPAGE) * cPages));
|
|
if (NULL == phPages)
|
|
{
|
|
hr = E_OUTOFMEMORY;
|
|
TraceHr(ttidWizard, FAL, E_OUTOFMEMORY, FALSE, "HrRunWizard");
|
|
goto Done;
|
|
}
|
|
|
|
hr = HrRequestWizardPages(&pWizard, fPnpAddAdapter, rgpProviders,
|
|
culProviders, phPages, &cPages, &sp, !fJumpToProviderPage);
|
|
if ((S_OK != hr) || (0 == cPages))
|
|
{
|
|
goto Done;
|
|
}
|
|
|
|
ZeroMemory(&psh, sizeof(psh));
|
|
psh.dwSize = sizeof(PROPSHEETHEADER);
|
|
psh.dwFlags = PSH_WIZARD | PSH_WIZARD97 | PSH_NOAPPLYNOW | PSH_WATERMARK
|
|
| PSH_HEADER | PSH_STRETCHWATERMARK | PSH_USECALLBACK | PSH_USEICONID;
|
|
psh.hwndParent = hwnd;
|
|
psh.hInstance = _Module.GetResourceInstance();
|
|
psh.nPages = cPages;
|
|
psh.phpage = phPages;
|
|
psh.pszbmWatermark = MAKEINTRESOURCE(IDB_WIZINTRO);
|
|
psh.pszbmHeader = MAKEINTRESOURCE(IDB_WIZHDR);
|
|
psh.pszIcon = MAKEINTRESOURCE(IDI_CONFOLD_WIZARD);
|
|
psh.pfnCallback = HrSetWizardTaskbarIcon;
|
|
|
|
if (pWizard->GetFirstPage())
|
|
{
|
|
if ( fJumpToProviderPage )
|
|
{
|
|
for (ULONG ulIdx = 0; ulIdx < pWizard->UlProviderCount(); ulIdx++)
|
|
{
|
|
CWizProvider * pWizProvider = pWizard->PWizProviders(ulIdx);
|
|
Assert(NULL != pWizProvider);
|
|
|
|
if (pWizard->GetFirstPage() == pWizProvider->GetBtnIdc())
|
|
{
|
|
pWizard->SetCurrentProvider(ulIdx);
|
|
Assert(pWizProvider->ULPageCount());
|
|
|
|
HPROPSHEETPAGE hPage = (pWizProvider->PHPropPages())[0];
|
|
Assert(NULL != hPage);
|
|
|
|
for (DWORD x = 0; x < cPages; x++)
|
|
{
|
|
if (phPages[x] == hPage)
|
|
{
|
|
psh.nStartPage = x;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Assert(psh.nStartPage);
|
|
}
|
|
else
|
|
{
|
|
psh.nStartPage = pWizard->GetPageIndexFromIID(dwFirstPage);
|
|
}
|
|
}
|
|
|
|
} // end the wait cursor
|
|
|
|
// raise frame
|
|
hr = S_FALSE;
|
|
if (-1 != PropertySheet(&psh))
|
|
{
|
|
// Return the request connection
|
|
if (ppConn && pWizard->GetCachedConnection())
|
|
{
|
|
*ppConn = pWizard->GetCachedConnection();
|
|
AddRefObj(*ppConn);
|
|
hr = S_OK;
|
|
}
|
|
}
|
|
|
|
MemFree(phPages);
|
|
|
|
Done:
|
|
delete pWizard;
|
|
TraceHr(ttidWizard, FAL, hr, (S_FALSE == hr), "CWizProvider::HrCreate");
|
|
return hr;
|
|
}
|
|
|
|
VOID SetICWComplete()
|
|
{
|
|
static const TCHAR REG_KEY_ICW_SETTINGS[] = TEXT("Software\\Microsoft\\Internet Connection Wizard");
|
|
static const TCHAR REG_VAL_ICWCOMPLETE[] = TEXT("Completed");
|
|
|
|
HKEY hkey = NULL;
|
|
DWORD dwValue = 1;
|
|
DWORD dwDisposition = 0;
|
|
if(ERROR_SUCCESS == RegCreateKeyEx(HKEY_CURRENT_USER,
|
|
REG_KEY_ICW_SETTINGS,
|
|
0,
|
|
NULL,
|
|
REG_OPTION_NON_VOLATILE,
|
|
KEY_ALL_ACCESS,
|
|
NULL,
|
|
&hkey,
|
|
&dwDisposition))
|
|
|
|
{
|
|
RegSetValueEx(hkey,
|
|
REG_VAL_ICWCOMPLETE,
|
|
0,
|
|
REG_BINARY,
|
|
(LPBYTE) &dwValue,
|
|
sizeof(DWORD));
|
|
|
|
RegCloseKey(hkey);
|
|
}
|
|
}
|
|
|
|
#include "foldinc.h"
|
|
#include "..\folder\cmdtable.h"
|
|
EXTERN_C INT WINAPI StartNCW( HWND hwndOwner, HINSTANCE hInstance, LPTSTR pszParms, INT nShow )
|
|
{
|
|
HRESULT hr = S_OK;
|
|
vector<LPSTR> vecszCmdLine; // This is ANSI since our Command Line is ANSI.
|
|
const CHAR szSeps[] = ",";
|
|
LPSTR szToken = strtok( reinterpret_cast<LPSTR>(pszParms), szSeps);
|
|
while( szToken != NULL )
|
|
{
|
|
vecszCmdLine.push_back(szToken);
|
|
szToken = strtok( NULL, szSeps);
|
|
}
|
|
|
|
DWORD dwFirstPage = 0;
|
|
LPSTR szShellNext = NULL;
|
|
LPSTR szShellNextArg = NULL;
|
|
if (vecszCmdLine.size() >= 1)
|
|
{
|
|
dwFirstPage = atoi(vecszCmdLine[0]);
|
|
|
|
if (vecszCmdLine.size() >= 2)
|
|
{
|
|
szShellNext = vecszCmdLine[1];
|
|
Assert(strlen(szShellNext) <= MAX_PATH); // Shell requirement
|
|
|
|
if (vecszCmdLine.size() >= 3)
|
|
{
|
|
szShellNextArg = vecszCmdLine[2];
|
|
Assert(strlen(szShellNextArg) <= MAX_PATH);
|
|
}
|
|
}
|
|
}
|
|
|
|
hr = CoInitializeEx(NULL, COINIT_MULTITHREADED);
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
{
|
|
// Check permissions
|
|
PCONFOLDPIDLVEC pcfpvEmpty;
|
|
NCCS_STATE nccs = NCCS_ENABLED;
|
|
DWORD dwResourceId;
|
|
|
|
HrGetCommandState(pcfpvEmpty, CMIDM_NEW_CONNECTION, nccs, &dwResourceId, 0xffffffff, NB_FLAG_ON_TOPMENU);
|
|
if (NCCS_ENABLED == nccs)
|
|
{
|
|
CComPtr<INetConnection> pNetConn;
|
|
// We don't send the owner handle to HrRunWizard,
|
|
// so that the correct Alt-Tab icon can be displayed
|
|
hr = HrRunWizard(NULL, FALSE , &pNetConn, dwFirstPage);
|
|
}
|
|
else
|
|
{
|
|
NcMsgBox(_Module.GetResourceInstance(),
|
|
NULL,
|
|
IDS_CONFOLD_WARNING_CAPTION,
|
|
IDS_ERR_LIMITED_USER,
|
|
MB_ICONEXCLAMATION | MB_OK);
|
|
|
|
hr = S_OK;
|
|
}
|
|
|
|
SetICWComplete();
|
|
|
|
if (szShellNext)
|
|
{
|
|
WCHAR szwShellNext[MAX_PATH];
|
|
WCHAR szwShellNextArg[MAX_PATH];
|
|
|
|
mbstowcs(szwShellNext, szShellNext, MAX_PATH);
|
|
if (szShellNextArg)
|
|
{
|
|
mbstowcs(szwShellNextArg, szShellNextArg, MAX_PATH);
|
|
}
|
|
else
|
|
{
|
|
szwShellNextArg[0] = 0;
|
|
}
|
|
|
|
HINSTANCE hInst = ::ShellExecute(hwndOwner, NULL, szwShellNext, szwShellNextArg, NULL, nShow);
|
|
if (hInst <= reinterpret_cast<HINSTANCE>(32))
|
|
{
|
|
hr = HRESULT_FROM_WIN32(static_cast<DWORD>(reinterpret_cast<DWORD_PTR>(hInst)));
|
|
}
|
|
}
|
|
}
|
|
|
|
CoUninitialize();
|
|
}
|
|
|
|
return hr;
|
|
}
|