windows-nt/Source/XPSP1/NT/printscan/fax/setup/wizdll/server.c
2020-09-26 16:20:57 +08:00

581 lines
20 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 "wizard.h"
#pragma hdrstop
FILE_QUEUE_INFO ServerFileQueue[] =
{
//------------------------------------------------------------------------------------------------------------------------------------------------------------
// Section Name Dest Dir INF Dir Id Dest Dir Id Platforms Copy Flags
//------------------------------------------------------------------------------------------------------------------------------------------------------------
{ TEXT("ServerSystemFiles"), NULL, DIRID_SYSTEM, DIRID_SYSTEM, PLATFORM_NONE, SP_COPY_NEWER },
{ TEXT("HelpFilesCommon"), NULL, DIRID_HELP, DIRID_HELP, PLATFORM_NONE, SP_COPY_NEWER },
{ TEXT("HelpFilesServer"), NULL, DIRID_HELP, DIRID_HELP, PLATFORM_NONE, SP_COPY_NEWER },
{ TEXT("ServerPrinterFiles"), NULL, PRINTER_DRIVER_DIR, DIRID_SPOOLDRIVERS, PLATFORM_USE_PRINTER, SP_COPY_NEWER },
{ TEXT("ClientFiles"), FAXCLIENTS_DIR, PRINTER_CLIENT_DIR, DIRID_SPOOLDRIVERS, PLATFORM_USE_MACHINE, SP_COPY_NEWER },
{ TEXT("OutlookConfigFile"), OUTLOOKCONFIG_DIR, OUTLOOK_ECF_DIR, DIRID_WINDOWS, PLATFORM_NONE, SP_COPY_NEWER },
{ TEXT("ClientCoverPageFiles"), COVERPAGE_DIR, COVERPAGE_CLIENT_DIR, DIRID_SYSTEM, PLATFORM_NONE, SP_COPY_NEWER },
{ TEXT("ClientCoverPageFiles"), COVERPAGE_DIR, COVERPAGE_CLIENT_DIR, DIRID_SPOOLDRIVERS, PLATFORM_NONE, SP_COPY_NEWER }
//
// ClientCoverPageFiles MUST be the last section because when upgrading
// the coverpages should not be installed. This is accomplished by decrementing
// file queue count.
//
};
#define CountServerFileQueue (sizeof(ServerFileQueue)/sizeof(FILE_QUEUE_INFO))
FILE_QUEUE_INFO WorkstationFileQueue[] =
{
//------------------------------------------------------------------------------------------------------------------------------------------------------------
// Section Name Dest Dir INF Dir Id Dest Dir Id Platforms Copy Flags
//------------------------------------------------------------------------------------------------------------------------------------------------------------
{ TEXT("ServerSystemFiles"), NULL, DIRID_SYSTEM, DIRID_SYSTEM, PLATFORM_NONE, SP_COPY_NEWER },
{ TEXT("HelpFilesCommon"), NULL, DIRID_HELP, DIRID_HELP, PLATFORM_NONE, SP_COPY_NEWER },
{ TEXT("HelpFilesServer"), NULL, DIRID_HELP, DIRID_HELP, PLATFORM_NONE, SP_COPY_NEWER },
{ TEXT("HelpFilesWorkstation"), NULL, DIRID_HELP, DIRID_HELP, PLATFORM_NONE, SP_COPY_NEWER },
{ TEXT("ServerPrinterFiles"), NULL, PRINTER_DRIVER_DIR, DIRID_SPOOLDRIVERS, PLATFORM_USE_PRINTER, SP_COPY_NEWER },
{ TEXT("ClientFiles"), FAXCLIENTS_DIR, PRINTER_CLIENT_DIR, DIRID_SPOOLDRIVERS, PLATFORM_USE_MACHINE, SP_COPY_NEWER },
{ TEXT("OutlookConfigFile"), OUTLOOKCONFIG_DIR, OUTLOOK_ECF_DIR, DIRID_WINDOWS, PLATFORM_NONE, SP_COPY_NEWER },
{ TEXT("ClientCoverPageFiles"), COVERPAGE_DIR, COVERPAGE_CLIENT_DIR, DIRID_SPOOLDRIVERS, PLATFORM_NONE, SP_COPY_NEWER }
//
// ClientCoverPageFiles MUST be the last section because when upgrading
// the coverpages should not be installed. This is accomplished by decrementing
// file queue count.
//
};
#define CountWorkstationFileQueue (sizeof(WorkstationFileQueue)/sizeof(FILE_QUEUE_INFO))
FILE_QUEUE_INFO DriverClientFileQueue[] =
{
//---------------------------------------------------------------------------------------------------------------------------------------------------------
// Section Name Dest Dir INF Dir Id Dest Dir Id Platforms Copy Flags
//---------------------------------------------------------------------------------------------------------------------------------------------------------
{ TEXT("ServerPrinterFiles"), NULL, PRINTER_DRIVER_DIR, DIRID_SPOOLDRIVERS, PLATFORM_USE_PRINTER, SP_COPY_NEWER },
{ TEXT("ClientFiles"), FAXCLIENTS_DIR, PRINTER_CLIENT_DIR, DIRID_SPOOLDRIVERS, PLATFORM_USE_MACHINE, SP_COPY_NEWER }
};
#define CountDriverClientFileQueue (sizeof(DriverClientFileQueue)/sizeof(FILE_QUEUE_INFO))
UINT
InstallQueueCallback(
IN PVOID QueueContext,
IN UINT Notification,
IN UINT Param1,
IN UINT Param2
)
{
LPTSTR TextBuffer;
DWORD len;
PFILE_QUEUE_CONTEXT FileQueueContext = (PFILE_QUEUE_CONTEXT) QueueContext;
if (Notification == SPFILENOTIFY_STARTCOPY) {
TextBuffer = MemAlloc(
((_tcslen( ((PFILEPATHS)Param1)->Target ) + 32) * sizeof(TCHAR)) +
((_tcslen( ((PFILEPATHS)Param1)->Source ) + 32) * sizeof(TCHAR))
);
if (TextBuffer) {
_stprintf(
TextBuffer,
TEXT("%s%s"),
GetString( IDS_COPYING ),
((PFILEPATHS)Param1)->Target
);
len = ExtraChars( GetDlgItem( FileQueueContext->hwnd, IDC_PROGRESS_TEXT ), TextBuffer );
if (len) {
LPTSTR FileName = CompactFileName( ((PFILEPATHS)Param1)->Target, len );
_stprintf(
TextBuffer,
TEXT("%s%s"),
GetString( IDS_COPYING ),
FileName
);
MemFree( FileName );
}
SetDlgItemText(
FileQueueContext->hwnd,
IDC_PROGRESS_TEXT,
TextBuffer
);
_stprintf(
TextBuffer,
TEXT("%s %s -> %s"),
GetString( IDS_COPYING ),
((PFILEPATHS)Param1)->Source,
((PFILEPATHS)Param1)->Target
);
DebugPrint(( TEXT("%s"), TextBuffer ));
MemFree( TextBuffer );
}
}
//
// Want default processing.
//
return SetupDefaultQueueCallback( FileQueueContext->QueueContext, Notification, Param1, Param2 );
}
VOID
SetProgress(
HWND hwnd,
DWORD StatusString
)
{
if (Unattended) {
return;
}
SendMessage( hwnd, WM_MY_PROGRESS, 10, 0 );
SetDlgItemText(
hwnd,
IDC_PROGRESS_TEXT,
GetString( StatusString )
);
}
DWORD
ServerFileCopyThread(
HWND hwnd
)
{
HINF FaxSetupInf;
HSPFILEQ *FileQueue;
PVOID QueueContext;
DWORD ErrorCode = 0;
DWORD PlatformsMask;
DWORD i;
int DlgErr;
SECURITY_INFO SecurityInfo;
PFILE_QUEUE_INFO FileQueueInfo;
DWORD CountFileQueueInfo;
DWORD OldInstallType;
TCHAR FileName[256];
TCHAR SrcDir[MAX_PATH];
TCHAR DestDir[MAX_PATH];
DWORD BytesNeeded;
BOOL CompleteInstall;
if (NtGuiMode) {
MyStartService( L"LanmanServer" );
if (FaxDevices && Enabled) {
CompleteInstall = TRUE;
}
} else {
CompleteInstall = TRUE;
}
//
// copy all of the files
//
ExpandEnvironmentStrings( TEXT("%windir%\\awmodem.inf"), FileName, sizeof(FileName)/sizeof(TCHAR) );
MyDeleteFile( FileName );
//
// copy faxwiz.dll to the printer driver directory
// this is necessary because layout.inf cannot have
// duplicate entries and we need faxwiz.dll to be
// copied to more than one location
//
if (NtGuiMode && (InstallMode & INSTALL_NEW)) {
if (GetPrinterDriverDirectory( NULL, NULL, 1, (LPBYTE) DestDir, MAX_PATH, &BytesNeeded )) {
_tcscat( DestDir, TEXT("\\faxwiz.dll") );
ExpandEnvironmentStrings( TEXT("%systemroot%\\system32\\faxwiz.dll"), SrcDir, sizeof(SrcDir)/sizeof(TCHAR) );
CopyFile( SrcDir, DestDir, FALSE );
}
}
if (InstallMode & INSTALL_UPGRADE) {
if (GetPrinterDriverDirectory( NULL, NULL, 1, (LPBYTE) SrcDir, MAX_PATH, &BytesNeeded )) {
LPTSTR DirectoryPath = _tcsrchr( SrcDir, TEXT( '\\' ) );
if (DirectoryPath) {
*++DirectoryPath = 0;
_tcscpy( DestDir, SrcDir );
_tcscpy( DirectoryPath, OLD_COVERPAGE_DIR );
_tcscat( DestDir, COVERPAGE_DIR );
MoveFile( SrcDir, DestDir );
}
}
}
if (!Unattended) {
if (InstallMode & INSTALL_NEW) {
SendMessage( hwnd, WM_MY_PROGRESS, 0xff, 50 );
} else {
SendMessage( hwnd, WM_MY_PROGRESS, 0xff, 10 );
}
}
//
// when running in nt gui mode setup
// the files do not need to be copied
// because they have been copied during
// text mode setup.
//
if (!NtGuiMode) {
if (!InitializeFileQueue( hwnd, &FaxSetupInf, &FileQueue, &QueueContext, SourceDirectory )) {
ErrorCode = IDS_COULD_NOT_COPY_FILES;
goto error_exit;
}
if (InstallType & FAX_INSTALL_WORKSTATION) {
FileQueueInfo = WorkstationFileQueue;
CountFileQueueInfo = CountWorkstationFileQueue;
//
// If upgrading, decrement the count to drop the coverpage section
//
if (InstallMode & INSTALL_UPGRADE) {
CountFileQueueInfo--;
}
} else {
FileQueueInfo = ServerFileQueue;
CountFileQueueInfo = CountServerFileQueue;
//
// If upgrading, decrement the count to drop the coverpage section
//
if (InstallMode & INSTALL_UPGRADE) {
CountFileQueueInfo--;
}
}
if (InstallMode & INSTALL_DRIVERS) {
FileQueueInfo = DriverClientFileQueue;
CountFileQueueInfo = CountDriverClientFileQueue;
}
if (!ProcessFileQueue( FaxSetupInf, FileQueue, QueueContext, SourceDirectory,
FileQueueInfo, CountFileQueueInfo, InstallQueueCallback, SETUP_ACTION_COPY )) {
ErrorCode = IDS_COULD_NOT_COPY_FILES;
goto error_exit;
}
if (!CloseFileQueue( FileQueue, QueueContext )) {
ErrorCode = IDS_COULD_NOT_COPY_FILES;
goto error_exit;
}
}
//
// set the registry data
//
SetProgress( hwnd, IDS_SETTING_REGISTRY );
if (!SetServerRegistryData()) {
DebugPrint(( TEXT("SetServerRegistryDatae() failed") ));
ErrorCode = IDS_COULD_SET_REG_DATA;
goto error_exit;
}
if (!SetClientRegistryData()) {
DebugPrint(( TEXT("SetClientRegistryDatae() failed") ));
ErrorCode = IDS_COULD_SET_REG_DATA;
goto error_exit;
}
if (InstallType & FAX_INSTALL_WORKSTATION) {
SetSoundRegistryData();
}
#ifdef MSFT_FAXVIEW
CreateFileAssociation(
FAXVIEW_EXTENSION,
FAXVIEW_ASSOC_NAME,
FAXVIEW_ASSOC_DESC,
FAXVIEW_OPEN_COMMAND,
FAXVIEW_PRINT_COMMAND,
FAXVIEW_PRINTTO_COMMAND,
FAXVIEW_FILE_NAME,
FAXVIEW_ICON_INDEX
);
CreateFileAssociation(
FAXVIEW_EXTENSION2,
FAXVIEW_ASSOC_NAME,
FAXVIEW_ASSOC_DESC,
FAXVIEW_OPEN_COMMAND,
FAXVIEW_PRINT_COMMAND,
FAXVIEW_PRINTTO_COMMAND,
FAXVIEW_FILE_NAME,
FAXVIEW_ICON_INDEX
);
#endif
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
//
for (i=0,PlatformsMask=0; i<CountPlatforms; i++) {
if (Platforms[i].Selected) {
PlatformsMask |= (1 << i);
}
}
OldInstallType = InstallType;
SetInstalledFlag( TRUE );
SetInstallType( RequestedSetupType == SETUP_TYPE_WORKSTATION ? FAX_INSTALL_WORKSTATION : FAX_INSTALL_SERVER );
SetInstalledPlatforms( PlatformsMask );
SetUnInstallInfo();
//
// install the fax service
//
if (InstallMode & INSTALL_NEW) {
SetProgress( hwnd, IDS_INSTALLING_FAXSVC );
if (!InstallFaxService( WizData.UseLocalSystem, !CompleteInstall, WizData.AccountName, WizData.Password )) {
ErrorCode = GetLastError();
if (ErrorCode != ERROR_SERVICE_LOGON_FAILED) {
DebugPrint(( TEXT("InstallFaxService() failed") ));
goto error_exit;
}
if (NtGuiMode) {
WizData.UseLocalSystem = TRUE;
if (!InstallFaxService( WizData.UseLocalSystem, NtGuiMode, WizData.AccountName, WizData.Password )) {
DebugPrint(( TEXT("InstallFaxService() failed") ));
ErrorCode = IDS_COULD_NOT_INSTALL_FAX_SERVICE;
goto error_exit;
}
}
while( ErrorCode == ERROR_SERVICE_LOGON_FAILED) {
DWORD Answer ;
ZeroMemory( &SecurityInfo, sizeof(SECURITY_INFO) );
_tcscpy( SecurityInfo.AccountName, WizData.AccountName );
_tcscpy( SecurityInfo.Password, WizData.Password );
do{ // Return to here if user chooses CANCEL and then waffles on the decision.
DlgErr = DialogBoxParam(
FaxWizModuleHandle,
MAKEINTRESOURCE(IDD_SECURITY_ERROR),
hwnd,
SecurityErrorDlgProc,
(LPARAM) &SecurityInfo
);
Answer = IDYES ;
if (DlgErr == -1 || DlgErr == 0) {
DebugPrint(( TEXT("SecurityErrorDlgProc() failed or was cancelled -- First while loop") ));
Answer = PopUpMsg( hwnd, IDS_QUERY_CANCEL, FALSE, MB_YESNO );
if( Answer == IDYES ){
goto error_exit_no_popup;
}
}
} while( Answer == IDNO );
_tcscpy( WizData.AccountName, SecurityInfo.AccountName );
_tcscpy( WizData.Password, SecurityInfo.Password );
if (!InstallFaxService( WizData.UseLocalSystem, NtGuiMode, WizData.AccountName, WizData.Password )) {
DebugPrint(( TEXT("InstallFaxService() failed") ));
ErrorCode = GetLastError();
if (ErrorCode != ERROR_SERVICE_LOGON_FAILED) {
DebugPrint(( TEXT("InstallFaxService() failed") ));
ErrorCode = IDS_COULD_NOT_INSTALL_FAX_SERVICE;
goto error_exit;
}
} else {
ErrorCode = 0;
}
}
}
}
//
// do the exchange stuff
//
SetProgress( hwnd, IDS_INSTALLING_EXCHANGE );
DoExchangeInstall( hwnd );
//
// start the fax service
//
SetProgress( hwnd, IDS_STARTING_FAXSVC );
//
// can't start the fax service during gui mode
// setup because netlogon has not yet been started
// so the service controller cannot logon to the
// account that the fax service runs under
//
if (!NtGuiMode) {
ErrorCode = StartFaxService();
if (ErrorCode == ERROR_SERVICE_LOGON_FAILED) {
while( ErrorCode == ERROR_SERVICE_LOGON_FAILED) {
DWORD Answer;
ZeroMemory( &SecurityInfo, sizeof(SECURITY_INFO) );
_tcscpy( SecurityInfo.AccountName, WizData.AccountName );
_tcscpy( SecurityInfo.Password, WizData.Password );
do{ // Return to here if user choses CANCEL and then waffles on the decision.
DlgErr = DialogBoxParam(
FaxWizModuleHandle,
MAKEINTRESOURCE(IDD_SECURITY_ERROR),
hwnd,
SecurityErrorDlgProc,
(LPARAM) &SecurityInfo
);
Answer = IDYES;
if (DlgErr == -1 || DlgErr == 0) {
DebugPrint(( TEXT("SecurityErrorDlgProc() failed or was cancelled -- Second while loop") ));
Answer = PopUpMsg( hwnd, IDS_QUERY_CANCEL, FALSE, MB_YESNO );
if( Answer == IDYES ){
goto error_exit_no_popup;
}
}
} while( Answer == IDNO );
_tcscpy( WizData.AccountName, SecurityInfo.AccountName );
_tcscpy( WizData.Password, SecurityInfo.Password );
if (!SetServiceAccount( TEXT("Fax"), &SecurityInfo )) {
DebugPrint(( TEXT("SetServiceSecurity() failed") ));
ErrorCode = IDS_CANT_SET_SERVICE_ACCOUNT;
goto error_exit;
}
ErrorCode = StartFaxService();
}
}
if (ErrorCode != ERROR_SUCCESS) {
ErrorCode = IDS_COULD_NOT_START_FAX_SERVICE;
goto error_exit;
}
}
if (InstallMode & INSTALL_NEW) {
SetProgress( hwnd, IDS_CREATING_FAXPRT );
if (CompleteInstall) {
if (!CreateServerFaxPrinter( hwnd, WizData.PrinterName )) {
DebugPrint(( TEXT("CreateServerFaxPrinter() failed") ));
if (!NtGuiMode) {
StopFaxService();
DeleteFaxService();
SetInstalledFlag( FALSE );
ErrorCode = IDS_COULD_NOT_CREATE_PRINTER;
goto error_exit;
}
}
}
} else {
AddPrinterDrivers();
}
if (((InstallMode & INSTALL_NEW) || (InstallMode & INSTALL_UPGRADE)) && CompleteInstall) {
SetProgress( hwnd, IDS_CREATING_GROUPS );
CreateGroupItems( FALSE, NULL );
}
if (InstallMode & INSTALL_NEW) {
InstallHelpFiles();
}
if (InstallMode & INSTALL_NEW) {
MakeDirectory( FAX_DIR );
MakeDirectory( FAX_RECEIVE_DIR );
MakeDirectory( FAX_QUEUE_DIR );
CreateNetworkShare( FAX_DIR, FAX_SHARE, EMPTY_STRING );
}
//
// create the client install shares, only if we're not installing on sam
//
CreateNetworkShare(
FAXCLIENTS_FULL_PATH,
FAXCLIENTS_DIR,
FAXCLIENTS_COMMENT
);
if (!Unattended) {
SetWindowLong( hwnd, DWL_MSGRESULT, 0 );
PropSheet_PressButton( GetParent(hwnd), PSBTN_NEXT );
}
return TRUE;
error_exit:
PopUpMsg( hwnd, ErrorCode, TRUE, 0 );
error_exit_no_popup:
InstallThreadError = ErrorCode;
OkToCancel = TRUE;
if (!Unattended) {
PropSheet_PressButton( GetParent(hwnd), PSBTN_CANCEL );
SetWindowLong( hwnd, DWL_MSGRESULT, -1 );
}
//
// reset the install registry data
//
SetInstalledFlag( Installed );
SetInstallType( OldInstallType );
SetInstalledPlatforms( InstalledPlatforms );
if (!Installed) {
DeleteUnInstallInfo();
}
return FALSE;
}