[DESK.CPL]

- Only use the minimum required registry rights needed in RegOpenKeyEx and RegCreateKeyEx calls.
- Fix SetDesktopBackColor function where we tried to save the selected desktop background color in the registry only in the case where opening the corresponding registry key actually failed... >_>
  Now we do the right thing!

svn path=/trunk/; revision=71443
This commit is contained in:
Hermès Bélusca-Maïto 2016-05-28 19:12:14 +00:00
parent cc1a5a5932
commit 2047efde02

View file

@ -179,7 +179,6 @@ AddWallpapersFromDirectory(UINT uCounter, HWND hwndBackgroundList, BackgroundIte
LV_ITEM listItem; LV_ITEM listItem;
HIMAGELIST himl; HIMAGELIST himl;
szFileTypes = GdipGetSupportedFileExtensions(); szFileTypes = GdipGetSupportedFileExtensions();
if (!szFileTypes) if (!szFileTypes)
{ {
@ -216,7 +215,6 @@ AddWallpapersFromDirectory(UINT uCounter, HWND hwndBackgroundList, BackgroundIte
sizeof(sfi), sizeof(sfi),
SHGFI_SYSICONINDEX | SHGFI_SMALLICON | SHGFI_SYSICONINDEX | SHGFI_SMALLICON |
SHGFI_DISPLAYNAME); SHGFI_DISPLAYNAME);
if (himl == NULL) if (himl == NULL)
break; break;
@ -332,7 +330,7 @@ AddListViewItems(HWND hwndDlg, PDATA pData)
pData->listViewItemCount++; pData->listViewItemCount++;
/* Add current wallpaper if any */ /* Add current wallpaper if any */
result = RegOpenKeyEx(HKEY_CURRENT_USER, TEXT("Control Panel\\Desktop"), 0, KEY_ALL_ACCESS, &regKey); result = RegOpenKeyEx(HKEY_CURRENT_USER, TEXT("Control Panel\\Desktop"), 0, KEY_QUERY_VALUE, &regKey);
if (result == ERROR_SUCCESS) if (result == ERROR_SUCCESS)
{ {
result = RegQueryValueEx(regKey, TEXT("Wallpaper"), 0, &varType, (LPBYTE)wallpaperFilename, &bufferSize); result = RegQueryValueEx(regKey, TEXT("Wallpaper"), 0, &varType, (LPBYTE)wallpaperFilename, &bufferSize);
@ -376,7 +374,6 @@ AddListViewItems(HWND hwndDlg, PDATA pData)
sizeof(sfi), sizeof(sfi),
SHGFI_SYSICONINDEX | SHGFI_SMALLICON | SHGFI_SYSICONINDEX | SHGFI_SMALLICON |
SHGFI_DISPLAYNAME); SHGFI_DISPLAYNAME);
if (himl != NULL) if (himl != NULL)
{ {
if (i++ == 0) if (i++ == 0)
@ -513,8 +510,8 @@ OnColorButton(HWND hwndDlg, PDATA pData)
LONG res = ERROR_SUCCESS; LONG res = ERROR_SUCCESS;
CHOOSECOLOR cc; CHOOSECOLOR cc;
res = RegCreateKeyEx(HKEY_CURRENT_USER, TEXT("Control Panel\\Appearance"), 0, NULL, 0, res = RegCreateKeyEx(HKEY_CURRENT_USER, TEXT("Control Panel\\Appearance"), 0, NULL,
KEY_ALL_ACCESS, NULL, &hKey, NULL); REG_OPTION_NON_VOLATILE, KEY_QUERY_VALUE, NULL, &hKey, NULL);
/* Now the key is either created or opened existing, if res == ERROR_SUCCESS */ /* Now the key is either created or opened existing, if res == ERROR_SUCCESS */
if (res == ERROR_SUCCESS) if (res == ERROR_SUCCESS)
{ {
@ -554,12 +551,12 @@ OnColorButton(HWND hwndDlg, PDATA pData)
/* Save custom colors to reg. To this moment key must be created already. See above */ /* Save custom colors to reg. To this moment key must be created already. See above */
res = RegOpenKeyEx(HKEY_CURRENT_USER, TEXT("Control Panel\\Appearance"), 0, res = RegOpenKeyEx(HKEY_CURRENT_USER, TEXT("Control Panel\\Appearance"), 0,
KEY_WRITE, &hKey); KEY_SET_VALUE, &hKey);
if (res == ERROR_SUCCESS) if (res == ERROR_SUCCESS)
{ {
/* Key opened */ /* Key opened */
RegSetValueEx(hKey, TEXT("CustomColors"), 0, REG_BINARY, RegSetValueEx(hKey, TEXT("CustomColors"), 0, REG_BINARY,
(const BYTE *)pData->custom_colors, sizeof(pData->custom_colors)); (LPBYTE)pData->custom_colors, sizeof(pData->custom_colors));
RegCloseKey(hKey); RegCloseKey(hKey);
hKey = NULL; hKey = NULL;
} }
@ -907,7 +904,6 @@ SetWallpaper(PDATA pData)
size_t length = 0; size_t length = 0;
GpStatus status; GpStatus status;
if (FAILED(SHGetFolderPath(NULL, CSIDL_LOCAL_APPDATA | CSIDL_FLAG_CREATE, NULL, 0, szWallpaper))) if (FAILED(SHGetFolderPath(NULL, CSIDL_LOCAL_APPDATA | CSIDL_FLAG_CREATE, NULL, 0, szWallpaper)))
{ {
return; return;
@ -918,24 +914,28 @@ SetWallpaper(PDATA pData)
return; return;
} }
RegOpenKeyEx(HKEY_CURRENT_USER, TEXT("Control Panel\\Desktop"), 0, KEY_ALL_ACCESS, &regKey); if (RegCreateKeyEx(HKEY_CURRENT_USER, TEXT("Control Panel\\Desktop"), 0, NULL,
REG_OPTION_NON_VOLATILE, KEY_SET_VALUE, NULL, &regKey, NULL) != ERROR_SUCCESS)
{
return;
}
if (pData->placementSelection == PLACEMENT_TILE) if (pData->placementSelection == PLACEMENT_TILE)
{ {
RegSetValueEx(regKey, TEXT("TileWallpaper"), 0, REG_SZ, (BYTE *)TEXT("1"), sizeof(TCHAR) * 2); RegSetValueEx(regKey, TEXT("TileWallpaper"), 0, REG_SZ, (LPBYTE)TEXT("1"), sizeof(TCHAR) * 2);
RegSetValueEx(regKey, TEXT("WallpaperStyle"), 0, REG_SZ, (BYTE *)TEXT("0"), sizeof(TCHAR) * 2); RegSetValueEx(regKey, TEXT("WallpaperStyle"), 0, REG_SZ, (LPBYTE)TEXT("0"), sizeof(TCHAR) * 2);
} }
if (pData->placementSelection == PLACEMENT_CENTER) if (pData->placementSelection == PLACEMENT_CENTER)
{ {
RegSetValueEx(regKey, TEXT("TileWallpaper"), 0, REG_SZ, (BYTE *)TEXT("0"), sizeof(TCHAR) * 2); RegSetValueEx(regKey, TEXT("TileWallpaper"), 0, REG_SZ, (LPBYTE)TEXT("0"), sizeof(TCHAR) * 2);
RegSetValueEx(regKey, TEXT("WallpaperStyle"), 0, REG_SZ, (BYTE *)TEXT("0"), sizeof(TCHAR) * 2); RegSetValueEx(regKey, TEXT("WallpaperStyle"), 0, REG_SZ, (LPBYTE)TEXT("0"), sizeof(TCHAR) * 2);
} }
if (pData->placementSelection == PLACEMENT_STRETCH) if (pData->placementSelection == PLACEMENT_STRETCH)
{ {
RegSetValueEx(regKey, TEXT("TileWallpaper"), 0, REG_SZ, (BYTE *)TEXT("0"), sizeof(TCHAR) * 2); RegSetValueEx(regKey, TEXT("TileWallpaper"), 0, REG_SZ, (LPBYTE)TEXT("0"), sizeof(TCHAR) * 2);
RegSetValueEx(regKey, TEXT("WallpaperStyle"), 0, REG_SZ, (BYTE *)TEXT("2"), sizeof(TCHAR) * 2); RegSetValueEx(regKey, TEXT("WallpaperStyle"), 0, REG_SZ, (LPBYTE)TEXT("2"), sizeof(TCHAR) * 2);
} }
if (pData->backgroundItems[pData->backgroundSelection].bWallpaper == TRUE) if (pData->backgroundItems[pData->backgroundSelection].bWallpaper == TRUE)
@ -979,7 +979,7 @@ SetWallpaper(PDATA pData)
TEXT("ConvertedWallpaper"), TEXT("ConvertedWallpaper"),
0, 0,
REG_SZ, REG_SZ,
(BYTE*)pData->backgroundItems[pData->backgroundSelection].szFilename, (LPBYTE)pData->backgroundItems[pData->backgroundSelection].szFilename,
(DWORD)((length + 1) * sizeof(TCHAR))); (DWORD)((length + 1) * sizeof(TCHAR)));
} }
@ -989,7 +989,7 @@ SetWallpaper(PDATA pData)
TEXT("OriginalWallpaper"), TEXT("OriginalWallpaper"),
0, 0,
REG_SZ, REG_SZ,
(BYTE *)szWallpaper, (LPBYTE)szWallpaper,
(DWORD)((length + 1) * sizeof(TCHAR))); (DWORD)((length + 1) * sizeof(TCHAR)));
} }
@ -1008,31 +1008,35 @@ SetWallpaper(PDATA pData)
static VOID static VOID
SetDesktopBackColor(HWND hwndDlg, DATA *pData) SetDesktopBackColor(HWND hwndDlg, DATA *pData)
{ {
INT iElement = COLOR_BACKGROUND;
HKEY hKey; HKEY hKey;
LONG result; INT iElement = COLOR_BACKGROUND;
TCHAR clText[16]; TCHAR clText[16];
BYTE red, green, blue; BYTE red, green, blue;
DWORD dwDispostion;
if (!SetSysColors(1, &iElement, &g_GlobalData.desktop_color)) if (!SetSysColors(1, &iElement, &g_GlobalData.desktop_color))
MessageBox(hwndDlg, TEXT("SetSysColor() failed!"), /* these error texts can need internationalization? */
TEXT("Error!"), MB_ICONSTOP );
result = RegCreateKeyEx( HKEY_CURRENT_USER, TEXT("Control Panel\\Colors"), 0, NULL, 0,
KEY_ALL_ACCESS, NULL, &hKey, &dwDispostion );
if (result != ERROR_SUCCESS)
{ {
/* FIXME: these error texts can need internationalization? */
MessageBox(hwndDlg, TEXT("SetSysColor() failed!"),
TEXT("Error!"), MB_ICONSTOP );
}
if (RegCreateKeyEx(HKEY_CURRENT_USER, TEXT("Control Panel\\Colors"), 0, NULL,
REG_OPTION_NON_VOLATILE, KEY_SET_VALUE, NULL, &hKey, NULL) != ERROR_SUCCESS)
{
return;
}
red = GetRValue(g_GlobalData.desktop_color); red = GetRValue(g_GlobalData.desktop_color);
green = GetGValue(g_GlobalData.desktop_color); green = GetGValue(g_GlobalData.desktop_color);
blue = GetBValue(g_GlobalData.desktop_color); blue = GetBValue(g_GlobalData.desktop_color);
/* Format string to be set to registry */ /* Format string to be set to registry */
StringCbPrintf(clText, sizeof(clText), TEXT("%d %d %d"), red, green, blue); StringCbPrintf(clText, sizeof(clText), TEXT("%d %d %d"), red, green, blue);
RegSetValueEx(hKey, TEXT("Background"), 0, REG_SZ, (BYTE *)clText, RegSetValueEx(hKey, TEXT("Background"), 0, REG_SZ, (LPBYTE)clText,
(lstrlen(clText) + 1) * sizeof(TCHAR)); (wcslen(clText) + 1) * sizeof(TCHAR));
RegCloseKey(hKey); RegCloseKey(hKey);
} }
}
INT_PTR CALLBACK INT_PTR CALLBACK
BackgroundPageProc(HWND hwndDlg, BackgroundPageProc(HWND hwndDlg,