376 lines
11 KiB
C++
376 lines
11 KiB
C++
|
/*++
|
||
|
|
||
|
Copyright (c) 1996 Microsoft Corporation
|
||
|
|
||
|
Module Name:
|
||
|
|
||
|
server.c
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
This file implements the server file copy code.
|
||
|
|
||
|
Environment:
|
||
|
|
||
|
WIN32 User Mode
|
||
|
|
||
|
Author:
|
||
|
|
||
|
Wesley Witt (wesw) 17-Feb-1996
|
||
|
|
||
|
--*/
|
||
|
|
||
|
#include "faxocm.h"
|
||
|
#pragma hdrstop
|
||
|
|
||
|
|
||
|
|
||
|
DWORD
|
||
|
ServerGetStepCount(
|
||
|
VOID
|
||
|
)
|
||
|
{
|
||
|
#ifdef NT5FAXINSTALL
|
||
|
return 0;
|
||
|
#else
|
||
|
return 5;
|
||
|
#endif
|
||
|
}
|
||
|
|
||
|
|
||
|
DWORD
|
||
|
ServerInstallation(
|
||
|
HWND hwnd,
|
||
|
LPWSTR SourceRoot
|
||
|
)
|
||
|
{
|
||
|
DWORD ErrorCode = 0;
|
||
|
DWORD OldInstallType;
|
||
|
WCHAR FileName[256];
|
||
|
BOOL CompleteInstall = FALSE;
|
||
|
WCHAR FaxCommonPath[MAX_PATH+1];
|
||
|
LPTSTR pCommonPath;
|
||
|
WCHAR CommonChar;
|
||
|
DWORD attrib;
|
||
|
HKEY hKey;
|
||
|
|
||
|
#define MakeSpecialDirectory(_DIR,_HIDE) *pCommonPath = CommonChar;\
|
||
|
*(pCommonPath+1) = (WCHAR) 0;\
|
||
|
ConcatenatePaths( FaxCommonPath, _DIR ) ;\
|
||
|
MakeDirectory( FaxCommonPath );\
|
||
|
if (_HIDE) HideDirectory(FaxCommonPath);\
|
||
|
|
||
|
DeviceInitialization( hwnd );
|
||
|
|
||
|
if (NtGuiMode) {
|
||
|
DebugPrint(( TEXT("faxocm - starting lanmanserver") ));
|
||
|
MyStartService( L"LanmanServer" );
|
||
|
if (FaxDevices > 0) {
|
||
|
CompleteInstall = TRUE;
|
||
|
}
|
||
|
} else {
|
||
|
CompleteInstall = TRUE;
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// delete the fax modem inf
|
||
|
//
|
||
|
|
||
|
ExpandEnvironmentStrings( L"%systemroot%\\awmodem.inf", FileName, sizeof(FileName)/sizeof(WCHAR) );
|
||
|
MyDeleteFile( FileName );
|
||
|
|
||
|
DebugPrint(( TEXT("faxocm - setting registry") ));
|
||
|
|
||
|
//
|
||
|
// set the registry data
|
||
|
//
|
||
|
|
||
|
//
|
||
|
// hack: during NT GUI-mode setup, we need to retrieve the user's name twice because
|
||
|
// the name is entered by the user after we've retreived the data (so we get a bogus name if we don't do this!)
|
||
|
//
|
||
|
if (NtGuiMode) {
|
||
|
HKEY hKey;
|
||
|
LPWSTR RegisteredOwner;
|
||
|
|
||
|
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 );
|
||
|
}
|
||
|
}
|
||
|
SetProgress( IDS_SETTING_REGISTRY );
|
||
|
|
||
|
if (!SetServerRegistryData( SourceRoot )) {
|
||
|
DebugPrint(( L"SetServerRegistryData() failed" ));
|
||
|
ErrorCode = IDS_COULD_SET_REG_DATA;
|
||
|
goto error_exit;
|
||
|
}
|
||
|
|
||
|
if (!SetClientRegistryData()) {
|
||
|
DebugPrint(( L"SetClientRegistryData() failed" ));
|
||
|
ErrorCode = IDS_COULD_SET_REG_DATA;
|
||
|
goto error_exit;
|
||
|
}
|
||
|
|
||
|
SetSoundRegistryData();
|
||
|
|
||
|
DeleteModemRegistryKey();
|
||
|
|
||
|
//
|
||
|
// set all of the install flags in the registry
|
||
|
// this must be done before the fax service is
|
||
|
// started so it can query the values
|
||
|
//
|
||
|
|
||
|
OldInstallType = InstallType;
|
||
|
|
||
|
SetInstalledFlag( TRUE );
|
||
|
SetInstallType( NtWorkstation ? FAX_INSTALL_WORKSTATION : FAX_INSTALL_SERVER );
|
||
|
SetInstalledPlatforms( 0 );
|
||
|
|
||
|
//
|
||
|
// install the fax service
|
||
|
//
|
||
|
|
||
|
SetProgress( IDS_INSTALLING_FAXSVC );
|
||
|
|
||
|
if (!Upgrade) {
|
||
|
if (!InstallFaxService( TRUE, TRUE, NULL, NULL )) {
|
||
|
DebugPrint(( L"InstallFaxService() failed" ));
|
||
|
ErrorCode = GetLastError();
|
||
|
goto error_exit;
|
||
|
}
|
||
|
} else {
|
||
|
RenameFaxService();
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// do the exchange stuff
|
||
|
//
|
||
|
SetProgress( IDS_INSTALLING_EXCHANGE );
|
||
|
DoExchangeInstall( hwnd );
|
||
|
|
||
|
//
|
||
|
// create the printer
|
||
|
//
|
||
|
|
||
|
SetProgress( IDS_CREATING_FAXPRT );
|
||
|
|
||
|
if (!Upgrade) {
|
||
|
if (CompleteInstall) {
|
||
|
DebugPrint(( TEXT("faxocm - creating fax printer") ));
|
||
|
|
||
|
if (!CreateLocalFaxPrinter( WizData.PrinterName )) {
|
||
|
DebugPrint(( L"CreateLocalFaxPrinter() failed" ));
|
||
|
if (!NtGuiMode) {
|
||
|
StopFaxService();
|
||
|
DeleteFaxService();
|
||
|
SetInstalledFlag( FALSE );
|
||
|
ErrorCode = IDS_COULD_NOT_CREATE_PRINTER;
|
||
|
goto error_exit;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
} else {
|
||
|
if (NtGuiMode) {
|
||
|
DeleteRegistryTree( HKEY_LOCAL_MACHINE, REGKEY_FAX_SECURITY );
|
||
|
RecreateNt4FaxPrinters();
|
||
|
RecreateNt5Beta3FaxPrinters();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// create the program group and it's items
|
||
|
//
|
||
|
|
||
|
DebugPrint(( TEXT("faxocm - creating program groups") ));
|
||
|
|
||
|
SetProgress( IDS_CREATING_GROUPS );
|
||
|
|
||
|
if (CompleteInstall) {
|
||
|
//
|
||
|
// safe to do this in an upgrade, since it's a noop if it's already there
|
||
|
//
|
||
|
CreateGroupItems( NULL );
|
||
|
//
|
||
|
// should be safe to do this in all cases since it will be a noop if it's not there
|
||
|
//
|
||
|
DeleteNt4Group();
|
||
|
}
|
||
|
|
||
|
if (NtGuiMode && (CompleteInstall == FALSE) ) {
|
||
|
//
|
||
|
// rename fax.cpl, so that it doesn't show up in the control panel
|
||
|
//
|
||
|
LPTSTR srcFile = ExpandEnvironmentString( TEXT("%systemroot%\\system32\\fax.cpl") );
|
||
|
LPTSTR dstFile = ExpandEnvironmentString( TEXT("%systemroot%\\system32\\fax.cpk") );
|
||
|
|
||
|
if (!MoveFileEx(srcFile, dstFile, MOVEFILE_REPLACE_EXISTING)) {
|
||
|
MoveFileEx(srcFile, dstFile, MOVEFILE_REPLACE_EXISTING | MOVEFILE_DELAY_UNTIL_REBOOT);
|
||
|
}
|
||
|
|
||
|
MemFree( srcFile );
|
||
|
MemFree( dstFile );
|
||
|
}
|
||
|
|
||
|
|
||
|
DebugPrint(( TEXT("faxocm - creating directories") ));
|
||
|
|
||
|
//
|
||
|
// share amd create the windows fax directory
|
||
|
//
|
||
|
|
||
|
if (!Upgrade) {
|
||
|
|
||
|
if (WizData.ArchiveOutgoing) {
|
||
|
if (*WizData.ArchiveDir) {
|
||
|
//
|
||
|
// specified in unattend
|
||
|
//
|
||
|
MakeDirectory( WizData.ArchiveDir );
|
||
|
} else {
|
||
|
|
||
|
if (!MyGetSpecialPath( CSIDL_COMMON_DOCUMENTS, FaxCommonPath ) ) {
|
||
|
DebugPrint(( TEXT("Couldn't MyGetSpecialPath, ec = %d\n"), GetLastError() ));
|
||
|
ErrorCode = IDS_COULD_NOT_SET_APP_PATH;
|
||
|
goto error_exit;
|
||
|
}
|
||
|
|
||
|
ConcatenatePaths( FaxCommonPath, GetString(IDS_ARCHIVE_DIR) ) ;
|
||
|
MakeDirectory( FaxCommonPath );
|
||
|
wcscpy( WizData.ArchiveDir, FaxCommonPath);
|
||
|
}
|
||
|
|
||
|
//SetFaxShellExtension( WizData.ArchiveDir );
|
||
|
}
|
||
|
|
||
|
if (WizData.RoutingMask & LR_STORE) {
|
||
|
if (*WizData.RouteDir) {
|
||
|
//
|
||
|
// specified in unattend
|
||
|
//
|
||
|
MakeDirectory(WizData.RouteDir);
|
||
|
} else {
|
||
|
if (!MyGetSpecialPath( CSIDL_COMMON_DOCUMENTS, FaxCommonPath ) ) {
|
||
|
DebugPrint(( TEXT("Couldn't MyGetSpecialPath, ec = %d\n"), GetLastError() ));
|
||
|
ErrorCode = IDS_COULD_NOT_SET_APP_PATH;
|
||
|
goto error_exit;
|
||
|
}
|
||
|
|
||
|
ConcatenatePaths( FaxCommonPath, GetString(IDS_RECEIVE_DIR) ) ;
|
||
|
MakeDirectory( FaxCommonPath );
|
||
|
wcscpy( WizData.RouteDir, FaxCommonPath);
|
||
|
}
|
||
|
|
||
|
//SetFaxShellExtension( WizData.RouteDir );
|
||
|
}
|
||
|
|
||
|
if (!MyGetSpecialPath( CSIDL_COMMON_DOCUMENTS, FaxCommonPath ) ) {
|
||
|
DebugPrint(( TEXT("Couldn't MyGetSpecialPath, ec = %d\n"), GetLastError() ));
|
||
|
ErrorCode = IDS_COULD_NOT_SET_APP_PATH;
|
||
|
goto error_exit;
|
||
|
}
|
||
|
|
||
|
ConcatenatePaths( FaxCommonPath, GetString(IDS_COVERPAGE_DIR) ) ;
|
||
|
if (IsProductSuite()) {
|
||
|
CreateNetworkShare( FaxCommonPath, TEXT("COVERPG$"), EMPTY_STRING );
|
||
|
}
|
||
|
pCommonPath = wcsrchr( FaxCommonPath, L'\\' );
|
||
|
if (pCommonPath) {
|
||
|
*pCommonPath = (WCHAR)0;
|
||
|
}
|
||
|
|
||
|
SuperHideDirectory(FaxCommonPath);
|
||
|
|
||
|
if (!MyGetSpecialPath( CSIDL_COMMON_APPDATA, FaxCommonPath ) ) {
|
||
|
DebugPrint(( TEXT("Couldn't MyGetSpecialPath, ec = %d\n"), GetLastError() ));
|
||
|
ErrorCode = IDS_COULD_NOT_SET_APP_PATH;
|
||
|
goto error_exit;
|
||
|
}
|
||
|
|
||
|
pCommonPath = &FaxCommonPath[wcslen(FaxCommonPath) -1];
|
||
|
CommonChar = FaxCommonPath[wcslen(FaxCommonPath) -1];
|
||
|
|
||
|
ConcatenatePaths( FaxCommonPath, FAX_DIR ) ;
|
||
|
MakeDirectory( FaxCommonPath );
|
||
|
|
||
|
MakeSpecialDirectory( FAX_RECEIVE_DIR, TRUE );
|
||
|
MakeSpecialDirectory( FAX_QUEUE_DIR, TRUE );
|
||
|
|
||
|
if (IsProductSuite()) {
|
||
|
MakeSpecialDirectory( FAX_CLIENT_DIR, TRUE );
|
||
|
MakeSpecialDirectory( FAX_CLIENT_DIR_I386, FALSE );
|
||
|
MakeSpecialDirectory( FAX_CLIENT_DIR_ALPHA, FALSE );
|
||
|
MakeSpecialDirectory( FAX_CLIENT_DIR_WIN95, FALSE );
|
||
|
|
||
|
*pCommonPath = CommonChar;
|
||
|
*(pCommonPath+1) = (WCHAR) 0;
|
||
|
ConcatenatePaths( FaxCommonPath, FAX_DIR ) ;
|
||
|
CreateNetworkShare( FaxCommonPath, FAX_SHARE, EMPTY_STRING );
|
||
|
}
|
||
|
} else {
|
||
|
//
|
||
|
// Remove the system attribute from the archive and receive folders
|
||
|
// Delete desktop.ini from the archive and receive folders
|
||
|
//
|
||
|
if (MyGetSpecialPath( CSIDL_COMMON_DOCUMENTS, FaxCommonPath ) ) {
|
||
|
ConcatenatePaths( FaxCommonPath, GetString(IDS_ARCHIVE_DIR) ) ;
|
||
|
|
||
|
attrib = GetFileAttributes( FaxCommonPath );
|
||
|
attrib &= ~FILE_ATTRIBUTE_SYSTEM;
|
||
|
SetFileAttributes( FaxCommonPath, attrib );
|
||
|
|
||
|
ConcatenatePaths( FaxCommonPath, TEXT("desktop.ini") );
|
||
|
MoveFileEx( FaxCommonPath, NULL, MOVEFILE_DELAY_UNTIL_REBOOT);
|
||
|
}
|
||
|
|
||
|
if (MyGetSpecialPath( CSIDL_COMMON_DOCUMENTS, FaxCommonPath ) ) {
|
||
|
ConcatenatePaths( FaxCommonPath, GetString(IDS_RECEIVE_DIR) ) ;
|
||
|
|
||
|
attrib = GetFileAttributes( FaxCommonPath );
|
||
|
attrib &= ~FILE_ATTRIBUTE_SYSTEM;
|
||
|
SetFileAttributes( FaxCommonPath, attrib );
|
||
|
|
||
|
ConcatenatePaths( FaxCommonPath, TEXT("desktop.ini") );
|
||
|
MoveFileEx( FaxCommonPath, NULL, MOVEFILE_DELAY_UNTIL_REBOOT);
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Unregister the old faxshell.dll
|
||
|
//
|
||
|
|
||
|
DeleteRegistryKey( HKEY_CLASSES_ROOT, TEXT("Clsid\\{7f9609be-af9a-11d1-83e0-00c04fb6e984}") );
|
||
|
|
||
|
hKey = OpenRegistryKey( HKEY_LOCAL_MACHINE, TEXT("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Shell Extensions\\Approved"), TRUE, NULL );
|
||
|
if (hKey) {
|
||
|
RegDeleteValue( hKey, TEXT("{7f9609be-af9a-11d1-83e0-00c04fb6e984}") );
|
||
|
RegCloseKey( hKey );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return TRUE;
|
||
|
|
||
|
error_exit:
|
||
|
|
||
|
//
|
||
|
// reset the install registry data
|
||
|
//
|
||
|
|
||
|
SetInstalledFlag( Installed );
|
||
|
SetInstallType( OldInstallType );
|
||
|
SetInstalledPlatforms( InstalledPlatforms );
|
||
|
|
||
|
//
|
||
|
// display the error message
|
||
|
//
|
||
|
|
||
|
PopUpMsg( hwnd, ErrorCode, TRUE, 0 );
|
||
|
|
||
|
return FALSE;
|
||
|
}
|