|
|
//*********************************************************************
//* 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
|