|
|
//////////////////////////////////////////////////////////////////////////////
//
// CLEANUP.CPP / Tuneup
//
// Microsoft Confidential
// Copyright (c) Microsoft Corporation 1998
// All rights reserved
//
// Functions for the cleanup manager task wizard page.
//
// 8/98 - Jason Cohen (JCOHEN)
//
//////////////////////////////////////////////////////////////////////////////
// Internal include files.
//
#include <windows.h>
#include <tchar.h>
//#include <initguid.h>
#include <emptyvc.h>
BOOL GetCleanupSettings(HWND hLB) { HKEY hKeyVolCache, hClientKey; CLSID clsid; LPEMPTYVOLUMECACHE pVolumeCache; LPWSTR wcsDisplayName, wcsDescription; TCHAR szRegKeyName[64]; DWORD iSubKey; TCHAR szVolCacheClient[MAX_PATH]; TCHAR szGUID[MAX_PATH]; DWORD dwGUIDSize, dwType, dwSize, dwRes; BOOL bRet = TRUE; TCHAR szDisplayName[128]; static TCHAR szRoot[] = _T("c:\\"); static TCHAR szRegVolumeCache[] = _T("Software\\Microsoft\\Windows\\CurrentVersion\\explorer\\VolumeCaches");
if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, szRegVolumeCache, 0, KEY_READ, &hKeyVolCache) != ERROR_SUCCESS) return FALSE;
// Enumerate through all of the clients to see how large we need to make the pClientInfo array
//
iSubKey = 0; while ( RegEnumKey(hKeyVolCache, iSubKey, szVolCacheClient, sizeof(szVolCacheClient)) != ERROR_NO_MORE_ITEMS ) iSubKey++; // Fill in the pClientInfo data structure and initialize all of the volume cache clients
//
iSubKey = 0; while ( RegEnumKey(hKeyVolCache, iSubKey++, szVolCacheClient, sizeof(szVolCacheClient)) != ERROR_NO_MORE_ITEMS ) { if ( RegOpenKeyEx(hKeyVolCache, szVolCacheClient, 0, KEY_ALL_ACCESS, &hClientKey) != ERROR_SUCCESS ) continue;
lstrcpy(szRegKeyName, szVolCacheClient);
// Check whether the StateFlags is non zero.
//
wsprintf(szDisplayName, _T("StateFlags%04d"), 0); dwSize = sizeof(DWORD); dwType = REG_DWORD; dwRes = 0; if ( RegQueryValueEx(hClientKey, szDisplayName, NULL, &dwType, (LPBYTE)&dwRes, &dwSize) == ERROR_SUCCESS ) { // StateFlags overrides the flags got from Initialize(), so if it's set explicitly
// as 0, then it's not a selected cleaner.
//
if (dwRes == 0) goto next; } // Get its GUID, call Initialize method to get the display name.
//
dwGUIDSize = sizeof(szGUID); dwType = REG_SZ; if ( RegQueryValueEx(hClientKey, NULL, NULL, &dwType, (LPBYTE)szGUID, &dwGUIDSize) == ERROR_SUCCESS ) { HRESULT hr; WCHAR wcsFmtID[39]; WCHAR wcsRoot[MAX_PATH];
#ifdef _UNICODE
lstrcpy(wcsFmtID, szGUID); #else // _UNICODE
// Convert to Unicode.
//
MultiByteToWideChar(CP_ACP, 0, szGUID, -1, wcsFmtID, 39) ; #endif // _UNICODE
// Convert to GUID.
//
hr = CLSIDFromString((LPOLESTR)wcsFmtID, &clsid); *szDisplayName = 0;
// Create an instance of the COM object for this cleanup client
//
pVolumeCache = NULL; hr = CoCreateInstance(clsid, NULL, CLSCTX_INPROC_SERVER, IID_IEmptyVolumeCache, (void **) &pVolumeCache); if ( SUCCEEDED(hr) ) { // Set the flags to pass to the cleanup client.
//
DWORD dwInitializeFlags = EVCF_SETTINGSMODE;
#ifdef _UNICODE
lstrcpy(wcsRoot, szRoot); #else // _UNICODE
// Convert szRoot to UNICODE.
//
MultiByteToWideChar(CP_ACP, 0, szRoot, -1, wcsRoot, MAX_PATH); #endif // _UNICODE
hr = pVolumeCache->Initialize(hClientKey, (LPCWSTR) wcsRoot, &((LPWSTR) wcsDisplayName), &((LPWSTR) wcsDescription), &dwInitializeFlags);
if ( (dwRes == 0) && !(dwInitializeFlags & EVCF_ENABLEBYDEFAULT_AUTO) ) // dwRes is 0 and still reach here, means there's no StateFlags, we
// reference the dwInitializeFlags at this case
//
goto next;
if ( SUCCEEDED(hr) && (S_OK == hr) && wcsDisplayName) #ifdef _UNICODE
lstrcpy(szDisplayName, wcsDisplayName); #else // _UNICODE
WideCharToMultiByte(CP_ACP, 0, wcsDisplayName, -1, szDisplayName, 128, NULL, NULL); #endif // _UNICODE
else { // If the client did not return the DisplayName via the Initialize
// Interface then we need to get it from the registry.
// First check if their is a "display" value for the client's
// name that is displayed in the list box. If not then use
// the key name itself.
//
dwSize = 128; dwType = REG_SZ; if ( RegQueryValueEx(hClientKey, _T("display"), NULL, &dwType, (LPBYTE)szDisplayName, &dwSize) != ERROR_SUCCESS ) // Count not find "display" value so use the key name instead.
//
lstrcpy(szDisplayName, szVolCacheClient); } }
if (*szDisplayName) SendMessage(hLB, LB_ADDSTRING, 0, (LPARAM)szDisplayName); } next: RegCloseKey(hClientKey); } RegCloseKey(hKeyVolCache); return bRet; }
|