WindowsXP-SP1/inetcore/connectionwizard/inetwiz/init.cpp
2020-09-30 16:53:49 +02:00

349 lines
9.5 KiB
C++

//*********************************************************************
//* Microsoft Windows **
//* Copyright(c) Microsoft Corp., 1994 **
//*********************************************************************
//
// INIT.C - WinMain and initialization code for Internet setup/signup wizard
//
// HISTORY:
//
// 11/20/94 jeremys Created.
// 96/03/26 markdu Put #ifdef __cplusplus around extern "C"
//
#include "wizard.h"
#ifdef WIN32
#include "..\inc\semaphor.h"
#endif
#define IEAK_RESTRICTION_REGKEY TEXT("Software\\Policies\\Microsoft\\Internet Explorer\\Control Panel")
#define IEAK_RESTRICTION_REGKEY_VALUE TEXT("Connwiz Admin Lock")
// superceded by definition in semaphor.h
//#define SEMAPHORE_NAME "Internet Connection Wizard INETWIZ.EXE"
HINSTANCE ghInstance=NULL;
LPTSTR LoadSz(UINT idString,LPTSTR lpszBuf,UINT cbBuf);
#ifdef __cplusplus
extern "C"
{
#endif // __cplusplus
VOID WINAPI LaunchSignupWizard(LPTSTR lpCmdLine,int nCmdShow, PBOOL pReboot);
#ifdef __cplusplus
}
#endif // __cplusplus
BOOL DoesUserHaveAdminPrivleges(HINSTANCE hInstance)
{
HKEY hKey = NULL;
BOOL bRet = FALSE;
if (!IsNT())
return TRUE;
// BUGBUG: We should allow NT5 to run in all user groups
// except normal users.
if (IsNT5())
return TRUE;
//
// Ensure caller is an administrator on this machine.
//
if (ERROR_SUCCESS == RegOpenKeyEx(HKEY_LOCAL_MACHINE,
(TCHAR*)TEXT("SYSTEM\\CurrentControlSet"),
0,
KEY_ALL_ACCESS,
&hKey))
{
bRet = TRUE;
CloseHandle(hKey);
}
else
{
TCHAR szAdminDenied [MAX_PATH] = TEXT("\0");
TCHAR szAdminDeniedTitle [MAX_PATH] = TEXT("\0");
LoadString(hInstance, IDS_ADMIN_ACCESS_DENIED, szAdminDenied, MAX_PATH);
LoadString(hInstance, IDS_ADMIN_ACCESS_DENIED_TITLE, szAdminDeniedTitle, MAX_PATH);
MessageBox(NULL, szAdminDenied, szAdminDeniedTitle, MB_OK | MB_ICONSTOP);
}
return bRet;
}
BOOL CheckForIEAKRestriction(HINSTANCE hInstance)
{
HKEY hkey = NULL;
BOOL bRC = FALSE;
DWORD dwType = 0;
DWORD dwSize = 0;
DWORD dwData = 0;
if (ERROR_SUCCESS == RegOpenKey(HKEY_CURRENT_USER,
IEAK_RESTRICTION_REGKEY,&hkey))
{
dwSize = sizeof(dwData);
if (ERROR_SUCCESS == RegQueryValueEx(hkey,IEAK_RESTRICTION_REGKEY_VALUE,0,&dwType,
(LPBYTE)&dwData,&dwSize))
{
if (dwData)
{
TCHAR szIEAKDenied[MAX_PATH];
TCHAR szIEAKDeniedTitle[MAX_PATH];
LoadString(hInstance, IDS_IEAK_ACCESS_DENIED, szIEAKDenied, MAX_PATH);
LoadString(hInstance, IDS_IEAK_ACCESS_DENIED_TITLE, szIEAKDeniedTitle, MAX_PATH);
MessageBox(NULL, szIEAKDenied, szIEAKDeniedTitle, MB_OK | MB_ICONSTOP);
bRC = TRUE;
}
}
}
if (hkey)
RegCloseKey(hkey);
return bRC;
}
/*******************************************************************
NAME: WinMain
SYNOPSIS: App entry point
********************************************************************/
int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,
LPSTR lpCmdLine,int nCmdShow)
{
BOOL bReboot = FALSE;
#ifdef UNICODE
// Initialize the C runtime locale to the system locale.
setlocale(LC_ALL, "");
#endif
// only allow one instance of wizard
// note: hPrevInstance is always NULL for Win32 apps, so need to look
// for existing window
HANDLE hSemaphore = NULL;
hSemaphore = CreateSemaphore(NULL, 1, 1, ICW_ELSE_SEMAPHORE);
DWORD dwErr = GetLastError();
if ( ERROR_ALREADY_EXISTS == dwErr )
{
IsAnotherComponentRunning32( FALSE );
// every instance should close its own semaphore handle
goto WinMainExit;
}
else
{
if( IsAnotherComponentRunning32( TRUE ) )
goto WinMainExit;
}
//
// remove the batch files if we are running of NT and
// started of 1
//
if (IsNT ())
DeleteStartUpCommand();
if (!DoesUserHaveAdminPrivleges(hInstance))
//no, bail.
goto WinMainExit;
if (CheckForIEAKRestriction(hInstance))
//yes, bail.
goto WinMainExit;
//
// call our DLL to run the wizard
//
#ifdef UNICODE
TCHAR szCmdLine[MAX_PATH+1];
mbstowcs(szCmdLine, lpCmdLine, MAX_PATH+1);
LaunchSignupWizard(szCmdLine, nCmdShow, &bReboot);
#else
LaunchSignupWizard(lpCmdLine, nCmdShow, &bReboot);
#endif
//
// we should reboot, if the flag is set
//
if (TRUE == bReboot)
{
//
// as the user if we would like to reboot at this time
//
TCHAR szMessage[256];
TCHAR szTitle[256];
LoadSz (IDS_WANTTOREBOOT, szMessage, sizeof (szMessage));
LoadSz (IDS_WIZ_WINDOW_NAME, szTitle, sizeof (szTitle));
if (IDYES == MessageBox(NULL, szMessage, szTitle, MB_ICONQUESTION | MB_YESNO | MB_DEFBUTTON2))
{
SetRunOnce ();
if (!FGetSystemShutdownPrivledge() ||
!ExitWindowsEx(EWX_REBOOT,0))
{
TCHAR szFailMessage[256];
LoadSz (IDS_EXITFAILED, szFailMessage, sizeof (szFailMessage));
MessageBox(NULL, szFailMessage, szTitle, MB_ICONERROR | MB_OK);
}
//
// ChrisK Olympus 4212, Allow Inetwiz to exit on restart
//
//else
//{
// //
// // We will wait for the System to release all
// // resources, 5 minutes should be more than
// // enough for this
// // - MKarki (4/22/97) Fix for Bug #3109
// //
// Sleep (300000);
//}
}
}
WinMainExit:
if( hSemaphore )
CloseHandle(hSemaphore);
return 0;
}
/*******************************************************************
NAME: LoadSz
SYNOPSIS: Loads specified string resource into buffer
EXIT: returns a pointer to the passed-in buffer
NOTES: If this function fails (most likely due to low
memory), the returned buffer will have a leading NULL
so it is generally safe to use this without checking for
failure.
********************************************************************/
LPTSTR LoadSz(UINT idString,LPTSTR lpszBuf,UINT cbBuf)
{
ASSERT(lpszBuf);
// Clear the buffer and load the string
if ( lpszBuf )
{
*lpszBuf = '\0';
LoadString( ghInstance, idString, lpszBuf, cbBuf );
}
return lpszBuf;
}
#ifdef WIN32
//+---------------------------------------------------------------------------
//
// Function: IsAnotherComponentRunning32()
//
// Synopsis: Checks if there's another ICW component already
// running. If so, it will set focus to that component's window.
//
// This functionality is needed by all of our .exe's. However,
// the actual components to check for differ between .exe's.
// The comment COMPONENT SPECIFIC designates lines of code
// that vary between components' source code.
//
// For ICWCONN1, we return FALSE if the following are already running:
// another instance of ICWCONN1, any other component
//
// Arguments: bCreatedSemaphore --
// -- if TRUE, then this component has successfully created
// it's semaphore, and we want to check whether other
// components are running
// -- if FALSE, then this component could not create
// it's semaphore, and we want to find the already
// running instance of this component
//
// Returns: TRUE if another component is already running
// FALSE otherwise
//
// History: 12/3/96 jmazner Created, with help from IsAnotherInstanceRunning
// in icwconn1\connmain.cpp
//
//----------------------------------------------------------------------------
BOOL IsAnotherComponentRunning32(BOOL bCreatedSemaphore)
{
HWND hWnd = NULL;
HANDLE hSemaphore = NULL;
DWORD dwErr = 0;
TCHAR szWindowName[SMALL_BUF_LEN+1];
if( !bCreatedSemaphore )
{
// something other than conn1 is running,
// let's find it!
// COMPONENT SPECIFIC
LoadSz(IDS_WIZ_WINDOW_NAME,szWindowName,sizeof(szWindowName));
hWnd = FindWindow(DIALOG_CLASS_NAME, szWindowName);
if( hWnd )
{
SetFocus(hWnd);
SetForegroundWindow(hWnd);
}
// regardless of whether we found the window, return TRUE
// since bCreatedSemaphore tells us this component was already running.
return TRUE;
}
else
{
// check whether CONN1 is running
// The particular semaphores we look for are
// COMPONENT SPECIFIC
// is conn1 running?
hSemaphore = CreateSemaphore(NULL, 1, 1, ICWCONN1_SEMAPHORE);
dwErr = GetLastError();
// close the semaphore right away since we have no use for it.
if( hSemaphore )
CloseHandle(hSemaphore);
if( ERROR_ALREADY_EXISTS == dwErr )
{
// conn1 is running.
// Bring the running instance's window to the foreground
LoadSz(IDS_WIZ_WINDOW_NAME,szWindowName,sizeof(szWindowName));
hWnd = FindWindow(DIALOG_CLASS_NAME, szWindowName);
if( hWnd )
{
SetFocus(hWnd);
SetForegroundWindow(hWnd);
}
return( TRUE );
}
// didn't find any other running components!
return( FALSE );
}
}
#endif