|
|
// ICWCfg.cpp : Implementation of CICWSystemConfig
#include "stdafx.h"
#include "icwhelp.h"
#include "ICWCfg.h"
#include <winnetwk.h>
#include <regstr.h>
/////////////////////////////////////////////////////////////////////////////
// CICWSystemConfig
HRESULT CICWSystemConfig::OnDraw(ATL_DRAWINFO& di) { return S_OK; }
//+----------------------------------------------------------------------------
//
// Function IsMSDUN11Installed
//
// Synopsis Check if MSDUN 1.1 or higher is installed
//
// Arguments none
//
// Returns TRUE - MSDUN 1.1 is installed
//
// History 5/28/97 ChrisK created for Olympus Bug 4392
// 1/13/98 DONALDM Copied from ICW \\drywall\slm
//
//-----------------------------------------------------------------------------
#define DUN_11_Version (1.1)
BOOL IsMSDUN11Installed() { CHAR szBuffer[MAX_PATH] = {"\0"}; HKEY hkey = NULL; BOOL bRC = FALSE; DWORD dwType = 0; DWORD dwSize = sizeof(szBuffer); DOUBLE dVersion = 0.0;
if (ERROR_SUCCESS != RegOpenKey(HKEY_LOCAL_MACHINE, TEXT("System\\CurrentControlSet\\Services\\RemoteAccess"), &hkey)) { goto IsMSDUN11InstalledExit; }
if (ERROR_SUCCESS != RegQueryValueEx(hkey, TEXT("Version"), NULL, &dwType, (LPBYTE)szBuffer, &dwSize)) { goto IsMSDUN11InstalledExit; }
dVersion = atof(szBuffer); if (dVersion >= DUN_11_Version) { bRC = TRUE; } IsMSDUN11InstalledExit: if (hkey != NULL) { RegCloseKey(hkey); hkey = NULL; } return bRC; }
//
// Function IsScriptingInstalled
//
// Synopsis Check to see if scripting is already installed
//
// Arguments none
//
// Returns TRUE - scripting has been installed
//
// History 10/14/96 ChrisK Creaed
// 1/13/98 DONALDM Copied from ICW \\drywall\slm
//
//-----------------------------------------------------------------------------
BOOL IsScriptingInstalled() { BOOL bRC = FALSE; HKEY hkey = NULL; DWORD dwSize = 0; DWORD dwType = 0; LONG lrc = 0; HINSTANCE hInst = NULL; TCHAR szData[MAX_PATH+1];
if (VER_PLATFORM_WIN32_NT == g_dwPlatform) { bRC = TRUE; } else if (IsMSDUN11Installed()) { bRC = TRUE; } else { //
// Verify scripting by checking for smmscrpt.dll in RemoteAccess registry key
//
if (1111 <= g_dwBuild) { bRC = TRUE; } else { bRC = FALSE; hkey = NULL; lrc=RegOpenKey(HKEY_LOCAL_MACHINE,TEXT("System\\CurrentControlSet\\Services\\RemoteAccess\\Authentication\\SMM_FILES\\PPP"),&hkey); if (ERROR_SUCCESS == lrc) { dwSize = sizeof(TCHAR)*MAX_PATH; lrc = RegQueryValueEx(hkey,TEXT("Path"),0,&dwType,(LPBYTE)szData,&dwSize); if (ERROR_SUCCESS == lrc) { if (0 == lstrcmpi(szData,TEXT("smmscrpt.dll"))) bRC = TRUE; } } if (hkey) RegCloseKey(hkey); hkey = NULL; }
//
// Verify that the DLL can be loaded
//
if (bRC) { hInst = LoadLibrary(TEXT("smmscrpt.dll")); if (hInst) FreeLibrary(hInst); else bRC = FALSE; hInst = NULL; } } return bRC; }
//+----------------------------------------------------------------------------
//
// Function InstallScripter
//
// Synopsis Install scripting on win95 950.6 builds (not on OSR2)
//
// Arguments none
//
// Returns none
//
// History 10/9/96 ChrisK Copied from mt.cpp in \\trango sources
// 1/13/98 DONALDM Copied from ICW \\drywall\slm
//-----------------------------------------------------------------------------
void CICWSystemConfig::InstallScripter() { STARTUPINFO si; PROCESS_INFORMATION pi; MSG msg ; DWORD iWaitResult = 0;
TraceMsg(TF_SYSTEMCONFIG, TEXT("ICWHELP: Install Scripter.\r\n"));
//
// check if scripting is already set up
//
if (!IsScriptingInstalled()) { TCHAR szCommandLine[] = TEXT("\"icwscrpt.exe\"");
memset(&pi, 0, sizeof(pi)); memset(&si, 0, sizeof(si)); if(!CreateProcess(NULL, szCommandLine, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi)) { TraceMsg(TF_SYSTEMCONFIG, TEXT("ICWHELP: Cant find ICWSCRPT.EXE\r\n")); } else { TraceMsg(TF_SYSTEMCONFIG, TEXT("ICWHELP: Launched ICWSCRPT.EXE. Waiting for exit.\r\n")); //
// wait for event or msgs. Dispatch msgs. Exit when event is signalled.
//
while((iWaitResult=MsgWaitForMultipleObjects(1, &pi.hProcess, FALSE, INFINITE, QS_ALLINPUT))==(WAIT_OBJECT_0 + 1)) { //
// read all of the messages in this next loop
// removing each message as we read it
//
while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { TraceMsg(TF_SYSTEMCONFIG, TEXT("ICWHELP: Got msg\r\n")); //
// how to handle quit message?
//
if (msg.message == WM_QUIT) { TraceMsg(TF_SYSTEMCONFIG, TEXT("ICWHELP: Got quit msg\r\n")); goto done; } else DispatchMessage(&msg); } } done: CloseHandle(pi.hThread); CloseHandle(pi.hProcess); TraceMsg(TF_SYSTEMCONFIG, TEXT("ICWHELP: ICWSCRPT.EXE done\r\n")); } } }
//+----------------------------------------------------------------------------
// Function ConfigSystem
//
// Synopsis Make sure that the system is configured for RAS operations
//
// Arguments none
//
// Return FALSE - if the is not configured. Caller needs to
// call NeedsReboot QuitWizard to get the proper action
// to take.
// NeedsReboot means that we installed stuff, but need the user
// to reboot for the changes to take place
// QuitWizard means just that, time to bail out
// Neither set, means to ask the user user if they really want to
// Quit.
// TRUE - The things are ready to go
//
// History 10/16/96 ChrisK Created
// 1/13/98 DONALDM Copied from ICW \\drywall\slm
//
//-----------------------------------------------------------------------------
STDMETHODIMP CICWSystemConfig::ConfigSystem(BOOL *pbRetVal) { HINSTANCE hinetcfg; TCHAR szBuff256[256+1]; FARPROC fp; HRESULT hr; // Assume a failure below.
*pbRetVal = FALSE;
//
// Locate installation entry point
//
hinetcfg = LoadLibrary(TEXT("INETCFG.DLL")); if (!hinetcfg) { wsprintf(szBuff256,GetSz(IDS_CANTLOADINETCFG),TEXT("INETCFG.DLL")); ::MessageBox(GetActiveWindow(),szBuff256,GetSz(IDS_TITLE),MB_MYERROR); m_bQuitWizard = TRUE; return S_OK; }
fp = GetProcAddress(hinetcfg,"InetConfigSystem"); if (!fp) { MsgBox(IDS_CANTLOADCONFIGAPI, MB_MYERROR); m_bQuitWizard = TRUE; return S_OK; }
// Disable the active window, since any UI the following function brings
// up needs to be modal.
HWND hWnd = GetActiveWindow(); // Install and configure TCP/IP and RNA
hr = ((PFNCONFIGAPI)fp)(hWnd, INETCFG_INSTALLRNA | INETCFG_INSTALLTCP | INETCFG_INSTALLMODEM | (IsNT()?INETCFG_SHOWBUSYANIMATION:0) | INETCFG_REMOVEIFSHARINGBOUND, &m_bNeedsReboot);
// Renable the window, and bring it back to the top of the Z-Order
::SetForegroundWindow(hWnd); // ::BringWindowToTop(hWnd);
// ::SetWindowPos(hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
if (hinetcfg) FreeLibrary(hinetcfg); hinetcfg = NULL;
// See what happened during the config call
if (hr == ERROR_CANCELLED) { return S_OK; } else if (hr != ERROR_SUCCESS) { WORD wTemp = ( VER_PLATFORM_WIN32_WINDOWS == g_dwPlatform ) ? IDS_CONFIGAPIFAILEDRETRY : IDS_CONFIGURENTFAILEDRETRY;
//
// No retry anymore as its not going to help, just
// provide the user with an OK message
// MKarki (4/15/97) Fix for Bug #7004
//
::MessageBox(GetActiveWindow(),GetSz(wTemp),GetSz(IDS_TITLE), MB_MYERROR | MB_OK); m_bQuitWizard = TRUE; return hr; } else { // ChrisK - added 10/9/96
// BUGBUG can this fail, and if so is it a problem???
// original ICW code does not handle failure case here
InstallScripter(); }
// See if we need to reboot. If not, we need to see if the user is logged in
if (!m_bNeedsReboot) { TCHAR szUser[MAX_PATH]; DWORD cchUser = ARRAYSIZE(szUser); // Verify the user is logged on.
if (NO_ERROR != WNetGetUser(NULL,szUser, &cchUser)) { // Failed to get user info, so we need to restart with a loggin
m_bNeedsRestart = TRUE; } else { // User is logged in, so we are happy.
*pbRetVal = TRUE; } } return S_OK; }
STDMETHODIMP CICWSystemConfig::get_NeedsReboot(BOOL * pVal) { *pVal = m_bNeedsReboot; return S_OK; }
STDMETHODIMP CICWSystemConfig::get_NeedsRestart(BOOL * pVal) { *pVal = m_bNeedsRestart; return S_OK; }
STDMETHODIMP CICWSystemConfig::get_QuitWizard(BOOL * pVal) { *pVal = m_bQuitWizard; return S_OK; }
//+----------------------------------------------------------------------------
// Function VerifyRasServicesRunning
//
// Synopsis Make sure that the RAS services are enabled and running
//
// Arguments none
//
// Return FALSE - if the services couldn't be started
//
// History 10/16/96 ChrisK Created
// 1/13/98 DONALDM Copied from ICW \\drywall\slm
//
//-----------------------------------------------------------------------------
STDMETHODIMP CICWSystemConfig::VerifyRASIsRunning(BOOL *pbRetVal) { HINSTANCE hInst = NULL; FARPROC fp = NULL; HRESULT hr;
*pbRetVal = FALSE; // Don't assume a positive result
hInst = LoadLibrary(TEXT("INETCFG.DLL")); if (hInst) { fp = GetProcAddress(hInst, "InetStartServices"); if (fp) { //
// Check Services
//
hr = ((PFINETSTARTSERVICES)fp)(); if (ERROR_SUCCESS == hr) { *pbRetVal = TRUE; // Success.
} else { // Report the error, using the Current Active Window
::MessageBox(GetActiveWindow(), GetSz(IDS_SERVICEDISABLED), GetSz(IDS_TITLE),MB_MYERROR | MB_OK); } } FreeLibrary(hInst); } return S_OK; }
const TCHAR szNetworkPolicies[] = REGSTR_PATH_POLICIES TEXT("\\") REGSTR_KEY_NETWORK; const TCHAR szDisableCaching[] = REGSTR_VAL_DISABLEPWDCACHING;
//+----------------------------------------------------------------------------
// Function CheckPasswordCachingPolicy
//
// Synopsis check to see if a policy as been set against password caching
//
// Arguments none
//
// Return TRUE - if password caching is disabled
//
// History
//
//-----------------------------------------------------------------------------
STDMETHODIMP CICWSystemConfig::CheckPasswordCachingPolicy(BOOL *pbRetVal) { CMcRegistry reg;
*pbRetVal = FALSE; // Open the Network policies key
if (reg.OpenKey(HKEY_LOCAL_MACHINE, szNetworkPolicies)) { DWORD dwVal = 0; // Get the disableCaching value
if (reg.GetValue(szDisableCaching, dwVal)) { // if set, then set the return code to TRUE.
if(dwVal) { *pbRetVal = TRUE; TCHAR szLongString[1024]; TCHAR *pszSmallString1, *pszSmallString2;
// 4/28/97 ChrisK
// Fix build break, because string was too long for compiler.
pszSmallString1 = GetSz(IDS_PWCACHE_DISABLED1); pszSmallString2 = GetSz(IDS_PWCACHE_DISABLED2); lstrcpy(szLongString,pszSmallString1); lstrcat(szLongString,pszSmallString2); ::MessageBox(GetActiveWindow(),szLongString,GetSz(IDS_TITLE), MB_MYERROR); // We are going to kill the app, so hide it now
::ShowWindow(GetActiveWindow(), SW_HIDE); } } } return S_OK; }
|