/* **------------------------------------------------------------------------------ ** Module: Disk Cleanup Applet ** File: dmgrdlg.cpp ** ** Purpose: Implements the Disk Space Cleanup Drive dialog ** Notes: ** Mod Log: Created by Jason Cobb (2/97) ** ** Copyright (c)1997 Microsoft Corporation, All Rights Reserved **------------------------------------------------------------------------------ */ /* **------------------------------------------------------------------------------ ** Project include files **------------------------------------------------------------------------------ */ #include "common.h" #include "dmgrdlg.h" #include "dmgrinfo.h" #include "diskutil.h" #include "msprintf.h" #include // To work around a "feature" of listview we need the ability to temporarily ignore certain LVN_ITEMCHANGED messages: BOOL g_bIgnoreCheckStateChanges = TRUE; /* **------------------------------------------------------------------------------ ** Local defines **------------------------------------------------------------------------------ */ #define crSliceUsed RGB( 0, 0, 255 ) #define crSliceFree RGB( 255, 0, 255) #define crSliceCleanup RGB( 255, 255, 0 ) const DWORD aHelpIDs[]= { IDC_INTRO_TEXT, IDH_CLEANMGR_INTRO_TEXT, IDC_FILES_TO_REMOVE_TEXT, IDH_CLEANMGR_CLIENT_LIST, IDC_CLIENT_LIST, IDH_CLEANMGR_CLIENT_LIST, IDC_TOTAL_SPACE_DESCRIPTION, IDH_CLEANMGR_TOTAL_SPACE, IDC_TOTAL_SPACE_TEXT, IDH_CLEANMGR_TOTAL_SPACE, IDC_DESCRIPTION_GROUP, IDH_CLEANMGR_DESCRIPTION_GROUP, IDC_DESCRIPTION_TEXT, IDH_CLEANMGR_DESCRIPTION_GROUP, IDC_DETAILS_BUTTON, IDH_CLEANMGR_DETAILS_BUTTON, IDC_WINDOWS_SETUP_ICON, IDH_CLEANMGR_SETUP_GROUP, IDC_WINDOWS_SETUP_GROUP, IDH_CLEANMGR_SETUP_GROUP, IDC_WINDOWS_SETUP_TEXT, IDH_CLEANMGR_SETUP_GROUP, IDC_WINDOWS_SETUP_BUTTON, IDH_CLEANMGR_SETUP_BUTTON, IDC_INSTALLED_PROGRAMS_ICON, IDH_CLEANMGR_PROGRAMS_GROUP, IDC_INSTALLED_PROGRAMS_GROUP, IDH_CLEANMGR_PROGRAMS_GROUP, IDC_INSTALLED_PROGRAMS_TEXT, IDH_CLEANMGR_PROGRAMS_GROUP, IDC_INSTALLED_PROGRAMS_BUTTON, IDH_CLEANMGR_PROGRAMS_BUTTON, IDC_SYSTEM_RESTORE_ICON, IDH_CLEANMGR_SYSTEM_RESTORE_GROUP, IDC_SYSTEM_RESTORE_GROUP, IDH_CLEANMGR_SYSTEM_RESTORE_GROUP, IDC_SYSTEM_RESTORE_TEXT, IDH_CLEANMGR_SYSTEM_RESTORE_GROUP, IDC_SYSTEM_RESTORE_BUTTON, IDH_CLEANMGR_SYSTEM_RESTORE_BUTTON, IDC_AUTO_LAUNCH, IDH_CLEANMGR_AUTO_LAUNCH, IDC_DRIVE_ICON_LOCATION, ((DWORD)-1), IDC_SETTINGS_DRIVE_TEXT, ((DWORD)-1), 0, 0 }; /* **------------------------------------------------------------------------------ ** Local function prototypes **------------------------------------------------------------------------------ */ BOOL CleanupMgrDlgInit (HWND hDlg, LPARAM lParam); void CleanupMgrDlgCleanup (HWND hDlg); BOOL CleanupMgrDlgCommand (HWND hDlg, WPARAM wParam, LPARAM lParam); BOOL CleanupMgrDlgNotify (HWND hDlg, UINT uiMessage, WPARAM wParam, LPARAM lParam); BOOL CleanupMgrDlgInitText (HWND hDlg); BOOL CleanupMgrDlgInitList (HWND hDlg); VOID UpdateTotalSpaceToBeFreed(HWND hDlg); INT_PTR CALLBACK MoreOptionsDlgProc(HWND hDlg, UINT Message, WPARAM wParam, LPARAM lParam); INT_PTR CALLBACK SettingsDlgProc(HWND hDlg, UINT Message, WPARAM wParam, LPARAM lParam); LPARAM ListView_GetItemData(HWND hwndList, int i) { LVITEM lvi = {0}; lvi.iItem = i; lvi.mask = LVIF_PARAM; if ( ListView_GetItem(hwndList, &lvi) ) { return lvi.lParam; } return NULL; } /* **------------------------------------------------------------------------------ ** DisplayCleanMgrProperties ** ** Purpose: Creates the Cleanup Manager property sheet ** Parameters: ** hDlg - Handle to dialog window ** lParam - DWORD to pass onto the property pages ** Return: 1 if user pressed "OK" ** 0 if user pressed "Cancel" ** Notes; ** Mod Log: Created by Jason Cobb (7/97) **------------------------------------------------------------------------------ */ DWORD DisplayCleanMgrProperties( HWND hWnd, LPARAM lParam ) { DWORD dwRet; TCHAR *psz; PROPSHEETPAGE psp; PROPSHEETHEADER psh; HPROPSHEETPAGE hpsp[2]; CleanupMgrInfo * pcmi = (CleanupMgrInfo *)lParam; if (pcmi == NULL) { // //Error - passed in invalid CleanupMgrInfo info // return 0; } memset(&psh, 0, sizeof(PROPSHEETHEADER)); psp.dwSize = sizeof(PROPSHEETPAGE); psp.dwFlags = PSP_DEFAULT | PSP_USETITLE; psp.hInstance = g_hInstance; psp.lParam = lParam; psp.pszTitle = MAKEINTRESOURCE(IDS_DISKCLEANUP); psp.pszTemplate = MAKEINTRESOURCE(IDD_DISK_CLEANER); psp.pfnDlgProc = DiskCleanupManagerProc; hpsp[0] = CreatePropertySheetPage(&psp); if (!(pcmi->dwUIFlags & FLAG_SAGESET)) { // Only display the second tab if the user is an admin if (IsUserAnAdmin()) { psp.pszTitle = MAKEINTRESOURCE(IDS_MOREOPTIONS); psp.pszTemplate = MAKEINTRESOURCE(IDD_MORE_OPTIONS); psp.pfnDlgProc = MoreOptionsDlgProc; hpsp[1] = CreatePropertySheetPage(&psp); // commented out until after BEta 2 // psp.pszTitle = MAKEINTRESOURCE(IDS_SETTINGS); // psp.pszTemplate = MAKEINTRESOURCE(IDD_SETTINGS); // psp.pfnDlgProc = SettingsDlgProc; // hpsp[2] = CreatePropertySheetPage(&psp); // psh.nPages = 3; psh.nPages = 2; } else { // User is not an admin so only display the first tab psh.nPages = 1; } // //Create the dialog title // psz = SHFormatMessage( MSG_APP_TITLE, pcmi->szVolName, pcmi->szRoot[0]); } else { psh.nPages = 1; // //Create the dialog title // psz = SHFormatMessage( MSG_APP_SETTINGS_TITLE ); } psh.dwSize = sizeof(PROPSHEETHEADER); psh.dwFlags = PSH_NOAPPLYNOW | PSH_USEICONID; psh.hInstance = g_hInstance; psh.hwndParent = hWnd; psh.pszIcon = MAKEINTRESOURCE(ICON_CLEANMGR); psh.phpage = hpsp; psh.pszCaption = psz; dwRet = (DWORD)PropertySheet(&psh); LocalFree(psz); return dwRet; } /* **------------------------------------------------------------------------------ ** DiskCleanupManagerProc ** ** Purpose: Dialog routine for Disk Cleanup Manager Property Sheet ** Parameters: ** hDlg - Handle to dialog window ** uMessage - behavior type ** wParam - depends on message ** lParam - depends on message ** Return: TRUE on sucess ** FALSE on failure ** Notes; ** Mod Log: Created by Jason Cobb (2/97) **------------------------------------------------------------------------------ */ INT_PTR CALLBACK DiskCleanupManagerProc( HWND hDlg, UINT uiMessage, WPARAM wParam, LPARAM lParam ) { switch (uiMessage) { case WM_INITDIALOG: return CleanupMgrDlgInit(hDlg, lParam); case WM_DESTROY: CleanupMgrDlgCleanup(hDlg); break; case WM_COMMAND: return CleanupMgrDlgCommand(hDlg, wParam, lParam); case WM_NOTIFY: return CleanupMgrDlgNotify(hDlg, uiMessage, wParam, lParam); case WM_HELP: WinHelp((HWND)((LPHELPINFO) lParam)->hItemHandle, NULL, HELP_WM_HELP, (DWORD_PTR)(LPTSTR) aHelpIDs); return TRUE; case WM_CONTEXTMENU: WinHelp((HWND) wParam, NULL, HELP_CONTEXTMENU, (DWORD_PTR)(LPVOID) aHelpIDs); return TRUE; case WM_SYSCOLORCHANGE: SendMessage( GetDlgItem(hDlg, IDC_CLIENT_LIST), uiMessage, wParam, lParam); break; } //Non-handled message return FALSE; } /* **------------------------------------------------------------------------------ ** CleanupMgrDlgInit ** ** Purpose: Handles dialog initialization ** Parameters: ** hDlg - Handle to dialog window ** lParam - Property Sheet pointer ** Return: TRUE on sucess ** FALSE on failure ** Notes; ** Mod Log: Created by Jason Cobb (2/97) **------------------------------------------------------------------------------ */ BOOL CleanupMgrDlgInit( HWND hDlg, LPARAM lParam ) { LPPROPSHEETPAGE lppsp; g_hDlg = hDlg; // //Make sure we have an invalid pointer to start out with // SetWindowLongPtr (hDlg, DWLP_USER, 0L); // //Get the CleanupMgrInfo // lppsp = (LPPROPSHEETPAGE)lParam; CleanupMgrInfo * pcmi = (CleanupMgrInfo *)lppsp->lParam; if (pcmi == NULL) { //Error - passed in invalid CleanupMgrInfo info return FALSE; } // now as we are becoming visible, we can dismiss the progress dialog if ( pcmi->hAbortScanWnd ) { pcmi->bAbortScan = TRUE; // //Wait for scan thread to finish // WaitForSingleObject(pcmi->hAbortScanThread, INFINITE); pcmi->bAbortScan = FALSE; } // //Save pointer to CleanupMgrInfo object // SetWindowLongPtr(hDlg, DWLP_USER, (LPARAM)pcmi); // //Initialize all text // if (!CleanupMgrDlgInitText(hDlg)) goto HAS_ERROR; // //Initialize the icon // SendDlgItemMessage(hDlg,IDC_DRIVE_ICON_LOCATION,STM_SETICON,(WPARAM)pcmi->hDriveIcon,0); // //If we are in SAGE settings mode then hide the total amount of space text // if (pcmi->dwUIFlags & FLAG_SAGESET) { ShowWindow(GetDlgItem(hDlg, IDC_TOTAL_SPACE_DESCRIPTION), SW_HIDE); ShowWindow(GetDlgItem(hDlg, IDC_TOTAL_SPACE_TEXT), SW_HIDE); } // //Initialize the list box (all of the cleanup clients) // if (!CleanupMgrDlgInitList(hDlg)) goto HAS_ERROR; return TRUE; HAS_ERROR: // //Delete any memory structures still hanging around // CleanupMgrDlgCleanup (hDlg); return FALSE; } /* **------------------------------------------------------------------------------ ** CleanupMgrDlgCleanup ** ** Purpose: ** Parameters: ** Notes; ** Mod Log: Created by Jason Cobb (2/97) **------------------------------------------------------------------------------ */ void CleanupMgrDlgCleanup( HWND hDlg ) { // //Make sure we have a valid parameter // if (!hDlg) return; // //Hide the window right away since we might block waiting for a //COM client to finish. // ShowWindow(hDlg, SW_HIDE); g_hDlg = NULL; } /* **------------------------------------------------------------------------------ ** CleanupMgrWarningPrompt ** ** Purpose: Asks the user if they are sure they want to delete the files ** Parameters: ** hDlg - Handle to dialog window ** Return: TRUE if user says YES ** FALSE if user says NO ** Notes; ** Mod Log: Created by Jason Cobb (6/97) **------------------------------------------------------------------------------ */ BOOL CleanupMgrWarningPrompt( HWND hDlg ) { TCHAR szWarning[256]; TCHAR *pszWarningTitle; int i; BOOL bItemSelected = FALSE; // //First verify that at least one item is selected. If no items are selected then //nothing will be deleted so we don't need to bother prompting the user. // CleanupMgrInfo * pcmi = GetCleanupMgrInfoPointer(hDlg); if (pcmi == NULL) return TRUE; for (i=0; iiNumVolumeCacheClients; i++) { if (pcmi->pClientInfo[i].bSelected == TRUE) { bItemSelected = TRUE; break; } } if (bItemSelected) { LoadString(g_hInstance, IDS_DELETEWARNING, szWarning, ARRAYSIZE(szWarning)); pszWarningTitle = SHFormatMessage( MSG_APP_TITLE, pcmi->szVolName, pcmi->szRoot[0]); if (MessageBox(hDlg, szWarning, pszWarningTitle, MB_YESNO | MB_ICONQUESTION) == IDYES) { LocalFree(pszWarningTitle); return TRUE; } else { LocalFree(pszWarningTitle); return FALSE; } } // //No items are selected so just return TRUE since nothing will be deleted. // return TRUE; } /* **------------------------------------------------------------------------------ ** CleanupMgrDlgCommand ** ** Purpose: Handles command messages ** Parameters: ** hDlg - Handle to dialog window ** wParam - depends on command ** lParam - depends on command ** Return: TRUE on sucess ** FALSE on failure ** Notes; ** Mod Log: Created by Jason Cobb (2/97) **------------------------------------------------------------------------------ */ BOOL CleanupMgrDlgCommand(HWND hDlg, WPARAM wParam, LPARAM lParam) { WORD wID = LOWORD(wParam); if ( IDC_DETAILS_BUTTON == wID ) { HWND hWndList = GetDlgItem(hDlg, IDC_CLIENT_LIST); int wIndex; wIndex = ListView_GetNextItem(hWndList, -1, LVNI_SELECTED); if (-1 != wIndex) { PCLIENTINFO pClientInfo = (PCLIENTINFO)ListView_GetItemData(hWndList,wIndex); if ( pClientInfo ) { pClientInfo->pVolumeCache->ShowProperties(hDlg); } } } return 0; } /* **------------------------------------------------------------------------------ ** CleanupMgrDlgNotify ** ** Purpose: Handles notify messages ** Parameters: ** hDlg - Handle to dialog window ** wParam - depends on command ** lParam - depends on command ** Return: TRUE on sucess ** FALSE on failure ** Notes; ** Mod Log: Created by Jason Cobb (7/97) **------------------------------------------------------------------------------ */ BOOL CleanupMgrDlgNotify( HWND hDlg, UINT uiMessage, WPARAM wParam, LPARAM lParam ) { CleanupMgrInfo *pcmi; LPNMHDR pnmhdr = (LPNMHDR)lParam; if (IDC_CLIENT_LIST == pnmhdr->idFrom) { // a list view notification #define pnmlv ((LPNMLISTVIEW)pnmhdr) switch (pnmhdr->code) { case LVN_ITEMCHANGED: if ( pnmlv->uChanged & LVIF_STATE ) { LVITEM lvi; lvi.iItem = pnmlv->iItem; lvi.iSubItem = pnmlv->iSubItem; lvi.mask = LVIF_PARAM; ListView_GetItem( pnmhdr->hwndFrom, &lvi ); PCLIENTINFO pClientInfo = (PCLIENTINFO)lvi.lParam; // check if an item was selected if ( pnmlv->uNewState & LVIS_SELECTED ) { if (pClientInfo->wcsDescription) { TCHAR szDescription[DESCRIPTION_LENGTH]; SHUnicodeToTChar(pClientInfo->wcsDescription, szDescription, ARRAYSIZE( szDescription )); SetDlgItemText(hDlg, IDC_DESCRIPTION_TEXT, szDescription); } else { SetDlgItemText(hDlg, IDC_DESCRIPTION_TEXT, TEXT("")); } // //Show or Hide the Settings button // if (pClientInfo->dwInitializeFlags & EVCF_HASSETTINGS) { TCHAR szButton[BUTTONTEXT_LENGTH]; SHUnicodeToTChar(pClientInfo->wcsAdvancedButtonText, szButton, ARRAYSIZE( szButton )); SetDlgItemText(hDlg, IDC_DETAILS_BUTTON, szButton); ShowWindow(GetDlgItem(hDlg, IDC_DETAILS_BUTTON), SW_SHOW); } else { ShowWindow(GetDlgItem(hDlg, IDC_DETAILS_BUTTON), SW_HIDE); } } // Check if the state image changed. This results from checking or unchecking // one of the list view checkboxes. if ((pnmlv->uNewState ^ pnmlv->uOldState) & LVIS_STATEIMAGEMASK) { if ( !g_bIgnoreCheckStateChanges ) { pClientInfo->bSelected = ListView_GetCheckState( pnmhdr->hwndFrom, pnmlv->iItem ); UpdateTotalSpaceToBeFreed(hDlg); } } } break; } } else { // must be a property sheet notification switch(pnmhdr->code) { case PSN_RESET: pcmi = GetCleanupMgrInfoPointer(hDlg); pcmi->bPurgeFiles = FALSE; break; case PSN_APPLY: pcmi = GetCleanupMgrInfoPointer(hDlg); if (!(pcmi->dwUIFlags & FLAG_SAGESET)) { // We're not in SAGESET mode // Ask the user if they would like to proceed if there are items selected if (!CleanupMgrWarningPrompt(hDlg)) { // The user clicked no so drop them back to the main window SetWindowLongPtr(hDlg, DWLP_MSGRESULT, PSNRET_INVALID_NOCHANGEPAGE); pcmi->bPurgeFiles = FALSE; return TRUE; } // User clicked yes so continue as normal pcmi->bPurgeFiles = TRUE; } else { pcmi->bPurgeFiles = TRUE; } break; } } return FALSE; } /* **------------------------------------------------------------------------------ ** CleanupMgrDlgInitText ** ** Purpose: ** Parameters: ** hDlg - Handle to dialog window ** Return: TRUE on sucess ** FALSE on failure ** Notes; ** Mod Log: Created by Jason Cobb (2/97) **------------------------------------------------------------------------------ */ BOOL CleanupMgrDlgInitText( HWND hDlg ) { if (hDlg == NULL) return FALSE; // // Step 1. Get pointers to Info structures // CleanupMgrInfo * pcmi = GetCleanupMgrInfoPointer(hDlg); if (pcmi == NULL) return FALSE; if (pcmi->dre == Drive_INV) return FALSE; // // Step 2. Extract useful info // // //get vol name // TCHAR * pszVolName = pcmi->szVolName; if (pszVolName == NULL) pszVolName = TEXT(""); // //get drive letter // TCHAR chDrive = pcmi->dre + 'A'; // // Step 3. Initialize text // // //Set header // if (pcmi->dwUIFlags & FLAG_SAGESET) { TCHAR * psz; psz = SHFormatMessage( MSG_INTRO_SETTINGS_TEXT ); SetDlgItemText (hDlg, IDC_INTRO_TEXT, psz); LocalFree(psz); } else { TCHAR * psz; TCHAR * pszDrive; TCHAR szBuffer[50]; pszDrive = SHFormatMessage( MSG_VOL_NAME_DRIVE_LETTER, pszVolName, chDrive); StrFormatKBSize(pcmi->cbEstCleanupSpace.QuadPart, szBuffer, ARRAYSIZE( szBuffer )); psz = SHFormatMessage( MSG_INTRO_TEXT, pszDrive, szBuffer); SetDlgItemText (hDlg, IDC_INTRO_TEXT, psz); LocalFree(pszDrive); LocalFree(psz); } return TRUE; } /* **------------------------------------------------------------------------------ ** UpdateTotalSpaceToBeFreed ** ** Purpose: ** Parameters: ** hDlg - Handle to dialog window ** Return: NONE ** Notes; ** Mod Log: Created by Jason Cobb (7/97) **------------------------------------------------------------------------------ */ VOID UpdateTotalSpaceToBeFreed(HWND hDlg) { int i; ULARGE_INTEGER TotalSpaceToFree; TotalSpaceToFree.QuadPart = 0; if (hDlg == NULL) return; CleanupMgrInfo * pcmi = GetCleanupMgrInfoPointer(hDlg); if (pcmi == NULL) return; if (pcmi->dre == Drive_INV) return; // //Calculate the total space to be freed by adding up the dwUsedSpace value //on all of the selected clients // for (i=0; iiNumVolumeCacheClients; i++) { if (pcmi->pClientInfo[i].bSelected) { TotalSpaceToFree.QuadPart += pcmi->pClientInfo[i].dwUsedSpace.QuadPart; } } // //Display the total space to be freed // TCHAR szBuffer[10]; StrFormatKBSize(TotalSpaceToFree.QuadPart, szBuffer, ARRAYSIZE( szBuffer )); SetDlgItemText(hDlg, IDC_TOTAL_SPACE_TEXT, szBuffer); } /* **------------------------------------------------------------------------------ ** CleanupMgrDlgInitList ** ** Purpose: ** Parameters: ** hDlg - Handle to dialog window ** Return: TRUE on sucess ** FALSE on failure ** Notes; ** Mod Log: Created by Jason Cobb (2/97) **------------------------------------------------------------------------------ */ #define NAME_COL_PERCENT 80 #define SIZE_COL_PERCENT 20 BOOL CleanupMgrDlgInitList(HWND hDlg) { int i; if (hDlg == NULL) return FALSE; CleanupMgrInfo * pcmi = GetCleanupMgrInfoPointer(hDlg); if (pcmi == NULL) return FALSE; if (pcmi->dre == Drive_INV) return FALSE; HWND hwndList = GetDlgItem(hDlg, IDC_CLIENT_LIST); RECT rc; GetClientRect(hwndList, &rc); int cxList = rc.right - GetSystemMetrics(SM_CXVSCROLL); // I have no idea what all this TUNEUP and SAGESET stuff means, but the old code // only drew the sizes if the following condition was true. As such, I'm only // showing the size column if the same condition is true: BOOL bShowTwoCols = (!(pcmi->dwUIFlags & FLAG_TUNEUP) && !(pcmi->dwUIFlags & FLAG_SAGESET)); LVCOLUMN lvc; lvc.mask = LVCF_SUBITEM | LVCF_WIDTH; lvc.iSubItem = 0; lvc.cx = bShowTwoCols ? MulDiv(cxList, NAME_COL_PERCENT, 100) : cxList; ListView_InsertColumn( hwndList, 0, &lvc ); if ( bShowTwoCols ) { lvc.mask = LVCF_SUBITEM | LVCF_WIDTH | LVCF_FMT; lvc.iSubItem = 1; lvc.cx = MulDiv(cxList, SIZE_COL_PERCENT, 100); lvc.fmt = LVCFMT_RIGHT; ListView_InsertColumn( hwndList, 1, &lvc ); } HIMAGELIST himg = ImageList_Create(16, 16, ILC_COLOR|ILC_MASK, 4, 4); ListView_SetImageList(hwndList, himg, LVSIL_SMALL ); ListView_SetExtendedListViewStyleEx(hwndList, LVS_EX_CHECKBOXES | LVS_EX_FULLROWSELECT, LVS_EX_CHECKBOXES | LVS_EX_FULLROWSELECT); // When we add an item to the listview the listview code always initializes the item to the unchecked // state. It then fires a WM_NOTIFY telling us the state changed to "off" which causes us to nuke our // bSelected value. As such we need to ignore state image changes during the addition of list view // items so that we can preserve our bSelected state. g_bIgnoreCheckStateChanges = TRUE; for (i=0; iiNumVolumeCacheClients; i++) { if ((pcmi->pClientInfo[i].pVolumeCache != NULL) && (pcmi->pClientInfo[i].wcsDisplayName != NULL) && (pcmi->pClientInfo[i].bShow == TRUE)) { LPTSTR lpszDisplayName; ULONG cb; cb = WideCharToMultiByte(CP_ACP, 0, pcmi->pClientInfo[i].wcsDisplayName, -1, NULL, 0, NULL, NULL); if ((lpszDisplayName = (LPTSTR)LocalAlloc(LPTR, (cb + 1) * sizeof( TCHAR ))) != NULL) { #ifdef UNICODE StringCchCopy(lpszDisplayName, cb, pcmi->pClientInfo[i].wcsDisplayName); #else // //Convert UNICODE display name to ANSI and then add it to the list // WideCharToMultiByte(CP_ACP, 0, pcmi->pClientInfo[i].wcsDisplayName, -1, lpszDisplayName, cb, NULL, NULL); #endif // //Determine where in the list this item should go. // int iSortedPossition; int totalSoFar = ListView_GetItemCount(hwndList); for (iSortedPossition=0; iSortedPossitionpClientInfo[i].dwPriority < pClientInfo->dwPriority)) break; } // //Insert this item at index j in the list // LVITEM lvi = {0}; lvi.mask = LVIF_TEXT | LVIF_PARAM | LVIF_IMAGE; lvi.iItem = iSortedPossition; lvi.iSubItem = 0; lvi.pszText = lpszDisplayName; lvi.lParam = (LPARAM)&(pcmi->pClientInfo[i]); lvi.iImage = ImageList_AddIcon(himg, pcmi->pClientInfo[i].hIcon); iSortedPossition = ListView_InsertItem(hwndList, &lvi); if (bShowTwoCols) { TCHAR szBuffer[10]; StrFormatKBSize(pcmi->pClientInfo[i].dwUsedSpace.QuadPart, szBuffer, ARRAYSIZE( szBuffer )); ListView_SetItemText( hwndList, iSortedPossition, 1, szBuffer ); } // Set the initial check state. We can't do this when we add the item because the // list view code specifically ingores your State Image Flags if you have the // LVS_EX_CHECKBOX style set, which we do. ListView_SetCheckState( hwndList, iSortedPossition, pcmi->pClientInfo[i].bSelected ); LocalFree( lpszDisplayName ); } } } g_bIgnoreCheckStateChanges = FALSE; UpdateTotalSpaceToBeFreed(hDlg); ListView_SetItemState(hwndList, 0, LVIS_SELECTED, LVIS_SELECTED); return TRUE; } typedef DWORD (WINAPI * PFNSRFIFO)(LPCWSTR pwszDrive, DWORD dwTargetRp, INT nPercent, BOOL fIncludeCurrentRp); INT_PTR CALLBACK MoreOptionsDlgProc( HWND hDlg, UINT Message, WPARAM wParam, LPARAM lParam ) { CleanupMgrInfo *pcmi; switch(Message) { case WM_INITDIALOG: { LPPROPSHEETPAGE lppsp; HMODULE hSRClient; lppsp = (LPPROPSHEETPAGE)lParam; pcmi = (CleanupMgrInfo *)lppsp->lParam; if (pcmi == NULL) { //Error - passed in invalid CleanupMgrInfo info return FALSE; } SetWindowLongPtr (hDlg, DWLP_USER, (LONG_PTR) pcmi); hSRClient = LoadLibraryEx(TEXT("srclient.dll"), NULL, DONT_RESOLVE_DLL_REFERENCES); if (hSRClient) { FreeLibrary (hSRClient); } else { EnableWindow(GetDlgItem(hDlg, IDC_SYSTEM_RESTORE_GROUP), FALSE); ShowWindow(GetDlgItem(hDlg, IDC_SYSTEM_RESTORE_ICON), SW_HIDE); EnableWindow(GetDlgItem(hDlg, IDC_SYSTEM_RESTORE_TEXT), FALSE); EnableWindow(GetDlgItem(hDlg, IDC_SYSTEM_RESTORE_BUTTON), FALSE); } } break; case WM_COMMAND: switch(LOWORD(wParam)) { case IDC_WINDOWS_SETUP_BUTTON: { TCHAR szSysDir[MAX_PATH]; if ( GetSystemDirectory(szSysDir, ARRAYSIZE(szSysDir)) ) { TCHAR szParam[MAX_PATH]; StringCchPrintf(szParam, ARRAYSIZE(szParam), SZ_WINDOWS_SETUP, szSysDir); // Use full path if (PathAppend(szSysDir, SZ_SYSOCMGR)) { ShellExecute(NULL, NULL, szSysDir, szParam, NULL, SW_SHOWNORMAL); } } } break; case IDC_INSTALLED_PROGRAMS_BUTTON: { TCHAR szPath[MAX_PATH]; if (GetSystemDirectory(szPath, ARRAYSIZE(szPath))) { // Use full path if (PathAppend(szPath, SZ_RUNDLL32)) { ShellExecute(NULL, NULL, szPath, SZ_INSTALLED_PROGRAMS, NULL, SW_SHOWNORMAL); } } } break; case IDC_SYSTEM_RESTORE_BUTTON: pcmi = (CleanupMgrInfo *) GetWindowLongPtr (hDlg, DWLP_USER); if (pcmi) { HMODULE hSRClient = NULL; PFNSRFIFO pfnSRFifo; TCHAR szCaption[100]; TCHAR szMessage[200]; INT iResult; LoadString(g_hInstance, IDS_DISKCLEANUP, szCaption, ARRAYSIZE(szCaption)); LoadString(g_hInstance, IDS_SYSTEM_RESTORE_MESSAGE, szMessage, ARRAYSIZE(szMessage)); iResult = MessageBox(hDlg, szMessage, szCaption, MB_YESNO | MB_ICONQUESTION); if (iResult == IDYES) { hSRClient = LoadLibrary(TEXT("srclient.dll")); if (hSRClient) { pfnSRFifo = (PFNSRFIFO) GetProcAddress (hSRClient, "SRFifo"); if (pfnSRFifo) { pfnSRFifo ((LPCWSTR)pcmi->szRoot, NULL, 0, FALSE); } FreeLibrary (hSRClient); } } } break; } break; case WM_HELP: WinHelp((HWND)((LPHELPINFO) lParam)->hItemHandle, NULL, HELP_WM_HELP, (DWORD_PTR)(LPTSTR) aHelpIDs); return TRUE; case WM_CONTEXTMENU: WinHelp((HWND) wParam, NULL, HELP_CONTEXTMENU, (DWORD_PTR)(LPVOID) aHelpIDs); return TRUE; default: return FALSE; } return TRUE; } INT_PTR CALLBACK SettingsDlgProc( HWND hDlg, UINT Message, WPARAM wParam, LPARAM lParam ) { LPPROPSHEETPAGE lppsp; CleanupMgrInfo *pcmi; DWORD dwType, cbBytes; DWORD dwLDSDisable; HKEY hk; switch(Message) { case WM_INITDIALOG: { TCHAR * psz; hardware hwType; lppsp = (LPPROPSHEETPAGE)lParam; pcmi = (CleanupMgrInfo *)lppsp->lParam; if (pcmi == NULL) { //Error - passed in invalid CleanupMgrInfo info return FALSE; } // //Save pointer to CleanupMgrInfo object // SetWindowLongPtr(hDlg, DWLP_USER, (LPARAM)pcmi); TCHAR * pszVolName = pcmi->szVolName; if (pszVolName == NULL) pszVolName = TEXT(""); TCHAR chDrive = pcmi->dre + TCHAR('A'); psz = SHFormatMessage( MSG_INTRO_SETTINGS_TAB, pszVolName, chDrive ); SetDlgItemText (hDlg, IDC_SETTINGS_DRIVE_TEXT, psz); LocalFree(psz); // //Initialize the icon // SendDlgItemMessage(hDlg,IDC_DRIVE_ICON_LOCATION,STM_SETICON,(WPARAM)pcmi->hDriveIcon,0); // //Initialize the auto launch check box // if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, REGSTR_PATH_FILESYSTEM, 0, KEY_READ, &hk) == ERROR_SUCCESS) { dwLDSDisable = 0; dwType = REG_DWORD; cbBytes = sizeof(dwLDSDisable); if (RegQueryValueEx(hk, REGSTR_VAL_DRIVE_LDS_BDCAST_DISABLE, NULL, &dwType, (LPBYTE)&dwLDSDisable, &cbBytes) == ERROR_SUCCESS) { if (dwLDSDisable & (0x01 << pcmi->dre)) { CheckDlgButton(hDlg, IDC_AUTO_LAUNCH, 0); } else { CheckDlgButton(hDlg, IDC_AUTO_LAUNCH, 1); } } RegCloseKey(hk); } // //Gray out the auto launch option if this is not a fixed disk // if (!GetHardwareType(pcmi->dre, hwType) || (hwType != hwFixed)) { CheckDlgButton(hDlg, IDC_AUTO_LAUNCH, 0); EnableWindow(GetDlgItem(hDlg, IDC_AUTO_LAUNCH), FALSE); } } break; case WM_NOTIFY: switch(((NMHDR *)lParam)->code) { case PSN_APPLY: pcmi = (CleanupMgrInfo *)GetWindowLongPtr (hDlg, DWLP_USER); if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, REGSTR_PATH_FILESYSTEM, 0, KEY_READ | KEY_WRITE, &hk) == ERROR_SUCCESS) { dwLDSDisable = 0; dwType = REG_DWORD; cbBytes = sizeof(dwLDSDisable); if (RegQueryValueEx(hk, REGSTR_VAL_DRIVE_LDS_BDCAST_DISABLE, NULL, &dwType, (LPBYTE)&dwLDSDisable, &cbBytes) == ERROR_SUCCESS) { if (IsDlgButtonChecked(hDlg, IDC_AUTO_LAUNCH)) { dwLDSDisable &= ~(0x01 << pcmi->dre); } else { dwLDSDisable |= (0x01 << pcmi->dre); } RegSetValueEx(hk, REGSTR_VAL_DRIVE_LDS_BDCAST_DISABLE, 0, REG_DWORD, (LPBYTE)&dwLDSDisable, sizeof(dwLDSDisable)); } RegCloseKey(hk); } break; case PSN_RESET: break; } break; case WM_HELP: WinHelp((HWND)((LPHELPINFO) lParam)->hItemHandle, NULL, HELP_WM_HELP, (DWORD_PTR)(LPTSTR) aHelpIDs); return TRUE; case WM_CONTEXTMENU: WinHelp((HWND) wParam, NULL, HELP_CONTEXTMENU, (DWORD_PTR)(LPVOID) aHelpIDs); return TRUE; default: return FALSE; } return TRUE; }