/*++ Copyright (c) 1997 Microsoft Corporation Module Name: faxocm.cpp Abstract: This file implements the setup wizard code for the FAX server setup. Environment: WIN32 User Mode Author: Wesley Witt (wesw) 10-Sept-1997 --*/ #include "faxocm.h" #pragma hdrstop HINSTANCE hInstance; SETUP_INIT_COMPONENT SetupInitComponent; BOOL Unattended; BOOL Upgrade; // NT upgrade BOOL Win9xUpgrade; BOOL NtGuiMode; BOOL NtWorkstation; BOOL UnInstall; BOOL RemoteAdminSetup; BOOL RebootRequired; BOOL SuppressReboot; WORD EnumPlatforms[4]; BOOL PointPrintSetup; DWORD InstallThreadError; BOOL OkToCancel; DWORD CurrentCountryId; LPWSTR CurrentAreaCode; WCHAR ClientSetupServerName[MAX_PATH]; WCHAR ThisPlatformName[MAX_PATH]; DWORD InstalledPlatforms; DWORD InstallType; DWORD Installed; BOOL ComponentInitialized; WIZ_DATA WizData; LPWSTR SourcePath; PLATFORM_INFO Platforms[] = { { L"Windows NT x86", L"i386", 0, FAX_INSTALLED_PLATFORM_X86, NULL, FALSE }, { L"Windows NT Alpha_AXP", L"alpha", 0, FAX_INSTALLED_PLATFORM_ALPHA, NULL, FALSE }, }; DWORD CountPlatforms = (sizeof(Platforms)/sizeof(PLATFORM_INFO)); UNATTEND_ANSWER UnattendAnswer[] = { { L"FaxPrinterName", DT_STRING, 0, WizData.PrinterName }, { L"FaxNumber", DT_STRING, 0, WizData.PhoneNumber }, { L"RoutePrinterName", DT_STRING, 0, WizData.RoutePrinterName }, { L"RouteProfileName", DT_STRING, 0, WizData.RouteProfile }, { L"RouteFolderName", DT_STRING, 0, WizData.RouteDir }, { L"Csid", DT_STRING, 0, WizData.Csid }, { L"Tsid", DT_STRING, 0, WizData.Tsid }, { L"Rings", DT_LONGINT, 0, &WizData.Rings }, { L"RouteToPrinter", DT_BOOLEAN, LR_PRINT, &WizData.RoutingMask }, { L"RouteToInbox", DT_BOOLEAN, LR_INBOX, &WizData.RoutingMask }, { L"RouteToFolder", DT_BOOLEAN, LR_STORE, &WizData.RoutingMask }, { L"ArchiveOutgoing", DT_BOOLEAN, 0, &WizData.ArchiveOutgoing }, { L"ArchiveFolderName", DT_STRING, 0, WizData.ArchiveDir } }; #define CountUnattendAnswers (sizeof(UnattendAnswer)/sizeof(UNATTEND_ANSWER)) extern "C" INT FaxDebugLevel; extern "C" DWORD FaxOcmDllInit( HINSTANCE hInst, 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 --*/ { WCHAR DllName[MAX_PATH]; if (Reason == DLL_PROCESS_ATTACH) { hInstance = hInst; DisableThreadLibraryCalls( hInstance ); HeapInitialize( NULL, NULL, NULL, 0 ); if (!GetModuleFileName(hInstance, DllName, MAX_PATH) || !LoadLibrary(DllName)) { return FALSE; } DebugPrint(( TEXT("faxocm loaded") )); } if (Reason == DLL_PROCESS_DETACH) { HeapCleanup(); } return TRUE; } VOID SetProgress( DWORD StatusString ) { #ifdef NT5FAXINSTALL return; #else SetupInitComponent.HelperRoutines.SetProgressText( SetupInitComponent.HelperRoutines.OcManagerContext, GetString( StatusString ) ); for (DWORD i=0; i<10; i++) { SetupInitComponent.HelperRoutines.TickGauge( SetupInitComponent.HelperRoutines.OcManagerContext ); } #endif } BOOL SetWizData( VOID ) { HKEY hKey; LPWSTR RegisteredOwner = NULL; INFCONTEXT InfLine; WCHAR Id[128]; WCHAR Value[128]; DWORD i; HINF hInf; // // user name // hKey = OpenRegistryKey( HKEY_LOCAL_MACHINE, REGKEY_WINDOWSNT_CURRVER, TRUE, KEY_ALL_ACCESS ); RegisteredOwner = GetRegistryString( hKey, REGVAL_REGISTERED_OWNER, EMPTY_STRING ); RegCloseKey( hKey ); if (RegisteredOwner && RegisteredOwner[0]) { wcscpy( WizData.UserName, RegisteredOwner ); MemFree( RegisteredOwner ); } // // fax printer name // wcscpy( WizData.PrinterName, GetString( IDS_DEFAULT_PRINTER_NAME ) ); // // csid // wcscpy( WizData.Csid, GetString( IDS_DEFAULT_CSID ) ); // // tsid // wcscpy( WizData.Tsid, GetString( IDS_DEFAULT_TSID ) ); // // ring count // WizData.Rings = 2; // // routing mask // WizData.RoutingMask = LR_STORE; WizData.ArchiveOutgoing = TRUE; // // routing dir name // if (MyGetSpecialPath( CSIDL_COMMON_DOCUMENTS, WizData.RouteDir)) { ConcatenatePaths( WizData.RouteDir, GetString(IDS_RECEIVE_DIR) ); } // // archive dir name // if (MyGetSpecialPath( CSIDL_COMMON_DOCUMENTS, WizData.ArchiveDir)) { ConcatenatePaths( WizData.ArchiveDir, GetString(IDS_ARCHIVE_DIR) ); } // // process any unattend data // if (Unattended) { hInf = SetupInitComponent.HelperRoutines.GetInfHandle( INFINDEX_UNATTENDED, SetupInitComponent.HelperRoutines.OcManagerContext ); if (hInf == INVALID_HANDLE_VALUE) { return FALSE; } if (SetupFindFirstLine( hInf, L"Fax", NULL, &InfLine )) { DebugPrint((L"Processing fax unattend data")); do { SetupGetStringField( &InfLine, 0, Id, sizeof(Id)/sizeof(WCHAR), NULL ); for (i=0; iOCManagerVersion) { ((PSETUP_INIT_COMPONENT)Param2)->ComponentVersion = OCMANAGER_VERSION; } else { return ERROR_CALL_NOT_IMPLEMENTED; } if (SetupInitComponent.SetupData.OperationFlags & SETUPOP_STANDALONE) { return 0; } // // eventhough this call happens once for each component that this // dll installs, we really only need to do our thing once. this is // because the data that ocm passes is really the same for all calls. // if (!ComponentInitialized) { CopyMemory( &SetupInitComponent, (LPVOID)Param2, sizeof(SETUP_INIT_COMPONENT) ); Unattended = (SetupInitComponent.SetupData.OperationFlags & SETUPOP_BATCH) > 0; Upgrade = (SetupInitComponent.SetupData.OperationFlags & SETUPOP_NTUPGRADE) > 0; Win9xUpgrade = (SetupInitComponent.SetupData.OperationFlags & SETUPOP_WIN95UPGRADE) > 0; NtGuiMode = (SetupInitComponent.SetupData.OperationFlags & SETUPOP_STANDALONE) == 0; NtWorkstation = SetupInitComponent.SetupData.ProductType == PRODUCT_WORKSTATION; SourcePath = (LPWSTR) MemAlloc( StringSize(SetupInitComponent.SetupData.SourcePath) + MAX_PATH ); if (!SourcePath) { return ERROR_NOT_ENOUGH_MEMORY; } wcscpy( SourcePath, SetupInitComponent.SetupData.SourcePath ); if (SourcePath[wcslen(SourcePath)-1] != L'\\') { wcscat( SourcePath, L"\\" ); } if (NtGuiMode) { #ifdef _X86_ wcscat( SourcePath, L"i386" ); #endif #ifdef _ALPHA_ wcscat( SourcePath, L"alpha" ); #endif } else { SourcePath = VerifyInstallPath(SourcePath); DebugPrint(( TEXT("faxocm Sourcepath = %s\n"),SourcePath)); } DebugPrint((L"faxocm - SourcePath = %s", SourcePath)); if (NtGuiMode) { Unattended = TRUE; } // // make sure our inf file is opened by sysoc correctly // if it isn't then try to open it ourself // if (SetupInitComponent.ComponentInfHandle == NULL) { WCHAR InfPath[MAX_PATH]; LPWSTR p; GetModuleFileName( hInstance, InfPath, sizeof(InfPath)/sizeof(WCHAR) ); p = wcsrchr( InfPath, L'\\' ); if (p) { wcscpy( p+1, L"faxsetup.inf" ); SetupInitComponent.ComponentInfHandle = SetupOpenInfFile( InfPath, NULL, INF_STYLE_WIN4, NULL ); if (SetupInitComponent.ComponentInfHandle == INVALID_HANDLE_VALUE) { return ERROR_FILE_NOT_FOUND; } } else { return ERROR_FILE_NOT_FOUND; } } SetupOpenAppendInfFile( NULL, SetupInitComponent.ComponentInfHandle, NULL ); InitializeStringTable(); // // do minimal mapi initialization for NtGuiMode setup // MyInitializeMapi(NtGuiMode); GetInstallationInfo( &Installed, &InstallType, &InstalledPlatforms ); if (NtGuiMode && (IsNt4or351Upgrade() || Win9xUpgrade)) { // // in this case, we should treat this as a fresh install of fax // Upgrade = FALSE; } if (!NtGuiMode) { Upgrade = Installed; } EnumPlatforms[PROCESSOR_ARCHITECTURE_INTEL] = 0; EnumPlatforms[PROCESSOR_ARCHITECTURE_ALPHA] = 1; ComponentInitialized = TRUE; SYSTEM_INFO si; GetSystemInfo( &si ); if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_INTEL) { SetEnvironmentVariable( L"platform", L"i386" ); } else if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_ALPHA) { SetEnvironmentVariable( L"platform", L"alpha" ); } SetWizData(); } return 0; case OC_QUERY_CHANGE_SEL_STATE: if (NtGuiMode || (!Installed) || UnInstall) { return 0; } UnInstall = Param1 == 0; return 1; case OC_REQUEST_PAGES: { PSETUP_REQUEST_PAGES SetupRequestPages = (PSETUP_REQUEST_PAGES) Param2; if (NtGuiMode) { // // never return pages during gui-mode setup // return 0; } if (_wcsicmp( ComponentId, COMPONENT_FAX ) != 0) { return 0; } if (Param1 == WizPagesWelcome) { #ifdef NT5FAXINSTALL return 0; #else SetupRequestPages->Pages[0] = GetWelcomeWizardPage(); return 1; #endif } if (Param1 == WizPagesMode) { #ifdef NT5FAXINSTALL return 0; #else SetupRequestPages->Pages[0] = GetEulaWizardPage(); return 1; #endif } if (Param1 == WizPagesFinal) { #ifdef NT5FAXINSTALL return 0; #else SetupRequestPages->Pages[0] = GetFinalWizardPage(); return 1; #endif } } break; case OC_CALC_DISK_SPACE: if (NtGuiMode && !Upgrade) { CalcServerDiskSpace( SetupInitComponent.ComponentInfHandle, (HDSKSPC) Param2, NULL, Param1 ); } break; case OC_QUEUE_FILE_OPS: if (!SubcomponentId || !*SubcomponentId) { return 0; } if (NtGuiMode && !Upgrade) { AddServerFilesToQueue( SetupInitComponent.ComponentInfHandle, (HSPFILEQ) Param2, NULL ); } break; case OC_COMPLETE_INSTALLATION: if (!SubcomponentId || !*SubcomponentId) { return 0; } if (NtGuiMode) { ServerInstallation( SetupInitComponent.HelperRoutines.QueryWizardDialogHandle( SetupInitComponent.HelperRoutines.OcManagerContext ), SourcePath ); } break; case OC_QUERY_STEP_COUNT: if (!SubcomponentId || !*SubcomponentId) { return 0; } return ServerGetStepCount() * 10; case OC_CLEANUP: break; default: break; } return 0; }