|
|
/*++
Copyright (c) 1996 Microsoft Corporation
Module Name:
wizard.c
Abstract:
This file implements the setup wizard code for the FAX server setup.
Environment:
WIN32 User Mode
Author:
Wesley Witt (wesw) 17-Feb-1996
--*/
#include "wizard.h"
#pragma hdrstop
// ------------------------------------------------------------
// Internal prototypes
BOOL Win9xUpg(); // t-briand: added for Win9x upgrade process.
WIZPAGE SetupWizardPages[WizPageMaximum] = {
//
// Device Status Page
//
{ PSWIZB_NEXT, // valid buttons
0, // help id
NULL, // title
WizPageDeviceStatus, // page id
DeviceStatusDlgProc, // dlg proc
{ 0, // size of struct
0, // flags
NULL, // hinst (filled in at run time)
MAKEINTRESOURCE(IDD_DEVICE_INIT_PAGE), // dlg template
NULL, // icon
NULL, // title
CommonDlgProc, // dlg proc
0, // lparam
NULL, // callback
NULL // ref count
}},
//
// Device Selection Page
//
{ PSWIZB_NEXT, // valid buttons
0, // help id
NULL, // title
WizPageDeviceSelection, // page id
DeviceSelectionDlgProc, // dlg proc
{ 0, // size of struct
0, // flags
NULL, // hinst (filled in at run time)
MAKEINTRESOURCE(IDD_WORKSTATION_DEVICE_SELECT), // dlg template
NULL, // icon
NULL, // title
CommonDlgProc, // dlg proc
0, // lparam
NULL, // callback
NULL // ref count
}},
//
// Server name page
//
{ PSWIZB_NEXT, // valid buttons
0, // help id
NULL, // title
WizPageServerName, // page id
ServerNameDlgProc, // dlg proc
{ 0, // size of struct
0, // flags
NULL, // hinst (filled in at run time)
MAKEINTRESOURCE(IDD_SERVER_NAME_PAGE), // dlg template
NULL, // icon
NULL, // title
CommonDlgProc, // dlg proc
0, // lparam
NULL, // callback
NULL // ref count
}},
//
// Exchange page
//
{ PSWIZB_NEXT | PSWIZB_BACK, // valid buttons
0, // help id
NULL, // title
WizPageExchange, // page id
ExchangeDlgProc, // dlg proc
{ 0, // size of struct
0, // flags
NULL, // hinst (filled in at run time)
MAKEINTRESOURCE(IDD_EXCHANGE_PAGE), // dlg template
NULL, // icon
NULL, // title
CommonDlgProc, // dlg proc
0, // lparam
NULL, // callback
NULL // ref count
}},
//
// File copy page
//
{ PSWIZB_NEXT | PSWIZB_BACK, // valid buttons
0, // help id
NULL, // title
WizPageFileCopy, // page id
FileCopyDlgProc, // dlg proc
{ 0, // size of struct
0, // flags
NULL, // hinst (filled in at run time)
MAKEINTRESOURCE(IDD_FILE_COPY_PAGE), // dlg template
NULL, // icon
NULL, // title
CommonDlgProc, // dlg proc
0, // lparam
NULL, // callback
NULL // ref count
}},
//
// Station Id page
//
{ PSWIZB_NEXT | PSWIZB_BACK, // valid buttons
0, // help id
NULL, // title
WizPageStationId, // page id
StationIdDlgProc, // dlg proc
{ 0, // size of struct
0, // flags
NULL, // hinst (filled in at run time)
MAKEINTRESOURCE(IDD_STATIONID_PAGE), // dlg template
NULL, // icon
NULL, // title
CommonDlgProc, // dlg proc
0, // lparam
NULL, // callback
NULL // ref count
}},
//
// Routing Printer Name Page
//
{ PSWIZB_NEXT | PSWIZB_BACK, // valid buttons
0, // help id
NULL, // title
WizPageRoutePrint, // page id
RoutePrintDlgProc, // dlg proc
{ 0, // size of struct
0, // flags
NULL, // hinst (filled in at run time)
MAKEINTRESOURCE(IDD_ROUTE_PRINT_PAGE), // dlg template
NULL, // icon
NULL, // title
CommonDlgProc, // dlg proc
0, // lparam
NULL, // callback
NULL // ref count
}},
//
// Routing Store Page
//
{ PSWIZB_NEXT | PSWIZB_BACK, // valid buttons
0, // help id
NULL, // title
WizPageRouteStoreDir, // page id
RouteStoreDlgProc, // dlg proc
{ 0, // size of struct
0, // flags
NULL, // hinst (filled in at run time)
MAKEINTRESOURCE(IDD_ROUTE_STOREDIR_PAGE), // dlg template
NULL, // icon
NULL, // title
CommonDlgProc, // dlg proc
0, // lparam
NULL, // callback
NULL // ref count
}},
//
// Routing Inbox Page
//
{ PSWIZB_NEXT | PSWIZB_BACK, // valid buttons
0, // help id
NULL, // title
WizPageRouteInbox, // page id
RouteMailDlgProc, // dlg proc
{ 0, // size of struct
0, // flags
NULL, // hinst (filled in at run time)
MAKEINTRESOURCE(IDD_ROUTE_INBOX_PAGE), // dlg template
NULL, // icon
NULL, // title
CommonDlgProc, // dlg proc
0, // lparam
NULL, // callback
NULL // ref count
}},
//
// Routing Security Page
//
{ PSWIZB_NEXT | PSWIZB_BACK, // valid buttons
0, // help id
NULL, // title
WizPageRouteSecurity, // page id
RouteSecurityDlgProc, // dlg proc
{ 0, // size of struct
0, // flags
NULL, // hinst (filled in at run time)
MAKEINTRESOURCE(IDD_ROUTE_USERPASS_PAGE), // dlg template
NULL, // icon
NULL, // title
CommonDlgProc, // dlg proc
0, // lparam
NULL, // callback
NULL // ref count
}},
//
// Platforms Page
//
{ PSWIZB_NEXT, // valid buttons
0, // help id
NULL, // title
WizPagePlatforms, // page id
PlatformsDlgProc, // dlg proc
{ 0, // size of struct
0, // flags
NULL, // hinst (filled in at run time)
MAKEINTRESOURCE(IDD_SERVER_PLATFORMS_PAGE), // dlg template
NULL, // icon
NULL, // title
CommonDlgProc, // dlg proc
0, // lparam
NULL, // callback
NULL // ref count
}},
//
// Last server page
//
{ PSWIZB_FINISH, // valid buttons
0, // help id
NULL, // title
WizPageLast, // page id
LastPageDlgProc, // dlg proc
{ 0, // size of struct
0, // flags
NULL, // hinst (filled in at run time)
MAKEINTRESOURCE(IDD_LAST_WIZARD_PAGE), // dlg template
NULL, // icon
NULL, // title
CommonDlgProc, // dlg proc
0, // lparam
NULL, // callback
NULL // ref count
}},
//
// Last uninstall page
//
{ PSWIZB_FINISH, // valid buttons
0, // help id
NULL, // title
WizPageLastUninstall, // page id
LastPageUninstallDlgProc, // dlg proc
{ 0, // size of struct
0, // flags
NULL, // hinst (filled in at run time)
MAKEINTRESOURCE(IDD_LAST_UNINSTALL_PAGE), // dlg template
NULL, // icon
NULL, // title
CommonDlgProc, // dlg proc
0, // lparam
NULL, // callback
NULL // ref count
}},
//
// Client's fax server name page
//
{ PSWIZB_NEXT, // valid buttons
0, // help id
NULL, // title
WizPageClientServerName, // page id
ClientServerNameDlgProc, // dlg proc
{ 0, // size of struct
0, // flags
NULL, // hinst (filled in at run time)
MAKEINTRESOURCE(IDD_CLIENT_SERVER_NAME_PAGE), // dlg template
NULL, // icon
NULL, // title
CommonDlgProc, // dlg proc
0, // lparam
NULL, // callback
NULL // ref count
}},
//
// Client's user info page
//
{ PSWIZB_NEXT | PSWIZB_BACK, // valid buttons
0, // help id
NULL, // title
WizPageClientUserInfo, // page id
ClientUserInfoDlgProc, // dlg proc
{ 0, // size of struct
0, // flags
NULL, // hinst (filled in at run time)
MAKEINTRESOURCE(IDD_CLIENT_USER_INFO_PAGE), // dlg template
NULL, // icon
NULL, // title
CommonDlgProc, // dlg proc
0, // lparam
NULL, // callback
NULL // ref count
}},
//
// Client file copy page
//
{ PSWIZB_NEXT | PSWIZB_BACK, // valid buttons
0, // help id
NULL, // title
WizPageClientFileCopy, // page id
ClientFileCopyDlgProc, // dlg proc
{ 0, // size of struct
0, // flags
NULL, // hinst (filled in at run time)
MAKEINTRESOURCE(IDD_FILE_COPY_PAGE), // dlg template
NULL, // icon
NULL, // title
CommonDlgProc, // dlg proc
0, // lparam
NULL, // callback
NULL // ref count
}},
//
// Last client page
//
{ PSWIZB_FINISH, // valid buttons
0, // help id
NULL, // title
WizPageClientLast, // page id
LastClientPageDlgProc, // dlg proc
{ 0, // size of struct
0, // flags
NULL, // hinst (filled in at run time)
MAKEINTRESOURCE(IDD_CLIENT_LAST_PAGE), // dlg template
NULL, // icon
NULL, // title
CommonDlgProc, // dlg proc
0, // lparam
NULL, // callback
NULL // ref count
}},
//
// Remote admin file copy page
//
{ PSWIZB_NEXT, // valid buttons
0, // help id
NULL, // title
WizPageRemoteAdminCopy, // page id
RemoteAdminFileCopyDlgProc, // dlg proc
{ 0, // size of struct
0, // flags
NULL, // hinst (filled in at run time)
MAKEINTRESOURCE(IDD_FILE_COPY_PAGE), // dlg template
NULL, // icon
NULL, // title
CommonDlgProc, // dlg proc
0, // lparam
NULL, // callback
NULL // ref count
}}
};
DWORD ServerWizardPages[] = {
WizPageDeviceStatus, WizPageServerName, WizPagePlatforms, WizPageStationId, WizPageExchange, WizPageRouteStoreDir, WizPageRoutePrint, WizPageRouteInbox, WizPageRouteSecurity, WizPageFileCopy, WizPageLast, WizPageLastUninstall, (DWORD)-1
};
DWORD WorkstationWizardPages[] = {
WizPageDeviceStatus, WizPageDeviceSelection, WizPageServerName, WizPageStationId, WizPageExchange, WizPageRouteStoreDir, WizPageRoutePrint, WizPageRouteInbox, WizPageRouteSecurity, WizPageFileCopy, WizPageLast, WizPageLastUninstall, (DWORD)-1
};
DWORD ClientWizardPages[] = {
WizPageClientServerName, WizPageClientUserInfo, WizPageExchange, WizPageClientFileCopy, WizPageClientLast, WizPageLastUninstall, (DWORD)-1
};
DWORD PointPrintWizardPages[] = {
WizPageClientUserInfo, WizPageClientFileCopy, (DWORD)-1
};
DWORD RemoteAdminPages[] = {
WizPageRemoteAdminCopy, WizPageLast, WizPageLastUninstall, (DWORD)-1
};
HINSTANCE FaxWizModuleHandle; TCHAR SourceDirectory[4096]; TCHAR ClientSetupServerName[128]; BOOL MapiAvail; BOOL Unattended; BOOL SuppressReboot = FALSE; BOOL NtGuiMode; WIZ_DATA WizData; BOOL OkToCancel;
BOOL PointPrintSetup; DWORD RequestedSetupType; DWORD InstallMode; DWORD Installed; DWORD InstallType; DWORD InstalledPlatforms; DWORD Enabled; DWORD InstallThreadError;
DWORD FaxWizardDllInit( HINSTANCE hInstance, DWORD Reason, LPVOID Context )
/*++
Routine Description:
DLL initialization function.
Arguments:
hInstance - Instance handle Reason - Reason for the entrypoint being called Context - Context record
Return Value:
TRUE - Initialization succeeded FALSE - Initialization failed
--*/
{ if (Reason == DLL_PROCESS_ATTACH) { FaxWizModuleHandle = hInstance; DisableThreadLibraryCalls( hInstance ); HeapInitialize( NULL, NULL, NULL, 0 ); }
if (Reason == DLL_PROCESS_DETACH) { HeapCleanup(); }
return TRUE; }
BOOL WINAPI FaxWizInit( VOID ) { InitializeStringTable();
if (!NtGuiMode) { InitializeMapi(); }
GetInstallationInfo( &Installed, &InstallType, &InstalledPlatforms, &Enabled );
//
// Sequentially enumerate platforms.
//
EnumPlatforms[PROCESSOR_ARCHITECTURE_INTEL] = 0; EnumPlatforms[PROCESSOR_ARCHITECTURE_MIPS] = WRONG_PLATFORM; EnumPlatforms[PROCESSOR_ARCHITECTURE_ALPHA] = 1; EnumPlatforms[PROCESSOR_ARCHITECTURE_PPC] = WRONG_PLATFORM;
return TRUE; }
DWORD WINAPI FaxWizGetError( VOID ) { return InstallThreadError; }
VOID WINAPI FaxWizSetInstallMode( DWORD RequestedInstallMode, DWORD RequestedInstallType, LPWSTR AnswerFile ) { InstallMode = RequestedInstallMode; InstallType = RequestedInstallType;
if (InstallMode == (INSTALL_REMOVE | INSTALL_UNATTENDED) ) {
InstallMode = INSTALL_REMOVE; Unattended = TRUE;
}
if (InstallMode == INSTALL_UNATTENDED) {
//
// initialize the answers
//
UnAttendInitialize( AnswerFile );
//
// set the install mode
//
if (_wcsicmp( UnattendAnswerTable[UAA_MODE].Answer.String, MODE_NEW ) == 0) { InstallMode = INSTALL_NEW; } else if (_wcsicmp( UnattendAnswerTable[UAA_MODE].Answer.String, MODE_UPGRADE ) == 0) { InstallMode = INSTALL_UPGRADE; } else if (_wcsicmp( UnattendAnswerTable[UAA_MODE].Answer.String, MODE_REMOVE ) == 0) { InstallMode = INSTALL_REMOVE; } else if (_wcsicmp( UnattendAnswerTable[UAA_MODE].Answer.String, MODE_DRIVERS ) == 0) { InstallMode = INSTALL_DRIVERS; } else { InstallMode = INSTALL_NEW; }
if (InstallMode == INSTALL_UPGRADE && Installed == FALSE) { InstallMode = INSTALL_NEW; }
//
// remember that faxsetup is doing an unattended setup
// this is the flag that all other code checks
//
Unattended = TRUE; } }
BOOL WINAPI FaxWizPointPrint( LPTSTR DirectoryName, LPTSTR PrinterName ) { DWORD len; LPTSTR p;
len = _tcslen(DirectoryName); _tcscpy( SourceDirectory, DirectoryName );
p = _tcschr( SourceDirectory, TEXT('\\') ); if (p) { *p = 0; _tcscpy( ClientSetupServerName, &SourceDirectory[2] ); *p = TEXT('\\'); }
if (SourceDirectory[len-1] != TEXT('\\')) { SourceDirectory[len] = TEXT('\\'); SourceDirectory[len+1] = 0; }
if (PrinterName[0] == TEXT('\\') && PrinterName[1] == TEXT('\\')) { _tcscpy( WizData.PrinterName, PrinterName ); } else { WizData.PrinterName[0] = TEXT('\\'); WizData.PrinterName[1] = TEXT('\\'); WizData.PrinterName[2] = 0; _tcscat( WizData.PrinterName, PrinterName ); }
InstallMode = INSTALL_NEW; PointPrintSetup = TRUE;
return TRUE; }
VOID SetThisPlatform( VOID ) { SYSTEM_INFO SystemInfo; GetSystemInfo( &SystemInfo ); if ((SystemInfo.wProcessorArchitecture > 3) || (EnumPlatforms[SystemInfo.wProcessorArchitecture] == WRONG_PLATFORM)) { return; }
Platforms[EnumPlatforms[SystemInfo.wProcessorArchitecture]].Selected = TRUE; }
LPHPROPSHEETPAGE WINAPI FaxWizGetServerPages( LPDWORD PageCount ) { SetThisPlatform(); RequestedSetupType = SETUP_TYPE_SERVER; SetTitlesInStringTable(); return CreateWizardPages( FaxWizModuleHandle, SetupWizardPages, ServerWizardPages, PageCount ); }
LPHPROPSHEETPAGE WINAPI FaxWizGetWorkstationPages( LPDWORD PageCount ) { SetThisPlatform(); RequestedSetupType = SETUP_TYPE_WORKSTATION; SetTitlesInStringTable(); return CreateWizardPages( FaxWizModuleHandle, SetupWizardPages, WorkstationWizardPages, PageCount ); }
LPHPROPSHEETPAGE WINAPI FaxWizGetClientPages( LPDWORD PageCount ) { SetThisPlatform(); RequestedSetupType = SETUP_TYPE_CLIENT; SetTitlesInStringTable(); return CreateWizardPages( FaxWizModuleHandle, SetupWizardPages, ClientWizardPages, PageCount ); }
LPHPROPSHEETPAGE WINAPI FaxWizGetPointPrintPages( LPDWORD PageCount ) { SetThisPlatform(); RequestedSetupType = SETUP_TYPE_POINT_PRINT; SetTitlesInStringTable(); return CreateWizardPages( FaxWizModuleHandle, SetupWizardPages, PointPrintWizardPages, PageCount ); }
LPHPROPSHEETPAGE WINAPI FaxWizRemoteAdminPages( LPDWORD PageCount ) { SetThisPlatform(); RequestedSetupType = SETUP_TYPE_REMOTE_ADMIN; SetTitlesInStringTable(); return CreateWizardPages( FaxWizModuleHandle, SetupWizardPages, RemoteAdminPages, PageCount ); }
PFNPROPSHEETCALLBACK WINAPI FaxWizGetPropertySheetCallback( VOID ) { return WizardCallback; }
DWORD DllRegisterServer( VOID ) { OSVERSIONINFO OsVersion; DWORD ProductType; PROPSHEETHEADER psh; LPHPROPSHEETPAGE WizardPageHandles; DWORD PageCount; DWORD Size; LPTSTR EnvVar; BOOL UseDefaults = TRUE; SYSTEM_INFO SystemInfo; BOOL NtGuiModeUpgrade = FALSE;
NtGuiMode = TRUE;
if (!FaxWizInit()) { return 0; }
ZeroMemory( &OsVersion, sizeof(OSVERSIONINFO) ); OsVersion.dwOSVersionInfoSize = sizeof (OSVERSIONINFO); GetVersionEx( &OsVersion );
ProductType = GetProductType(); if (ProductType == 0) { return 0; }
GetSystemInfo( &SystemInfo );
SetThisPlatform();
if (ProductType == PRODUCT_TYPE_WINNT) { RequestedSetupType = SETUP_TYPE_WORKSTATION; } else { RequestedSetupType = SETUP_TYPE_SERVER; }
InstallMode = INSTALL_NEW; Unattended = TRUE;
EnvVar = GetEnvVariable( TEXT("Upgrade") ); if (EnvVar) { if (_wcsicmp( EnvVar, L"True" ) == 0) { InstallMode = INSTALL_UPGRADE; NtGuiModeUpgrade = TRUE; } MemFree( EnvVar ); }
if (InstallMode == INSTALL_UPGRADE && Installed == FALSE) { InstallMode = INSTALL_NEW; }
EnvVar = GetEnvVariable( TEXT("UnattendFile") ); if (EnvVar) { if (UnAttendInitialize( EnvVar )) { UseDefaults = FALSE; } MemFree( EnvVar ); } else if(Win9xUpg()) { // t-briand: If we're upgrading from win9x, then we don't want to use the defaults.
// The unattend answer table will be set as a side effect of the call to Win9xUpg().
UseDefaults = FALSE; }
if (UseDefaults) {
UnattendAnswerTable[0].Answer.String = GetString( IDS_UAA_MODE ); UnattendAnswerTable[1].Answer.String = GetString( IDS_UAA_PRINTER_NAME ); UnattendAnswerTable[2].Answer.String = GetString( IDS_UAA_FAX_PHONE ); UnattendAnswerTable[3].Answer.Bool = FALSE; UnattendAnswerTable[4].Answer.String = GetString( IDS_UAA_DEST_PROFILENAME ); UnattendAnswerTable[5].Answer.Bool = FALSE; UnattendAnswerTable[6].Answer.String = GetString( IDS_UAA_ROUTE_PROFILENAME ); UnattendAnswerTable[8].Answer.Bool = FALSE; UnattendAnswerTable[9].Answer.String = GetString( IDS_UAA_DEST_PRINTERLIST ); UnattendAnswerTable[12].Answer.String = GetString( IDS_UAA_FAX_PHONE ); UnattendAnswerTable[14].Answer.Bool = TRUE; UnattendAnswerTable[15].Answer.String = GetString( IDS_UAA_SERVER_NAME ); UnattendAnswerTable[16].Answer.String = GetString( IDS_UAA_SENDER_NAME ); UnattendAnswerTable[17].Answer.String = GetString( IDS_UAA_SENDER_FAX_AREA_CODE ); UnattendAnswerTable[18].Answer.String = GetString( IDS_UAA_SENDER_FAX_NUMBER );
UnattendAnswerTable[7].Answer.String = StringDup( Platforms[EnumPlatforms[SystemInfo.wProcessorArchitecture]].OsPlatform );
UnattendAnswerTable[13].Answer.String = ExpandEnvironmentString( GetString( IDS_UAA_DEST_DIRPATH ) ); if (UnattendAnswerTable[13].Answer.String == NULL) { return 0; }
} else {
if (UnattendAnswerTable[10].Answer.String) { MemFree( UnattendAnswerTable[10].Answer.String ); }
if (UnattendAnswerTable[11].Answer.String) { MemFree( UnattendAnswerTable[11].Answer.String ); }
}
UnattendAnswerTable[10].Answer.String = NULL; UnattendAnswerTable[11].Answer.String = NULL;
SetTitlesInStringTable();
//
// setup the wizard pages & property sheet
//
if (RequestedSetupType == SETUP_TYPE_WORKSTATION) { WizardPageHandles = CreateWizardPages( FaxWizModuleHandle, SetupWizardPages, WorkstationWizardPages, &PageCount ); } else { WizardPageHandles = CreateWizardPages( FaxWizModuleHandle, SetupWizardPages, ServerWizardPages, &PageCount ); }
if (WizardPageHandles == NULL || PageCount == 0) { return 0; }
psh.dwSize = sizeof(PROPSHEETHEADER); psh.dwFlags = PSH_WIZARD; psh.hwndParent = NULL; psh.hInstance = FaxWizModuleHandle; psh.pszIcon = NULL; psh.pszCaption = EMPTY_STRING; psh.nPages = PageCount; psh.nStartPage = 0; psh.phpage = WizardPageHandles; psh.pfnCallback = NULL;
__try {
PropertySheet( &psh );
} __except (EXCEPTION_EXECUTE_HANDLER) {
Size = GetExceptionCode();
}
return 0; }
// Win9xUpg
//
// This routine is the hook for the Windows 9x upgrade process. It looks for
// the fax95upg.inf file in the %SystemRoot% directory. If it's there, it
// uses it to prime the unattend answers. If not, we're not upgrading from
// win9x and it does nothing.
//
// As I write this, I'm wondering why the separate INF file was necessary instead
// of the unattend file used by the rest of the migration process. Ah well.
//
// Parameters:
// None.
//
// Returns:
// TRUE if we're doing a Win9x upgrade; this implies that the unattend
// answers are properly set at the end of the function. Returns FALSE
// if not upgrading.
//
// Author:
// Brian Dewey (t-briand) 1997-8-15
BOOL Win9xUpg() { TCHAR szFaxInfPath[MAX_PATH]; // Holds the full path to the INF file.
TCHAR szFaxInfPathRes[MAX_PATH]; // Path template from resource file.
BOOL bReturn;
if(!LoadString(FaxWizModuleHandle, IDS_W95_INF_NAME, szFaxInfPathRes, sizeof(szFaxInfPathRes))) { // Unable to load resource. Use default name.
_tcscpy(szFaxInfPathRes, TEXT("%SystemRoot\\fax95upg.inf")); } ExpandEnvironmentStrings(szFaxInfPathRes, szFaxInfPath, sizeof(szFaxInfPath)); // Assume success. The failure will be caught in UnAttendInitialize when I
// give it a bogus filename.
bReturn = UnAttendInitialize(szFaxInfPath); return bReturn; }
|