#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef WX86 #include #endif #include "winfax.h" #include "resource.h" #define NO_FAX_LIST #include "faxutil.h" #include "faxreg.h" // // fax ocm component names // // WARNING: if you change these strings, you must // also change the strings in the setup inf files // #define COMPONENT_FAX L"Fax" #define COMPONENT_FAX_CLIENT L"Fax_Client" #define COMPONENT_FAX_ADMIN L"Fax_Remote_Admin" #define DEFAULT_FAX_STORE_DIR L"%systemroot%\\FaxStore" #define FAX_SERVICE_NAME L"Fax" #define FAX_PRINTER_NAME L"Fax" #define OUTLOOKCONFIG_DIR L"addins" #define FAX_DRIVER_NAME L"Windows NT Fax Driver" #define FAX_MONITOR_NAME L"Windows NT Fax Monitor" #define FAX_MONITOR_FILE L"msfaxmon.dll" // #define FAX_SERVICE_DISPLAY_NAME L"Fax Service" #define FAX_SERVICE_IMAGE_NAME L"%systemroot%\\system32\\faxsvc.exe" #define FAX_SERVICE_DEPENDENCY L"TapiSrv\0RpcSs\0PlugPlay\0Spooler\0" #define WINNT_CURVER L"Software\\Microsoft\\Windows NT\\CurrentVersion" #define DIGID L"DigitalProductId" #define REGKEY_PROFILES L"\\ProfileList" #define REGVAL_PROFILES L"ProfilesDirectory" #define FAXAB_SERVICE_NAME L"MSFAX AB" #define FAXXP_SERVICE_NAME L"MSFAX XP" #undef StringSize #define StringSize(_s) (( _s ) ? (wcslen( _s ) + 1) * sizeof(WCHAR) : 0) #define SecToNano(_sec) (DWORDLONG)((_sec) * 1000 * 1000 * 10) #define MinToNano(_min) SecToNano((_min)*60) #define COVERPAGE_EDITOR L"%systemroot%\\system32\\faxcover.exe" #define DEFAULT_FAX_PROFILE L"" #define COVERPAGE_EXTENSION L".cov" #define COVERPAGE_ASSOC_NAME L"Coverpage" #define COVERPAGE_ASSOC_DESC L"Fax Coverpage File" #define COVERPAGE_OPEN_COMMAND L"%SystemRoot%\\system32\\faxcover.exe \"%1\"" #define COVERPAGE_PRINT_COMMAND L"%SystemRoot%\\system32\\faxcover.exe /p \"%1\"" #define EXCHANGE_CLIENT_EXT_NAME "FaxExtension" #define EXCHANGE_CLIENT_EXT_NAMEW L"FaxExtension" #define EXCHANGE_CLIENT_EXT_FILE "%windir%\\system32\\faxext32.dll" #define EXCHANGE_CONTEXT_MASK "00000100000000" #define DIRID_COVERPAGE 66001 #define DIRID_CLIENTS 66002 #define DIRID_OUTLOOK_ECF 66003 #define FILEQ_FLAG_ENV 1 #define FILEQ_FLAG_SHELL 2 #define SETUP_ACTION_NONE 0 #define SETUP_ACTION_COPY 1 #define SETUP_ACTION_DELETE 2 // // BugBug... If the CLSID global REGKEY_MYCLSID changes in fax\shellext, then this must also change // #define FAXSHELL_CLSID L"{7f9609be-af9a-11d1-83e0-00c04fb6e984}" #define EMPTY_STRING L"" typedef struct _WIZ_DATA { DWORD RoutingMask; DWORD Rings; DWORD ArchiveOutgoing; WCHAR Csid[128]; WCHAR Tsid[128]; WCHAR RoutePrinterName[128]; WCHAR RouteDir[MAX_PATH]; WCHAR RouteProfile[128]; WCHAR UserName[128]; WCHAR PhoneNumber[128]; WCHAR PrinterName[128]; WCHAR ArchiveDir[MAX_PATH]; } WIZ_DATA, *PWIZ_DATA; typedef struct _LINE_INFO { DWORD PermanentLineID; BOOL Selected; LPWSTR DeviceName; LPWSTR ProviderName; DWORD Rings; DWORD Flags; } LINE_INFO, *PLINE_INFO; typedef struct _SECURITY_INFO { WCHAR AccountName[256]; WCHAR Password[256]; } SECURITY_INFO, *PSECURITY_INFO; typedef struct _PLATFORM_INFO { LPWSTR PrintPlatform; LPWSTR OsPlatform; BOOL Selected; DWORD Mask; LPWSTR DriverDir; BOOL ThisPlatform; } PLATFORM_INFO, *PPLATFORM_INFO; typedef struct _WIZPAGE { DWORD ButtonState; DWORD PageId; DWORD DlgId; DLGPROC DlgProc; DWORD Title; DWORD SubTitle; } WIZPAGE, *PWIZPAGE; typedef struct _FILE_QUEUE_INFO { LPWSTR SectionName; DWORD InfDirId; LPWSTR DirName; DWORD Flags; DWORD ShellId; } FILE_QUEUE_INFO, *PFILE_QUEUE_INFO; typedef struct _FILE_QUEUE_CONTEXT { HWND hwnd; PVOID QueueContext; } FILE_QUEUE_CONTEXT, *PFILE_QUEUE_CONTEXT; // // group flags // #define USE_COMMON_GROUP 0x00000001 // do not use USE_USER_GROUP and USE_COMMON_GROUP #define USE_USER_GROUP 0x00000002 // together, they are mutually exclusive #define USE_APP_PATH 0x00000004 // commandline must contain the subkey name #define USE_SERVER_NAME 0x00000008 // if we're doing a client install the append the server name to the command line #define USE_SHELL_PATH 0x00000010 // use CSIDL_COMMON_APPPATH in front of exe path #define USE_SUBDIR 0x00000020 // create a subdir, don't set the working directory typedef struct GROUP_ITEM { DWORD ResourceID; TCHAR Name[MAX_PATH]; } GROUP_ITEM, *PGROUPITEM; typedef struct _GROUP_ITEMS { GROUP_ITEM GroupName; GROUP_ITEM Description; GROUP_ITEM CommandLine; GROUP_ITEM IconPath; GROUP_ITEM WorkingDirectory; DWORD Flags; INT IconIndex; INT ShowCmd; WORD HotKey; GROUP_ITEM InfoTip; } GROUP_ITEMS, *PGROUP_ITEMS; typedef struct _MDM_DEVSPEC { DWORD Contents; // Set to 1 (indicates containing key) DWORD KeyOffset; // Offset to key from start of this struct. // (not from start of LINEDEVCAPS ). // 8 in our case. CHAR String[1]; // place containing null-terminated registry key. } MDM_DEVSPEC, *PMDM_DEVSPEC; typedef struct { HANDLE hComm; CHAR szDeviceName[1]; } DEVICEID, *PDEVICEID; typedef enum _DATAYPE { DT_STRING, DT_LONGINT, DT_BOOLEAN, DT_NONE, } DATATYPE; typedef struct _UNATTEND_ANSWER { LPWSTR KeyName; DATATYPE DataType; DWORD UseMaskOnBool; LPVOID DataPtr; } UNATTEND_ANSWER, *PUNATTEND_ANSWER; extern HINSTANCE hInstance; extern SETUP_INIT_COMPONENT SetupInitComponent; extern BOOL Unattended; extern BOOL Upgrade; extern BOOL NtGuiMode; extern BOOL NtWorkstation; extern DWORD FaxDevices; extern BOOL UnInstall; extern PLINE_INFO LineInfo; extern "C" BOOL MapiAvail; extern WORD EnumPlatforms[4]; extern DWORD InstalledPlatforms; extern DWORD CountPlatforms; extern PLATFORM_INFO Platforms[]; extern BOOL RemoteAdminSetup; extern BOOL RebootRequired; extern BOOL SuppressReboot; extern BOOL PointPrintSetup; extern DWORD InstallThreadError; extern BOOL OkToCancel; extern WCHAR ClientSetupServerName[MAX_PATH]; extern WCHAR ThisPlatformName[MAX_PATH]; extern DWORD CurrentCountryId; extern LPWSTR CurrentAreaCode; extern DWORD InstallType; extern DWORD Installed; extern WIZ_DATA WizData; #define WM_MY_PROGRESS (WM_USER+100) LPWSTR GetString( DWORD ResourceId ); BOOL StopFaxService( VOID ); DWORD DeviceInitialization( HWND hwnd ); BOOL SetWizData( VOID ); INT_PTR SecurityErrorDlgProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam ); INT_PTR CommonDlgProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam ); INT_PTR DeviceStatusDlgProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam ); INT_PTR WelcomeDlgProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam ); INT_PTR FinalDlgProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam ); INT_PTR EulaDlgProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam ); INT_PTR PlatformsDlgProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam ); INT_PTR FileCopyDlgProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam ); INT_PTR LastPageDlgProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam ); INT_PTR LastPageUninstallDlgProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam ); INT_PTR ServerNameDlgProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam ); INT_PTR StationIdDlgProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam ); INT_PTR RoutePrintDlgProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam ); INT_PTR RouteStoreDlgProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam ); INT_PTR RouteMailDlgProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam ); INT_PTR RouteSecurityDlgProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam ); INT_PTR ClientServerNameDlgProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam ); INT_PTR ClientUserInfoDlgProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam ); INT_PTR ClientFileCopyDlgProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam ); INT_PTR PrinterNameDlgProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam ); INT_PTR RemoteAdminFileCopyDlgProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam ); INT_PTR DeviceSelectionDlgProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam ); INT_PTR ExchangeDlgProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam ); INT_PTR LastClientPageDlgProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam ); PVOID MyEnumPrinters( LPWSTR pServerName, DWORD level, PDWORD pcPrinters, DWORD Flags ); BOOL IsPrinterFaxPrinter( LPWSTR PrinterName ); int PopUpMsg( HWND hwnd, DWORD ResourceId, BOOL Error, DWORD Type ); BOOL UnAttendGetAnswer( DWORD ControlId, LPBYTE AnswerBuf, DWORD AnswerBufSize ); extern"C" BOOL GetMapiProfiles( HWND hwnd, DWORD ResourceId ); extern"C" BOOL GetDefaultMapiProfile( LPWSTR ProfileName ); DWORD DoUninstall( VOID ); DWORD ServerInstallation( HWND hwnd, LPWSTR SourceRoot ); BOOL DoBrowseDestDir( HWND hDlg ); BOOL GetUserInformation( LPWSTR *UserName, LPWSTR *FaxNumber, LPWSTR *AreaCode ); DWORD ClientFileCopyThread( HWND hwnd ); DWORD PointPrintFileCopyThread( HWND hwnd ); DWORD RemoteAdminCopyThread( HWND hwnd ); VOID SetWizPageTitle( HWND hWnd ); DWORD GetModemClass( HANDLE hFile ); BOOL CreateServerFaxPrinter( HWND hwnd, LPWSTR FaxPrinterName ); DWORD StartFaxService( VOID ); VOID CreateGroupItems( LPWSTR ServerName ); VOID DeleteNt4Group( VOID ); // // fileq.c // BOOL InitializeFileQueue( HWND hwnd, HINF *SetupInf, HSPFILEQ **FileQueue, PVOID *QueueContext, LPWSTR SourceRoot ); BOOL ProcessFileQueue( HINF SetupInf, HSPFILEQ *FileQueue, PVOID QueueContext, LPWSTR SourceRoot, PFILE_QUEUE_INFO FileQueueInfo, DWORD CountFileQueueInfo, PSP_FILE_CALLBACK MyQueueCallback, DWORD ActionId ); BOOL CloseFileQueue( HSPFILEQ *FileQueue, PVOID QueueContext ); UINT InstallQueueCallback( IN PVOID QueueContext, IN UINT Notification, IN UINT Param1, IN UINT Param2 ); VOID SetProgress( DWORD StatusString ); BOOL SetClientRegistryData( VOID ); BOOL SetInstalledFlag( BOOL Installed ); BOOL SetInstallType( DWORD InstallType ); DWORD CreateClientFaxPrinter( HWND hwnd, LPWSTR FaxPrinterName ); BOOL InstallHelpFiles( VOID ); VOID DoExchangeInstall( HWND hwnd ); LPWSTR RemoveLastNode( LPWSTR Path ); BOOL PlatformOverride( LPWSTR ThisPlatformName, LPWSTR Override, LPWSTR SourceRoot, LPWSTR Result ); BOOL StartSpoolerService( VOID ); BOOL MyDeleteFile( LPWSTR FileName ); int PopUpMsgFmt( HWND hwnd, DWORD ResourceId, BOOL Error, DWORD Type, ... ); LPWSTR GetProductName( VOID ); DWORD ExtraChars( HWND hwnd, LPWSTR TextBuffer ); LPWSTR CompactFileName( LPCTSTR FileNameIn, DWORD CharsToRemove ); DWORD MyStartService( LPWSTR ServiceName ); BOOL SetServerRegistryData( LPWSTR SourceRoot ); BOOL SetSoundRegistryData( VOID ); VOID DeleteModemRegistryKey( VOID ); BOOL SetInstalledPlatforms( DWORD PlatformsMask ); BOOL InstallFaxService( BOOL UseLocalSystem, BOOL DemandStart, LPWSTR AccountName, LPWSTR Password ); BOOL RenameFaxService( VOID ); BOOL SetServiceAccount( LPWSTR ServiceName, PSECURITY_INFO SecurityInfo ); BOOL DeleteFaxService( VOID ); BOOL AddPrinterDrivers( VOID ); BOOL CreateNetworkShare( LPWSTR Path, LPWSTR ShareName, LPWSTR Comment ); DWORD SetServiceSecurity( LPWSTR AccountName ); BOOL CallModemInstallWizard( HWND hwnd ); BOOL DeleteFaxPrinters( HWND hwnd ); BOOL DeleteDirectoryTree( LPWSTR Root ); BOOL DeleteFaxRegistryData( VOID ); BOOL DeleteRegistryTree( HKEY hKey, LPWSTR SubKey ); BOOL MyDeleteService( LPWSTR ServiceName ); VOID DeleteGroupItems( VOID ); extern "C" BOOL DeleteFaxMsgServices( VOID ); BOOL DeleteNetworkShare( LPWSTR ShareName ); extern "C" VOID AddFaxAbToMapiSvcInf( LPWSTR SystemPath ); extern "C" VOID AddFaxXpToMapiSvcInf( LPWSTR SystemPath ); extern "C" BOOL InstallExchangeClientExtension( LPSTR ExtensionName, LPSTR ExtensionKey, LPSTR FileName, LPSTR ContextMask ); extern "C" BOOL GetExchangeInstallCommand( LPWSTR InstallCommand ); extern "C" BOOL CreateDefaultMapiProfile( LPWSTR ProfileName ); extern "C" BOOL InstallFaxAddressBook( HWND hwnd, LPWSTR ProfileName ); extern "C" BOOL InstallFaxTransport( LPWSTR ProfileNameW ); extern "C" BOOL IsMapiServiceInstalled( LPWSTR ProfileNameW, LPWSTR ServiceNameW ); extern "C" DWORD IsExchangeRunning( VOID ); extern "C" BOOL InitializeMapi( BOOL MinimalInit ); BOOL MyInitializeMapi( BOOL MinimalInit ); VOID InitializeStringTable( VOID ); BOOL GetInstallationInfo( LPDWORD Installed, LPDWORD InstallType, LPDWORD InstalledPlatforms ); HPROPSHEETPAGE GetWelcomeWizardPage( VOID ); HPROPSHEETPAGE GetEulaWizardPage( VOID ); HPROPSHEETPAGE GetFinalWizardPage( VOID ); VOID CenterWindow( HWND hwnd, HWND hwndToCenterOver ); BOOL AddServerFilesToQueue( HINF SetupInf, HSPFILEQ FileQueue, LPWSTR SourceRoot ); BOOL CalcServerDiskSpace( HINF SetupInf, HDSKSPC DiskSpace, LPWSTR SourceRoot, BOOL AddToQueue ); BOOL CreateLocalFaxPrinter( LPWSTR FaxPrinterName ); BOOL RecreateNt5Beta3FaxPrinters( VOID ); BOOL RecreateNt4FaxPrinters( VOID ); DWORD ServerGetStepCount( VOID ); BOOL RegisterOleControlDlls( HINF hInf ); BOOL SetServiceWorldAccessMask( SC_HANDLE hService, DWORD AccessMask ); BOOL SetKeySecurity( HKEY hKey ); LPWSTR VerifyInstallPath( LPWSTR SourcePath ); BOOL SetFaxShellExtension( LPCWSTR Path ); BOOL IsNt4or351Upgrade( VOID ); BOOL MyGetSpecialPath( INT Id, LPWSTR Buffer ); BOOL SuperHideDirectory( PWSTR Directory );