Source code of Windows XP (NT5)
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.
 
 
 
 
 
 

255 lines
5.0 KiB

//////////////////////////////////////////////////////////////////////////////
//
// MAIN.CPP / Tuneup
//
// Microsoft Confidential
// Copyright (c) Microsoft Corporation 1998
// All rights reserved
//
// Main tuneup application file.
//
// Original engineer: WillisC
// Updated: Jason Cohen (JCOHEN)
//
//////////////////////////////////////////////////////////////////////////////
//
// Internal include file(s).
//
#include <windows.h>
#include <tchar.h>
#include "tasks.h"
#include "schedwiz.h"
#include "howtorun.h"
#include "wizard.h"
#include "scm.h"
//
// Global variable(s).
//
HWND g_hWnd;
HINSTANCE g_hInst;
DWORD g_dwFlags;
LPTASKDATA g_Tasks;
LPTASKDATA g_CurrentTask;
INT g_nTimeScheme;
TCHAR g_szAppName[64];
//
// Internal (static) function prototype(s).
//
static HANDLE GetMutex(VOID);
static HWND CheckPrevInst(LPHANDLE);
static BOOL TanslateCommandLine(LPTSTR);
//
// Main windows function.
//
INT PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, INT nCmdShow)
{
HANDLE hMutex;
HWND hWnd;
LPTSTR *lpArgs = NULL;
DWORD dwArgs,
dwIndex;
BOOL bRunWizard;
// First we will init any global memory we need to.
//
g_hInst = hInstance;
g_nTimeScheme = 0;
g_dwFlags = 0;
LoadString(hInstance, IDS_TUNEUP, g_szAppName, sizeof(g_szAppName) / sizeof(TCHAR));
// This will setup any command line options first.
//
dwArgs = GetCommandLineOptions(&lpArgs);
for (dwIndex = 1; dwIndex < dwArgs; dwIndex++)
TanslateCommandLine((LPTSTR) *(lpArgs + dwIndex));
FREE(lpArgs);
// If we proccessed a command line option that is designed to
// not run tuneup, we should return now.
//
if ( g_dwFlags & TUNEUP_QUIT )
return TRUE;
// Now check for another instance of Tuneup.
//
if ( hWnd = CheckPrevInst(&hMutex) )
{
SetForegroundWindow(hWnd);
return FALSE;
}
// We now need to create the job tasks.
//
g_Tasks = CreateTasks();
InitJobs(g_Tasks);
// Now we should pick up any data from the registry that we need.
//
if ( RegExists(HKLM, g_szTuneupKey, g_szRegValFirstTime) )
{
// Get previous time scheme.
//
g_nTimeScheme = RegGetDword(HKLM, g_szTuneupKey, g_szRegValTime);
// Get previous express or custom.
//
if ( RegCheck(HKLM, g_szTuneupKey, g_szRegValCustom) )
g_dwFlags |= TUNEUP_CUSTOM;
// Display the how to run dialog. If TRUE is
// returned, we should run the wizard. Otherwise
// the user choose cancel or the tasks were all run
// and we should just return.
//
bRunWizard = HowToRun();
}
else
{
// Set the flag so that tuneup knows this is
// the first time it has been run.
//
g_dwFlags |= TUNEUP_NOSCHEDULE;
// Set this so that we do run the wizard.
//
bRunWizard = TRUE;
}
// Now set any default values that should be set.
//
if ( g_nTimeScheme == 0)
g_nTimeScheme = DEFAULT_TIMESCHEME;
// Start the wizard if we need to.
//
if ( bRunWizard )
CreateWizard(hInstance, NULL);
// Free the job tasks we created.
//
FreeTasks(g_Tasks);
// Release the mutex.
//
if (hMutex)
ReleaseMutex(hMutex);
return TRUE;
}
//
// Internal function(s).
//
static HANDLE GetMutex()
{
const TCHAR szTuneupMutex[] = _T("TUNEUP97MUTEX");
HANDLE hMutex;
// Try to open the Tuneup mutex.
//
if ( hMutex = OpenMutex(SYNCHRONIZE, FALSE, szTuneupMutex) )
{
// There is already another mutex, so we can't get one
// and there should be another Tuneup window to find.
//
CloseHandle(hMutex);
hMutex = NULL;
}
else
{
// No mutex is present, so we should be able to get one.
//
hMutex = CreateMutex(NULL, FALSE, szTuneupMutex);
}
// Return the mutex, will be NULL if there alread is one.
//
return hMutex;
}
static HWND CheckPrevInst(LPHANDLE hMutex)
{
HWND hWnd = NULL;
BOOL bPrev = FALSE;
int nCount;
// Loop until another tuneup window is found or a mutex can
// be created. Max of 10 times (10 seconds).
//
for (nCount = 0; (nCount < 10) && (!bPrev) && ( (*hMutex = GetMutex()) == NULL ); nCount++)
{
#if 0
// Check for the background window of the wizard.
//
if ( bPrev = ( ( hWnd = FindWindow(NULL, g_szAppName) ) != NULL ) )
{
// The background window was found, so show the prev one (i.e. Wizard).
//
hWnd = GetWindow(hWnd, GW_HWNDPREV);
}
else
{
// Check for the how to run dialog.
//
bPrev = ( ( hWnd = FindWindow(NULL, g_szAppName) ) != NULL );
}
#else
bPrev = ( ( hWnd = FindWindow(NULL, g_szAppName) ) != NULL );
#endif
// If we found no window, sleep for 1 second.
//
if (!bPrev)
Sleep(1000);
}
// Return the window handle of any previous instance (will be null if we
// didn't find or we got a mutex).
//
return hWnd;
}
static BOOL TanslateCommandLine(LPTSTR lpArg)
{
BOOL bTranslated = TRUE;
// Check for the /AUTORUN flag.
//
if ( _tcsicmp(_T("/AUTORUN"), lpArg) == 0 )
g_dwFlags |= TUNEUP_AUTORUN;
// Check for the /SERVICE: flag.
//
else if ( _tcsnicmp(_T("/SERVICE:"), lpArg, 9) == 0 )
{
ServiceStart(lpArg + 9);
g_dwFlags |= TUNEUP_QUIT;
}
// Unknown option.
//
else
bTranslated = FALSE;
return bTranslated;
}