windows-nt/Source/XPSP1/NT/printscan/fax/setup/wizdll/uninstal.c

248 lines
7.2 KiB
C
Raw Normal View History

2020-09-26 03:20:57 -05:00
/*++
Copyright (c) 1996 Microsoft Corporation
Module Name:
uninstal.c
Abstract:
This file implements the un-install case.
Environment:
WIN32 User Mode
Author:
Wesley Witt (wesw) 17-Feb-1996
--*/
#include "wizard.h"
#pragma hdrstop
FILE_QUEUE_INFO UninstallFileQueue[] =
{
//---------------------------------------------------------------------------------------------------------------------------------------
// Section Name Dest Dir INF Dir Id Dest Dir Id Platforms Copy Flags
//---------------------------------------------------------------------------------------------------------------------------------------
{ TEXT("ServerSystemFiles"), NULL, DIRID_SYSTEM, DIRID_SYSTEM, PLATFORM_NONE, SP_COPY_IN_USE_NEEDS_REBOOT },
{ TEXT("ServerPrinterFiles"), NULL, PRINTER_DRIVER_DIR, DIRID_SPOOLDRIVERS, PLATFORM_USE_PRINTER, SP_COPY_IN_USE_NEEDS_REBOOT },
{ TEXT("HelpFilesCommon"), NULL, DIRID_HELP, DIRID_HELP, PLATFORM_NONE, SP_COPY_IN_USE_NEEDS_REBOOT },
{ TEXT("HelpFilesClient"), NULL, DIRID_HELP, DIRID_HELP, PLATFORM_NONE, SP_COPY_IN_USE_NEEDS_REBOOT },
{ TEXT("HelpFilesWorkstation"), NULL, DIRID_HELP, DIRID_HELP, PLATFORM_NONE, SP_COPY_IN_USE_NEEDS_REBOOT },
{ TEXT("HelpFilesServer"), NULL, DIRID_HELP, DIRID_HELP, PLATFORM_NONE, SP_COPY_IN_USE_NEEDS_REBOOT },
{ TEXT("ClientFiles"), FAXCLIENTS_DIR, PRINTER_CLIENT_DIR, DIRID_SPOOLDRIVERS, PLATFORM_USE_MACHINE, SP_COPY_IN_USE_NEEDS_REBOOT },
{ TEXT("ClientCoverPageFiles"), COVERPAGE_DIR, COVERPAGE_CLIENT_DIR, DIRID_SPOOLDRIVERS, PLATFORM_NONE, SP_COPY_IN_USE_NEEDS_REBOOT },
{ TEXT("ClientSystemFiles"), NULL, DIRID_SYSTEM, DIRID_SYSTEM, PLATFORM_NONE, SP_COPY_IN_USE_NEEDS_REBOOT },
{ TEXT("ClientCoverPageFiles"), COVERPAGE_DIR, COVERPAGE_CLIENT_DIR, DIRID_SYSTEM, PLATFORM_NONE, SP_COPY_IN_USE_NEEDS_REBOOT },
{ TEXT("OutlookConfigFile"), OUTLOOKCONFIG_DIR, OUTLOOK_ECF_DIR, DIRID_WINDOWS, PLATFORM_NONE, SP_COPY_IN_USE_NEEDS_REBOOT }
};
#define CountUninstallFileQueue (sizeof(UninstallFileQueue)/sizeof(FILE_QUEUE_INFO))
UINT
UninstallQueueCallback(
IN PVOID QueueContext,
IN UINT Notification,
IN UINT Param1,
IN UINT Param2
)
{
LPTSTR TextBuffer;
DWORD len;
TCHAR Drive[_MAX_DRIVE];
TCHAR Dir[_MAX_DIR];
TCHAR Path[MAX_PATH];
PFILE_QUEUE_CONTEXT FileQueueContext = (PFILE_QUEUE_CONTEXT) QueueContext;
if (Notification == SPFILENOTIFY_ENDDELETE) {
_tsplitpath( ((PFILEPATHS)Param1)->Target, Drive, Dir, NULL, NULL );
_stprintf( Path, TEXT("%s%s"), Drive, Dir );
RemoveDirectory( Path );
} else if (Notification == SPFILENOTIFY_STARTDELETE) {
TextBuffer = MemAlloc(
((_tcslen( ((PFILEPATHS)Param1)->Target ) + 32) * sizeof(TCHAR))
);
if (TextBuffer) {
_stprintf(
TextBuffer,
TEXT("%s%s"),
GetString( IDS_DELETING ),
((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_DELETING ),
FileName
);
MemFree( FileName );
}
SetDlgItemText(
FileQueueContext->hwnd,
IDC_PROGRESS_TEXT,
TextBuffer
);
DebugPrint(( TEXT("%s"), TextBuffer ));
MemFree( TextBuffer );
}
}
//
// Want default processing.
//
return SetupDefaultQueueCallback( FileQueueContext->QueueContext, Notification, Param1, Param2 );
}
DWORD
UninstallThread(
HWND hwnd
)
{
HINF FaxSetupInf;
HSPFILEQ *FileQueue;
PVOID QueueContext;
DWORD ErrorCode = 0;
HKEY hKey;
HKEY hKeyDevice;
DWORD RegSize;
DWORD RegType;
LONG rVal;
DWORD i = 0;
WCHAR Buffer[MAX_PATH*2];
SendMessage( hwnd, WM_MY_PROGRESS, 0xff, 40 );
//
// delete all the files
//
if ( !InitializeFileQueue( hwnd, &FaxSetupInf, &FileQueue, &QueueContext, SourceDirectory )) {
ErrorCode = IDS_COULD_NOT_DELETE_FILES;
goto error_exit;
}
SetProgress( hwnd, IDS_DELETING_FAX_PRINTERS );
DeleteFaxPrinters( hwnd );
if (!ProcessFileQueue( FaxSetupInf, FileQueue, QueueContext, SourceDirectory,
UninstallFileQueue, CountUninstallFileQueue, UninstallQueueCallback, SETUP_ACTION_DELETE )) {
ErrorCode = IDS_COULD_NOT_DELETE_FILES;
goto error_exit;
}
if (!CloseFileQueue( FileQueue, QueueContext )) {
ErrorCode = IDS_COULD_NOT_DELETE_FILES;
goto error_exit;
}
//
// kill the clients dir
//
wcscpy( Buffer, Platforms[0].DriverDir );
RemoveLastNode( Buffer );
wcscat( Buffer, FAXCLIENTS_DIR );
DeleteDirectoryTree( Buffer );
//
// kill the fax receieve dir(s)
//
rVal = RegOpenKey( HKEY_LOCAL_MACHINE, REGKEY_FAX_DEVICES, &hKey );
if (rVal == ERROR_SUCCESS) {
while (RegEnumKey( hKey, i++, Buffer, sizeof(Buffer)/sizeof(WCHAR) ) == ERROR_SUCCESS) {
wcscat( Buffer, L"\\" );
wcscat( Buffer, REGKEY_ROUTING );
rVal = RegOpenKey( hKey, Buffer, &hKeyDevice );
if (rVal == ERROR_SUCCESS) {
RegSize = sizeof(Buffer);
rVal = RegQueryValueEx(
hKeyDevice,
REGVAL_ROUTING_DIR,
0,
&RegType,
(LPBYTE) Buffer,
&RegSize
);
if (rVal == ERROR_SUCCESS) {
DeleteDirectoryTree( Buffer );
}
RegCloseKey( hKeyDevice );
}
}
RegCloseKey( hKey );
}
//
// clean out the registry
//
SetProgress( hwnd, IDS_DELETING_REGISTRY );
DeleteFaxRegistryData();
//
// remove the fax service
//
SetProgress( hwnd, IDS_DELETING_FAX_SERVICE );
MyDeleteService( TEXT("Fax") );
//
// remove the program groups
//
SetProgress( hwnd, IDS_DELETING_GROUPS );
DeleteGroupItems();
DeleteFaxMsgServices();
if (InstallType & FAX_INSTALL_SERVER) {
DeleteNetworkShare( FAXCLIENTS_DIR );
}
//
// allow the ui to continue
//
SetWindowLong( hwnd, DWL_MSGRESULT, 0 );
PropSheet_PressButton( GetParent(hwnd), PSBTN_NEXT );
return TRUE;
error_exit:
PopUpMsg( hwnd, ErrorCode, TRUE, 0 );
OkToCancel = TRUE;
PropSheet_PressButton( GetParent(hwnd), PSBTN_CANCEL );
SetWindowLong( hwnd, DWL_MSGRESULT, -1 );
return FALSE;
}