Index: reactos/dll/win32/shell32/wine/shellord.c =================================================================== --- reactos/dll/win32/shell32/wine/shellord.c (revision 73492) +++ reactos/dll/win32/shell32/wine/shellord.c (working copy) @@ -3,7 +3,8 @@ * (NT uses Unicode strings, 95 uses ASCII strings) * * Copyright 1997 Marcus Meissner - * 1998 Jürgen Schmied + * 1998 JEgen Schmied + * 2017 Katayama Hirofumi MZ * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -195,16 +196,236 @@ /************************************************************************* * SHGetSetSettings [SHELL32.68] */ + +static const char AdvancedRegPath[] = + "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced"; + +/* FIXME: These macros should not be defined here */ +#ifndef SSF_FILTER + #define SSF_FILTER 0x00010000 +#endif +#ifndef SSF_WEBVIEW + #define SSF_WEBVIEW 0x00020000 +#endif +#ifndef SSF_SHOWSUPERHIDDEN + #define SSF_SHOWSUPERHIDDEN 0x00040000 +#endif +#ifndef SSF_SEPPROCESS + #define SSF_SEPPROCESS 0x00080000 +#endif + VOID WINAPI SHGetSetSettings(LPSHELLSTATE lpss, DWORD dwMask, BOOL bSet) { - if(bSet) - { - FIXME("%p 0x%08x TRUE\n", lpss, dwMask); - } - else - { - SHGetSettings((LPSHELLFLAGSTATE)lpss,dwMask); - } + HKEY hKey; + DWORD dwData, Size; + + TRACE("(%p 0x%08x)\n", lpss, dwMask); + + /* FIXME: Add more SSF values */ + if (!bSet) + { + if (RegOpenKeyExA(HKEY_CURRENT_USER, AdvancedRegPath, 0, KEY_READ, &hKey)) + return; + + if (SSF_SHOWEXTENSIONS & dwMask) + { + Size = sizeof(DWORD); + if (!RegQueryValueExA(hKey, "HideFileExt", 0, 0, (LPBYTE)&dwData, &Size)) + lpss->fShowExtensions = (dwData == 0); + } + if (SSF_SHOWINFOTIP & dwMask) + { + Size = sizeof(DWORD); + if (!RegQueryValueExA(hKey, "ShowInfoTip", 0, 0, (LPBYTE)&dwData, &Size)) + lpss->fShowInfoTip = (dwData != 0); + } + if (SSF_DONTPRETTYPATH & dwMask) + { + Size = sizeof(DWORD); + if (!RegQueryValueExA(hKey, "DontPrettyPath", 0, 0, (LPBYTE)&dwData, &Size)) + lpss->fDontPrettyPath = (dwData != 0); + } + if (SSF_HIDEICONS & dwMask) + { + Size = sizeof(DWORD); + if (!RegQueryValueExA(hKey, "HideIcons", 0, 0, (LPBYTE)&dwData, &Size)) + lpss->fHideIcons = (dwData != 0); + } + if (SSF_MAPNETDRVBUTTON & dwMask) + { + Size = sizeof(DWORD); + if (!RegQueryValueExA(hKey, "MapNetDrvBtn", 0, 0, (LPBYTE)&dwData, &Size)) + lpss->fMapNetDrvBtn = (dwData != 0); + } + if (SSF_SHOWATTRIBCOL & dwMask) + { + Size = sizeof(DWORD); + if (!RegQueryValueExA(hKey, "ShowAttribCol", 0, 0, (LPBYTE)&dwData, &Size)) + lpss->fShowAttribCol = (dwData != 0); + } + if ((SSF_SHOWALLOBJECTS | SSF_SHOWSYSFILES) & dwMask) + { + Size = sizeof(DWORD); + if (!RegQueryValueExA(hKey, "Hidden", 0, 0, (LPBYTE)&dwData, &Size)) + { + if (dwData == 0) + { + if (SSF_SHOWALLOBJECTS & dwMask) + lpss->fShowAllObjects = 0; + if (SSF_SHOWSYSFILES & dwMask) + lpss->fShowSysFiles = 0; + } + else if (dwData == 1) + { + if (SSF_SHOWALLOBJECTS & dwMask) + lpss->fShowAllObjects = 1; + if (SSF_SHOWSYSFILES & dwMask) + lpss->fShowSysFiles = 0; + } + else if (dwData == 2) + { + if (SSF_SHOWALLOBJECTS & dwMask) + lpss->fShowAllObjects = 0; + if (SSF_SHOWSYSFILES & dwMask) + lpss->fShowSysFiles = 1; + } + } + } + + if (SSF_WEBVIEW & dwMask) + { + Size = sizeof(DWORD); + if (!RegQueryValueExA(hKey, "WebView", 0, 0, (LPBYTE)&dwData, &Size)) + lpss->fWebView = (dwData != 0); + } + if (SSF_FILTER & dwMask) + { + Size = sizeof(DWORD); + if (!RegQueryValueExA(hKey, "Filter", 0, 0, (LPBYTE)&dwData, &Size)) + lpss->fFilter = (dwData != 0); + } + if (SSF_SHOWSUPERHIDDEN & dwMask) + { + Size = sizeof(DWORD); + if (!RegQueryValueExA(hKey, "SuperHidden", 0, 0, (LPBYTE)&dwData, &Size)) + lpss->fShowSuperHidden = (dwData != 0); + } + if (SSF_SEPPROCESS & dwMask) + { + Size = sizeof(DWORD); + if (!RegQueryValueExA(hKey, "SeparateProcess", 0, 0, (LPBYTE)&dwData, &Size)) + lpss->fSepProcess = (dwData != 0); + } + } + else + { + if (RegOpenKeyExA(HKEY_CURRENT_USER, AdvancedRegPath, 0, + KEY_ALL_ACCESS, &hKey)) + { + return; + } + + Size = sizeof(DWORD); + if (SSF_SHOWEXTENSIONS & dwMask) + { + dwData = (lpss->fShowExtensions == FALSE); + RegSetValueExA(hKey, "HideFileExt", 0, REG_DWORD, (LPBYTE)&dwData, Size); + } + if (SSF_SHOWINFOTIP & dwMask) + { + dwData = (lpss->fShowInfoTip != FALSE); + RegSetValueExA(hKey, "ShowInfoTip", 0, REG_DWORD, (LPBYTE)&dwData, Size); + } + if (SSF_DONTPRETTYPATH & dwMask) + { + dwData = (lpss->fDontPrettyPath != FALSE); + RegSetValueExA(hKey, "DontPrettyPath", 0, REG_DWORD, (LPBYTE)&dwData, Size); + } + if (SSF_HIDEICONS & dwMask) + { + dwData = (lpss->fHideIcons != FALSE); + RegSetValueExA(hKey, "HideIcons", 0, REG_DWORD, (LPBYTE)&dwData, Size); + } + if (SSF_MAPNETDRVBUTTON & dwMask) + { + dwData = (lpss->fMapNetDrvBtn != FALSE); + RegSetValueExA(hKey, "MapNetDrvBtn", 0, REG_DWORD, (LPBYTE)&dwData, Size); + } + if (SSF_SHOWATTRIBCOL & dwMask) + { + dwData = (lpss->fShowAttribCol != FALSE); + RegSetValueExA(hKey, "ShowAttribCol", 0, REG_DWORD, (LPBYTE)&dwData, Size); + } + if ((SSF_SHOWALLOBJECTS | SSF_SHOWSYSFILES) & dwMask) + { + BOOL fShowAllObjects = lpss->fShowAllObjects; + BOOL fShowSysFiles = lpss->fShowSysFiles; + + if (!RegQueryValueExA(hKey, "Hidden", NULL, NULL, (LPBYTE)&dwData, &Size)) + { + if (!(SSF_SHOWALLOBJECTS & dwMask)) + { + switch (dwData) + { + case 0: fShowAllObjects = FALSE; break; + case 1: fShowAllObjects = TRUE; break; + case 2: fShowAllObjects = FALSE; break; + } + } + if (!(SSF_SHOWSYSFILES & dwMask)) + { + switch (dwData) + { + case 0: fShowSysFiles = FALSE; break; + case 1: fShowSysFiles = FALSE; break; + case 2: fShowSysFiles = TRUE; break; + } + } + } + Size = sizeof(DWORD); + + if (!fShowAllObjects && !fShowSysFiles) + { + dwData = 0; + RegSetValueExA(hKey, "Hidden", 0, REG_DWORD, (LPBYTE)&dwData, Size); + } + else if (fShowAllObjects && !fShowSysFiles) + { + dwData = 1; + RegSetValueExA(hKey, "Hidden", 0, REG_DWORD, (LPBYTE)&dwData, Size); + } + else if (!fShowAllObjects && fShowSysFiles) + { + dwData = 2; + RegSetValueExA(hKey, "Hidden", 0, REG_DWORD, (LPBYTE)&dwData, Size); + } + } + + if (SSF_WEBVIEW & dwMask) + { + dwData = (lpss->fWebView != FALSE); + RegSetValueExA(hKey, "WebView", 0, REG_DWORD, (LPBYTE)&dwData, Size); + } + if (SSF_FILTER & dwMask) + { + dwData = (lpss->fFilter != FALSE); + RegSetValueExA(hKey, "Filter", 0, REG_DWORD, (LPBYTE)&dwData, Size); + } + if (SSF_SHOWSUPERHIDDEN & dwMask) + { + dwData = (lpss->fShowSuperHidden != FALSE); + RegSetValueExA(hKey, "SuperHidden", 0, REG_DWORD, (LPBYTE)&dwData, Size); + } + if (SSF_SEPPROCESS & dwMask) + { + dwData = (lpss->fSepProcess != FALSE); + RegSetValueExA(hKey, "SeparateProcess", 0, REG_DWORD, (LPBYTE)&dwData, Size); + } + } + + RegCloseKey(hKey); + + TRACE("-- 0x%04x\n", *(WORD*)lpss); } /************************************************************************* @@ -223,7 +444,7 @@ TRACE("(%p 0x%08x)\n",lpsfs,dwMask); - if (RegCreateKeyExA(HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced", + if (RegCreateKeyExA(HKEY_CURRENT_USER, AdvancedRegPath, 0, 0, 0, KEY_ALL_ACCESS, 0, &hKey, 0)) return;