/*++ 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; }