Windows2003-3790/inetcore/connectionwizard/inetcfg/introui.cpp
2020-09-30 16:53:55 +02:00

928 lines
29 KiB
C++

//*********************************************************************
//* Microsoft Windows **
//* Copyright(c) Microsoft Corp., 1994 **
//*********************************************************************
//
// INTROUI.C - Functions for introductory Wizard pages
//
// HISTORY:
//
// 12/22/94 jeremys Created.
// 96/03/07 markdu Use global modem enum object (gpEnumModem) for
// all modem stuff (only need to enum once unless we add a modem)
// 96/03/10 markdu Moved all references to modem name into RASENTRY.
// 96/03/11 markdu Check new CLIENTCONFIG flags before installing
// RNA and TCP.
// 96/03/16 markdu Use ReInit member function to re-enumerate modems.
// 96/03/22 markdu Work around problem with fInstallMail to allow the
// user to decide whether to install mail.
// 96/03/22 markdu Always display both modem and LAN options, regardless
// of what hardware is present.
// 96/03/22 markdu Remove IP setup from LAN path.
// 96/03/23 markdu Replaced CLIENTINFO references with CLIENTCONFIG.
// 96/03/24 markdu Return error values from EnumerateModems().
// 96/03/25 markdu If a fatal error occurs, set gfQuitWizard.
// 96/04/04 markdu Added pfNeedsRestart to WarnIfServerBound
// 96/04/06 markdu Moved CommitConfigurationChanges call to last page.
// 96/05/06 markdu NASH BUG 15637 Removed unused code.
// 96/05/06 markdu NASH BUG 21165 Reordered page logic.
// 96/05/14 markdu NASH BUG 21704 Do not install TCP/IP on LAN path.
// 96/05/20 markdu MSN BUG 8551 Check for reboot when installing
// PPPMAC and TCP/IP.
// 96/05/25 markdu Use ICFG_ flags for lpNeedDrivers and lpInstallDrivers.
// 96/05/27 markdu Use lpIcfgInstallInetComponents and lpIcfgNeedInetComponents.
// 96/09/13 valdonb Remove welcome dialog
//
#include "wizard.h"
#include "interwiz.h"
#include "icwextsn.h"
#include "icwaprtc.h"
#include "imnext.h"
UINT GetModemPage(HWND hDlg);
VOID EnableWizard(HWND hDlg,BOOL fEnable);
HRESULT EnumerateModems(HWND hwndParent, ENUM_MODEM** ppEnumModem);
BOOL IsMoreThanOneModemInstalled(ENUM_MODEM* pEnumModem);
BOOL IsModemInstalled(ENUM_MODEM* pEnumModem);
extern ICFGINSTALLSYSCOMPONENTS lpIcfgInstallInetComponents;
extern ICFGNEEDSYSCOMPONENTS lpIcfgNeedInetComponents;
extern ICFGGETLASTINSTALLERRORTEXT lpIcfgGetLastInstallErrorText;
BOOL FGetSystemShutdownPrivledge();
BOOL g_bSkipMultiModem = FALSE;
int nCurrentModemSel = 0;
// from commctrl defines...
#define IDD_BACK 0x3023
#define IDD_NEXT 0x3024
//*******************************************************************
//
// Function GetDeviceSelectedByUser
//
// Synopsis Get the name of the RAS device that the user had
// already picked
//
// Arguements szKey - name of sub key
// szBuf - pointer to buffer
// dwSize - size of buffer
//
// Return TRUE - success
//
// History 10/21/96 VYung Created
//*******************************************************************
BOOL GetDeviceSelectedByUser (LPTSTR szKey, LPTSTR szBuf, DWORD dwSize)
{
BOOL bRC = FALSE;
HKEY hkey = NULL;
DWORD dwType = 0;
if (ERROR_SUCCESS == RegOpenKey(HKEY_LOCAL_MACHINE,ISIGNUP_KEY,&hkey))
{
if (ERROR_SUCCESS == RegQueryValueEx(hkey,szKey,0,&dwType,
(LPBYTE)szBuf,&dwSize))
bRC = TRUE;
}
if (hkey)
RegCloseKey(hkey);
return bRC;
}
/*******************************************************************
NAME: HowToConnectInitProc
SYNOPSIS: Called when "How to Connect" page is displayed
ENTRY: hDlg - dialog window
fFirstInit - TRUE if this is the first time the dialog
is initialized, FALSE if this InitProc has been called
before (e.g. went past this page and backed up)
********************************************************************/
BOOL CALLBACK HowToConnectInitProc(HWND hDlg,BOOL fFirstInit)
{
// If we were started by inetwiz.exe, there is nothing to
// go back to, so only show the "next" button
// (actually, this will only disable the back button, not hide it.)
if (!(gpWizardState->dwRunFlags & (RSW_NOFREE | RSW_APPRENTICE) ))
PropSheet_SetWizButtons(GetParent(hDlg),PSWIZB_NEXT);
if (fFirstInit)
{
// initialize radio buttons
CheckDlgButton(hDlg,IDC_CONNECT_BY_PHONE,
CONNECT_RAS == gpUserInfo->uiConnectionType);
CheckDlgButton(hDlg,IDC_CONNECT_BY_LAN,
CONNECT_LAN == gpUserInfo->uiConnectionType);
CheckDlgButton(hDlg,IDC_CONNECT_MANUAL,
CONNECT_MANUAL == gpUserInfo->uiConnectionType);
// Normandy 11970 ChrisK - we need a different title if launched from
// mail or news configuration
if ( (gpWizardState->dwRunFlags & RSW_APPRENTICE))
{
if (!g_fIsExternalWizard97)
{
TCHAR szTitle[MAX_RES_LEN+1];
if (LoadSz(IDS_BEGINMANUAL_ALTERNATE,szTitle,sizeof(szTitle)))
SetWindowText (GetDlgItem(hDlg,IDC_LBLTITLE), szTitle);
}
}
else
{
// if we're not here via the apprentice interface, hide the
// manual connect option
ASSERT( CONNECT_MANUAL != gpUserInfo->uiConnectionType );
ShowWindow( GetDlgItem(hDlg,IDC_CONNECT_MANUAL), SW_HIDE);
}
// load in strings for the description paragraph
TCHAR szWhole[ (2 * MAX_RES_LEN) + 1] = TEXT("\0");
TCHAR szTemp[ MAX_RES_LEN + 1] = TEXT("nothing\0");
LoadSz(IDS_HOWTOCONNECT_DESC1,szTemp,sizeof(szTemp));
lstrcat( szWhole, szTemp );
LoadSz(IDS_HOWTOCONNECT_DESC2,szTemp,sizeof(szTemp));
lstrcat( szWhole, szTemp );
SetWindowText (GetDlgItem(hDlg,IDC_DESC), szWhole);
}
// if we've travelled through external apprentice pages,
// it's easy for our current page pointer to get munged,
// so reset it here for sanity's sake.
gpWizardState->uCurrentPage = ORD_PAGE_HOWTOCONNECT;
return TRUE;
}
/*******************************************************************
NAME: HowToConnectOKProc
SYNOPSIS: Called when Next or Back btns pressed from "How to
Connect" page
ENTRY: hDlg - dialog window
fForward - TRUE if 'Next' was pressed, FALSE if 'Back'
puNextPage - if 'Next' was pressed,
proc can fill this in with next page to go to. This
parameter is ingored if 'Back' was pressed.
pfKeepHistory - page will not be kept in history if
proc fills this in with FALSE.
EXIT: returns TRUE to allow page to be turned, FALSE
to keep the same page.
********************************************************************/
BOOL CALLBACK HowToConnectOKProc(HWND hDlg,BOOL fForward,UINT * puNextPage,
BOOL * pfKeepHistory)
{
ASSERT(puNextPage);
// read radio button state
if( IsDlgButtonChecked(hDlg, IDC_CONNECT_BY_LAN) )
{
gpUserInfo->uiConnectionType = CONNECT_LAN;
}
else if( IsDlgButtonChecked(hDlg, IDC_CONNECT_BY_PHONE) )
{
gpUserInfo->uiConnectionType = CONNECT_RAS;
}
else if( IsDlgButtonChecked(hDlg, IDC_CONNECT_MANUAL) )
{
ASSERT( gpWizardState->dwRunFlags & RSW_APPRENTICE );
gpUserInfo->uiConnectionType = CONNECT_MANUAL;
}
if (!fForward)
{
if ( !(gpWizardState->dwRunFlags & RSW_APPRENTICE) )
{
// Hack to make back work...
gpWizardState->uPagesCompleted = 1;
gfUserBackedOut = TRUE;
gfQuitWizard = TRUE;
}
}
else
{
if ( (gpWizardState->dwRunFlags & RSW_APPRENTICE) && !g_fIsICW)
{
if ( !(CONNECT_RAS == gpUserInfo->uiConnectionType) )
{
// 12/20/96 jmazner Normandy #12945
// don't go through proxy options.
// we're about to jump back to the external wizard, and we don't want
// this page to show up in our history list
*pfKeepHistory = FALSE;
*puNextPage = g_uExternUINext;
//Notify the main Wizard that this was the last page
ASSERT( g_pExternalIICWExtension )
if (g_fIsExternalWizard97)
g_pExternalIICWExtension->SetFirstLastPage(0, IDD_PAGE_HOWTOCONNECT97);
else
g_pExternalIICWExtension->SetFirstLastPage(0, IDD_PAGE_HOWTOCONNECT);
g_fConnectionInfoValid = TRUE;
}
else
{
//
// 12/20/96 jmazner Normandy #12948
// Install a modem if neccesary
//
// 5/15/97 jmazner Olympus
//DWORD dwfInstallOptions = INETCFG_INSTALLMODEM;
DWORD dwfInstallOptions = (INETCFG_INSTALLRNA | INETCFG_INSTALLMODEM | INETCFG_INSTALLTCP);
EnableWindow(GetParent(hDlg), FALSE);
//
// save state of fNeedReboot, becasuse
// we might be calling InetCofigureSystem()
// again, and the ReBoot flag might get reset
// MKarki - Fix for Bug #404
//
BOOL bSaveState = gpWizardState->fNeedReboot;
HRESULT hr = InetConfigSystem(GetParent(hDlg),dwfInstallOptions,&gpWizardState->fNeedReboot);
//
// we should choose to reboot -MKarki Bug #404
//
gpWizardState->fNeedReboot =
bSaveState || gpWizardState->fNeedReboot;
EnableWindow(GetParent(hDlg), TRUE);
SetForegroundWindow(GetParent(hDlg));
if (hr == ERROR_CANCELLED)
{
// Stay on this page if the user cancelled
gpWizardState->fNeedReboot = FALSE;
return FALSE;
}
else if (hr != ERROR_SUCCESS)
{
MsgBox(GetParent(hDlg),IDS_CONFIGAPIFAILED,MB_ICONEXCLAMATION,MB_OK);
gpWizardState->fNeedReboot = FALSE;
gfQuitWizard = TRUE;
return FALSE;
}
else if (gpWizardState->fNeedReboot)
{
//
// 5/27/97 jmazner Olympus #1134 and IE #32717
// As per email from GeorgeH and GeoffR, force user to either
// cancel or quit at this point.
//
if (IDYES == MsgBox(GetParent(hDlg),IDS_WANTTOREBOOT,MB_ICONQUESTION, MB_YESNO | MB_DEFBUTTON2))
{
gpWizardState->fNeedReboot = TRUE;
}
else
{
gpWizardState->fNeedReboot = FALSE;
}
gfQuitWizard = TRUE;
return TRUE;
}
//
// 7/16/97 jmazner Olympus #9571
// if the configSystem call installed a modem for the first time on
// the user's machine, then the TAPI information we initially read
// in was bogus because the user had never filled it in.
// Therefore re initialize the fields to make sure we have accurate info
//
InitRasEntry( gpRasEntry );
*puNextPage = GetModemPage(hDlg);
}
}
else
{
//Normandy# 4575 install TCP/IP on LAN path
//Normandy# 8620 Do not install TCP/IP on LAN path
DWORD dwfInstallOptions = 0;
if (CONNECT_RAS == gpUserInfo->uiConnectionType)
dwfInstallOptions |= (INETCFG_INSTALLRNA | INETCFG_INSTALLMODEM | INETCFG_INSTALLTCP);
else if (CONNECT_LAN == gpUserInfo->uiConnectionType)
dwfInstallOptions |= INETCFG_INSTALLTCP;
//
// Install and configure TCP/IP and RNA
//
//
// save state of fNeedReboot, becasuse
// we might be calling InetCofigureSystem()
// again, and the ReBoot flag might get reset
// MKarki - Fix for Bug #404
//
BOOL bSaveState = gpWizardState->fNeedReboot;
HRESULT hr = InetConfigSystem(GetParent(hDlg),dwfInstallOptions,&gpWizardState->fNeedReboot);
//
// we should choose to reboot -MKarki Bug #404
//
gpWizardState->fNeedReboot =
bSaveState || gpWizardState->fNeedReboot;
SetForegroundWindow(GetParent(hDlg));
if (hr == ERROR_CANCELLED) {
// Stay on this page if the user cancelled
gpWizardState->fNeedReboot = FALSE;
if (g_fIsICW)
{
g_pExternalIICWExtension->ExternalCancel( CANCEL_PROMPT );
}
return FALSE;
} else if (hr != ERROR_SUCCESS) {
MsgBox(GetParent(hDlg),IDS_CONFIGAPIFAILED,MB_ICONEXCLAMATION,MB_OK);
gpWizardState->fNeedReboot = FALSE;
//gfQuitWizard = TRUE;
// 2/27/97 jmazner Olympus #299
// don't quit, give the user a chance to choose LAN
gpUserInfo->uiConnectionType = CONNECT_LAN;
CheckDlgButton(hDlg,IDC_CONNECT_BY_PHONE,FALSE);
CheckDlgButton(hDlg,IDC_CONNECT_BY_LAN,TRUE);
EnableWindow(GetDlgItem(hDlg,IDC_CONNECT_BY_PHONE),FALSE);
return FALSE;
} else if (ERROR_SUCCESS == hr && gpWizardState->fNeedReboot && IsNT()) {
//
// we will let the EXE that called us POP up the dialog
// box, asking users to reboot or not
// MKarki (2/5/97) - Fix for Bug #3111
//
g_bReboot = TRUE;
gfQuitWizard = TRUE;
if (!g_fIsICW)
{
PropSheet_PressButton(GetParent(hDlg),PSBTN_CANCEL);
SetPropSheetResult(hDlg,-1);
}
return (FALSE);
}
g_bRebootAtExit = gpWizardState->fNeedReboot;
//
// 7/16/97 jmazner Olympus #9571
// if the configSystem call installed a modem for the first time on
// the user's machine, then the TAPI information we initially read
// in was bogus because the user had never filled it in.
// Therefore re initialize the fields to make sure we have accurate info
//
InitRasEntry( gpRasEntry );
if (dwfInstallOptions & INETCFG_INSTALLRNA)
{
if (ERROR_SUCCESS != InetStartServices())
{
//
// condition when
// 1) user deliberately removes some file
// 2) Did not reboot after installing RAS
// MKarki - (5/7/97) - Fix for Bug #4004
//
MsgBox(
GetParent(hDlg),
IDS_SERVICEDISABLED,
MB_ICONEXCLAMATION,MB_OK
);
/*********
//
// Bug #12544 - VetriV
// Check if user wants to exit ICW
//
if( (MsgBox(GetParent(hDlg), IDS_QUERYCANCEL,
MB_APPLMODAL | MB_ICONQUESTION
| MB_SETFOREGROUND | MB_DEFBUTTON2,
MB_YESNO) == IDNO))
{
goto StartService;
}
else
{
gpWizardState->fNeedReboot = FALSE;
gfQuitWizard = TRUE;
****/
// 2/27/97 jmazner Olympus #299
// don't quit, give the user a chance to choose LAN
gpUserInfo->uiConnectionType = CONNECT_LAN;
CheckDlgButton(hDlg,IDC_CONNECT_BY_PHONE,FALSE);
CheckDlgButton(hDlg,IDC_CONNECT_BY_LAN,TRUE);
EnableWindow(GetDlgItem(hDlg,IDC_CONNECT_BY_PHONE),FALSE);
return FALSE;
}
}
// jmazner 11/11/96 Normandy #11320
// Note: we are explicitly deferring the reboot until after the wizard
// has completed.
//if( gpWizardState->fNeedReboot )
//{
// gfQuitWizard = TRUE;
// return TRUE;
//}
if (CONNECT_LAN == gpUserInfo->uiConnectionType)
{
// Skip the use proxy page
*puNextPage = ORD_PAGE_SETUP_PROXY;
}
else
{
// get the next page based on number of modems.
*puNextPage = GetModemPage(hDlg);
}
}
}
return TRUE;
}
/*******************************************************************
NAME: ChooseModemInitProc
SYNOPSIS: Called when "Choose Modem" page is displayed
ENTRY: hDlg - dialog window
fFirstInit - TRUE if this is the first time the dialog
is initialized, FALSE if this InitProc has been called
before (e.g. went past this page and backed up)
********************************************************************/
BOOL CALLBACK ChooseModemInitProc(HWND hDlg,BOOL fFirstInit)
{
ProcessDBCS(hDlg, IDC_MODEM);
gpWizardState->uCurrentPage = ORD_PAGE_CHOOSEMODEM;
// fill the combobox with available modems
DWORD dwRet = InitModemList(GetDlgItem(hDlg,IDC_MODEM));
if (ERROR_SUCCESS != dwRet)
{
DisplayErrorMessage(hDlg,IDS_ERREnumModem,dwRet,
ERRCLS_STANDARD,MB_ICONEXCLAMATION);
// set flag to indicate that wizard should exit now
gfQuitWizard = TRUE;
return FALSE;
}
if (-1 == ComboBox_SetCurSel(GetDlgItem(hDlg,IDC_MODEM), nCurrentModemSel))
ComboBox_SetCurSel(GetDlgItem(hDlg,IDC_MODEM), 0);
return TRUE;
}
/*******************************************************************
NAME: ChooseModemCmdProc
SYNOPSIS: Called when modem selected on page
ENTRY: hDlg - dialog window
********************************************************************/
BOOL CALLBACK ChooseModemCmdProc(HWND hDlg,WPARAM wParam,LPARAM lParam)
{
return TRUE;
}
/*******************************************************************
NAME: ChooseModemOKProc
SYNOPSIS: Called when Next or Back btns pressed from "Choose Modem"
page
ENTRY: hDlg - dialog window
fForward - TRUE if 'Next' was pressed, FALSE if 'Back'
puNextPage - if 'Next' was pressed,
proc can fill this in with next page to go to. This
parameter is ingored if 'Back' was pressed.
pfKeepHistory - page will not be kept in history if
proc fills this in with FALSE.
EXIT: returns TRUE to allow page to be turned, FALSE
to keep the same page.
********************************************************************/
BOOL CALLBACK ChooseModemOKProc(HWND hDlg,BOOL fForward,UINT * puNextPage,
BOOL * pfKeepHistory)
{
if (fForward)
{
// get modem name out of combo box
ComboBox_GetText(GetDlgItem(hDlg,IDC_MODEM),
gpRasEntry->szDeviceName,ARRAYSIZE(gpRasEntry->szDeviceName));
NULL_TERM_TCHARS(gpRasEntry->szDeviceName);
ASSERT(lstrlen(gpRasEntry->szDeviceName));
// set next page to go to
// jmazner 11/11/96 Normandy #8293
//*puNextPage = ORD_PAGE_CONNECTION;
// 10/05/98 Vincent Yung
// Connectoid page is removed.
/*
ENUM_CONNECTOID EnumConnectoid; // class object for enum
// 3/21/97 jmazner Olympus #1948
if( EnumConnectoid.NumEntries() )
{
*puNextPage = ORD_PAGE_CONNECTION;
}
else
{
// 5/8/97 jmazner Olympus #4108
// move connectionName to the end
//*puNextPage = ORD_PAGE_CONNECTIONNAME;
*puNextPage = ORD_PAGE_PHONENUMBER;
}*/
*puNextPage = ORD_PAGE_PHONENUMBER;
}
// Store modem selection
nCurrentModemSel = ComboBox_GetCurSel(GetDlgItem(hDlg,IDC_MODEM));
// clear the modem list
ComboBox_ResetContent(GetDlgItem(hDlg,IDC_MODEM));
return TRUE;
}
/*******************************************************************
NAME: EnableWizard
SYNOPSIS: Enables or disables the wizard buttons and the wizard
page itself (so it can't receive focus)
********************************************************************/
VOID EnableWizard(HWND hDlg,BOOL fEnable)
{
HWND hwndWiz = GetParent(hDlg);
// disable/enable back, next, cancel and help buttons
EnableWindow(GetDlgItem(hwndWiz,IDD_BACK),fEnable);
EnableWindow(GetDlgItem(hwndWiz,IDD_NEXT),fEnable);
EnableWindow(GetDlgItem(hwndWiz,IDCANCEL),fEnable);
EnableWindow(GetDlgItem(hwndWiz,IDHELP),fEnable);
// disable/enable wizard page
EnableWindow(hwndWiz,fEnable);
UpdateWindow(hwndWiz);
}
//*******************************************************************
//
// FUNCTION: GetModemPage
//
// PURPOSE: This is only called from a few places. This same logic
// would have otherwise had to be included several times, this
// centralizes the logic. The possible pages returned are the
// "Need Modem" page, the "Choose Modem" page, and "Has ISP".
//
// PARAMETERS: Parent window.
//
// RETURNS: returns the ordinal of the page to display next after
// initial questions are asked.
//
// HISTORY:
// 96/03/07 markdu Created.
// 96/11/11 jmazner updated to skip new/existing connectoid page
// if no connectoids exist.
//
//*******************************************************************
UINT GetModemPage(HWND hDlg)
{
/*** no reason to handle NT seperately -- jmazner
if (TRUE == IsNT())
{
//TODO: Add call to NT enum modems
return ORD_PAGE_CONNECTION;
}
***/
// Enumerate the modems
DWORD dwRet = EnumerateModems(hDlg, &gpEnumModem);
if (ERROR_SUCCESS != dwRet)
{
// set flag to indicate that wizard should exit now
gfQuitWizard = TRUE;
return FALSE;
}
if (IsMoreThanOneModemInstalled(gpEnumModem))
{
// Multiple modems installed.
TCHAR szDeviceName[RAS_MaxDeviceName + 1] = TEXT("\0");
TCHAR szDeviceType[RAS_MaxDeviceType + 1] = TEXT("\0"); // modems are installed
// If we want to skip the choose modem dlg.
// retrieve the device info from registry.
if (g_bSkipMultiModem &&
GetDeviceSelectedByUser(DEVICENAMEKEY, szDeviceName, sizeof(szDeviceName)) &&
GetDeviceSelectedByUser(DEVICETYPEKEY, szDeviceType, sizeof(szDeviceType)) )
{
lstrcpy(gpRasEntry->szDeviceName, szDeviceName);
lstrcpy(gpRasEntry->szDeviceType, szDeviceType);
return ORD_PAGE_PHONENUMBER;
}
else
{
return ORD_PAGE_CHOOSEMODEM;
}
}
else
{
// One modem installed.
// Note: this option will also be selected if modems could
// not be enumerated due to an error.
// connecting over modem and all drivers/files are in place, go
// to "existing ISP" page
// return ORD_PAGE_CONNECTION;
ENUM_CONNECTOID EnumConnectoid; // class object for enum
if( EnumConnectoid.NumEntries() )
{
return ORD_PAGE_CONNECTION;
}
else
{
// 5/8/97 jmazner Olympus #4108
// move connectionName to the end
//return ORD_PAGE_CONNECTIONNAME;
return ORD_PAGE_PHONENUMBER;
}
}
}
//*******************************************************************
//
// FUNCTION: EnumerateModems
//
// PURPOSE: This function assumes that RNA is installed,
// then it uses RNA to enumerate the devices.
// If an enum object exists, it is replaced.
//
// PARAMETERS: Pointer to current enum object, if one exists.
// In any case, must be a valid pointer.
// Parent window handle for displaying error message.
//
// RETURNS: HRESULT code (ERROR_SUCCESS if no error occurred).
//
// HISTORY:
// 96/03/07 markdu Created.
//
//*******************************************************************
HRESULT EnumerateModems(HWND hwndParent, ENUM_MODEM** ppEnumModem)
{
DWORD dwRet;
// Should only get here if we want to connect by modem/ISDN
ASSERT(CONNECT_RAS == gpUserInfo->uiConnectionType)
// Load RNA if not already loaded
dwRet = EnsureRNALoaded();
if (ERROR_SUCCESS != dwRet)
{
return dwRet;
}
ENUM_MODEM* pEnumModem = *ppEnumModem;
// Enumerate the modems.
if (pEnumModem)
{
// Re-enumerate the modems to be sure we have the most recent changes
dwRet = pEnumModem->ReInit();
}
else
{
// The object does not exist, so create it.
pEnumModem = new ENUM_MODEM;
if (pEnumModem)
{
dwRet = pEnumModem->GetError();
}
else
{
dwRet = ERROR_NOT_ENOUGH_MEMORY;
}
}
// Check for errors
if (ERROR_SUCCESS != dwRet)
{
DisplayErrorMessage(hwndParent,IDS_ERREnumModem,dwRet,
ERRCLS_STANDARD,MB_ICONEXCLAMATION);
// Clean up
if (pEnumModem)
{
delete pEnumModem;
}
pEnumModem = NULL;
}
*ppEnumModem = pEnumModem;
return dwRet;
}
//*******************************************************************
//
// FUNCTION: IsModemInstalled
//
// PURPOSE: This function validates the ENUM_MODEM object, then
// gets the modem count.
//
// PARAMETERS: Modem enum object to use for check.
//
// RETURNS: This function returns TRUE if there is at least one
// modem installed.
//
// HISTORY:
// 96/03/07 markdu Created.
//
//*******************************************************************
BOOL IsModemInstalled(ENUM_MODEM* pEnumModem)
{
if (TRUE == IsNT())
{
BOOL bNeedModem = FALSE;
DWORD dwRet;
if (NULL == lpIcfgNeedModem)
return FALSE;
dwRet = (*lpIcfgNeedModem)(0, &bNeedModem);
if (ERROR_SUCCESS == dwRet)
return !bNeedModem;
else
return FALSE;
}
else
{
if (pEnumModem && pEnumModem->GetNumDevices() > 0)
{
return TRUE;
}
return FALSE;
}
}
//*******************************************************************
//
// FUNCTION: IsMoreThanOneModemInstalled
//
// PURPOSE: This function validates the ENUM_MODEM object, then
// gets the modem count.
//
// PARAMETERS: Modem enum object to use for check.
//
// RETURNS: This function returns TRUE if there is more than one
// modem installed.
//
// HISTORY:
// 96/03/07 markdu Created.
//
//*******************************************************************
BOOL IsMoreThanOneModemInstalled(ENUM_MODEM* pEnumModem)
{
if (IsNT4SP3Lower())
{
// TODO: DO NT thing here
return FALSE;
}
if (pEnumModem && pEnumModem->GetNumDevices() > 1)
{
return TRUE;
}
return FALSE;
}
//+----------------------------------------------------------------------------
//
// Function: FGetSystemShutdownPrivledge
//
// Synopsis: For windows NT the process must explicitly ask for permission
// to reboot the system.
//
// Arguements: none
//
// Return: TRUE - privledges granted
// FALSE - DENIED
//
// History: 8/14/96 ChrisK Created
//
// Note: BUGBUG for Win95 we are going to have to softlink to these
// entry points. Otherwise the app won't even load.
// Also, this code was originally lifted out of MSDN July96
// "Shutting down the system"
//-----------------------------------------------------------------------------
BOOL FGetSystemShutdownPrivledge()
{
HANDLE hToken = NULL;
TOKEN_PRIVILEGES tkp;
BOOL bRC = FALSE;
if (IsNT())
{
//
// Get the current process token handle
// so we can get shutdown privilege.
//
if (!OpenProcessToken(GetCurrentProcess(),
TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
goto FGetSystemShutdownPrivledgeExit;
//
// Get the LUID for shutdown privilege.
//
ZeroMemory(&tkp,sizeof(tkp));
LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME,
&tkp.Privileges[0].Luid);
tkp.PrivilegeCount = 1; /* one privilege to set */
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
//
// Get shutdown privilege for this process.
//
AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,
(PTOKEN_PRIVILEGES) NULL, 0);
if (ERROR_SUCCESS == GetLastError())
bRC = TRUE;
}
else
{
bRC = TRUE;
}
FGetSystemShutdownPrivledgeExit:
if (hToken) CloseHandle(hToken);
return bRC;
}