Update patch to create additional profile directories.

This commit is contained in:
Michael Müller 2014-07-28 02:00:50 +02:00
parent 26302e61a3
commit c0f05edf66
5 changed files with 195 additions and 63 deletions

View File

@ -19,7 +19,8 @@ Wine-compholio contains fixes for the following Wine bugs:
* Add implementation of WTSEnumerateProcessesW ([Wine Bug #29903](http://bugs.winehq.org/show_bug.cgi?id=29903 "Some Microsoft debuggers fail to enumerate processes due to wtsapi32.WTSEnumerateProcessesW() being a stub (Microsoft Visual Studio 2005, DbgCLR from .NET 2.0 SDK)"))
* Allow special characters in pipe names. ([Wine Bug #28995](http://bugs.winehq.org/show_bug.cgi?id=28995 "Unable to use named pipes with \">\" character in the name"))
* Chromium unit test fails in DecryptMessage ([Wine Bug #20748](http://bugs.winehq.org/show_bug.cgi?id=20748 "chromium's net_unittests!SSLClientSocketTest.Read_Interrupted fails."))
* Create AppData\LocalLow in user profile directory ([Wine Bug #22896](http://bugs.winehq.org/show_bug.cgi?id=22896 "Multiple applications and games need support for shell32 FOLDERID_LocalAppDataLow (.NET based Unity Engine games, Java JRE 6 in Vista mode)"))
* Create AppData\LocalLow directory inside the profile directory ([Wine Bug #22896](http://bugs.winehq.org/show_bug.cgi?id=22896 "Multiple applications and games need support for shell32 FOLDERID_LocalAppDataLow (.NET based Unity Engine games, Java JRE 6 in Vista mode)"))
* Create Saved Games directory inside the profile directory ([Wine Bug #28312](http://bugs.winehq.org/show_bug.cgi?id=28312 "Assassin's Creed Brotherhood v1.03 needs \"Saved Games\" folder"))
* Fix for ConnectNamedPort return value in overlapped mode ([Wine Bug #16550](http://bugs.winehq.org/show_bug.cgi?id=16550 "ConnectNamedPort should never return OK in overlapped mode (affects chromium ui_tests.exe)"))
* Fix race conditions and deadlocks in strmbase/quartz ([Wine Bug #31566](http://bugs.winehq.org/show_bug.cgi?id=31566 "Fallout 3: regression causes block at critical section when radio is enabled"))
* GetSecurityInfo returns NULL DACL for process object ([Wine Bug #15980](http://bugs.winehq.org/show_bug.cgi?id=15980 "Rhapsody 2 crashes on startup (GetSecurityInfo returns NULL DACL for process object)"))

View File

@ -503,20 +503,21 @@ shell32-Default_Folder_ACLs.ok:
# Patchset shell32-Register_Folders
# |
# | Included patches:
# | * Create AppData\LocalLow in user profile directory. [by Michael Müller]
# | * Create additional profile directories available in vista and above. [rev 2, by Michael Müller]
# |
# | This patchset fixes the following Wine bugs:
# | * [#22896] Multiple applications and games need support for shell32 FOLDERID_LocalAppDataLow (.NET based Unity Engine
# | games, Java JRE 6 in Vista mode)
# | * [#28312] Assassin's Creed Brotherhood v1.03 needs "Saved Games" folder
# |
# | Modified files:
# | * dlls/shell32/shellpath.c, include/shlobj.h
# |
.INTERMEDIATE: shell32-Register_Folders.ok
shell32-Register_Folders.ok:
$(PATCH) < shell32-Register_Folders/0001-shell32-create-AppData-LocalLow-directory.patch
$(PATCH) < shell32-Register_Folders/0001-shell32-Create-profile-directories-available-in-Vist.patch
@( \
echo '+ { "shell32-Register_Folders", "Michael Müller", "Create AppData\\\\LocalLow in user profile directory." },'; \
echo '+ { "shell32-Register_Folders", "Michael Müller", "Create additional profile directories available in vista and above. [rev 2]" },'; \
) > shell32-Register_Folders.ok
# Patchset shell32-SHCreateSessionKey

View File

@ -0,0 +1,185 @@
From 92dc11a14302d63443d61d5d2a2e0c1da130aa3f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Michael=20M=C3=BCller?= <michael@fds-team.de>
Date: Mon, 28 Jul 2014 01:21:04 +0200
Subject: shell32: Create profile directories available in Vista and above.
---
dlls/shell32/shellpath.c | 58 ++++++++++++++++++++++++++++++++--------------
include/shlobj.h | 9 +++++++
2 files changed, 50 insertions(+), 17 deletions(-)
diff --git a/dlls/shell32/shellpath.c b/dlls/shell32/shellpath.c
index 158b1d1..e7548d1 100644
--- a/dlls/shell32/shellpath.c
+++ b/dlls/shell32/shellpath.c
@@ -1280,10 +1280,10 @@ static const CSIDL_DATA CSIDL_Data[] =
NULL,
NULL
},
- { /* 0x43 */
+ { /* 0x43 - CSIDL_WINE_CONTACTS */
&FOLDERID_Contacts,
CSIDL_Type_User,
- ContactsW,
+ NULL,
ContactsW
},
{ /* 0x44 */
@@ -1304,7 +1304,7 @@ static const CSIDL_DATA CSIDL_Data[] =
NULL,
NULL
},
- { /* 0x47 */
+ { /* 0x47 - CSIDL_WINE_DOWNLOADS */
&FOLDERID_Downloads,
CSIDL_Type_User,
NULL,
@@ -1340,13 +1340,13 @@ static const CSIDL_DATA CSIDL_Data[] =
NULL,
NULL
},
- { /* 0x4d */
+ { /* 0x4d - CSIDL_WINE_LINKS */
&FOLDERID_Links,
CSIDL_Type_User,
NULL,
LinksW
},
- { /* 0x4e */
+ { /* 0x4e - CSIDL_WINE_APPDATA_LOCALLOW */
&FOLDERID_LocalAppDataLow,
CSIDL_Type_User,
NULL,
@@ -1466,13 +1466,13 @@ static const CSIDL_DATA CSIDL_Data[] =
NULL,
Videos_Sample_VideosW
},
- { /* 0x62 */
+ { /* 0x62 - CSIDL_WINE_SAVED_GAMES */
&FOLDERID_SavedGames,
CSIDL_Type_User,
NULL,
Saved_GamesW
},
- { /* 0x63 */
+ { /* 0x63 - CSIDL_WINE_SEARCHES */
&FOLDERID_SavedSearches,
CSIDL_Type_User,
NULL,
@@ -1855,6 +1855,8 @@ static LPWSTR _GetUserSidStringFromToken(HANDLE Token)
static HRESULT _SHGetUserProfilePath(HANDLE hToken, DWORD dwFlags, BYTE folder,
LPWSTR pszPath)
{
+ const WCHAR *szValueName;
+ WCHAR buffer[40];
HRESULT hr;
TRACE("%p,0x%08x,0x%02x,%p\n", hToken, dwFlags, folder, pszPath);
@@ -1897,11 +1899,18 @@ static HRESULT _SHGetUserProfilePath(HANDLE hToken, DWORD dwFlags, BYTE folder,
goto error;
}
}
- hr = _SHGetUserShellFolderPath(hRootKey, userPrefix,
- CSIDL_Data[folder].szValueName, pszPath);
+
+ /* For CSIDL_Type_User we also use the GUID if no szValueName is provided */
+ szValueName = CSIDL_Data[folder].szValueName;
+ if (!szValueName)
+ {
+ StringFromGUID2( CSIDL_Data[folder].id, buffer, 39 );
+ szValueName = &buffer[0];
+ }
+
+ hr = _SHGetUserShellFolderPath(hRootKey, userPrefix, szValueName, pszPath);
if (FAILED(hr) && hRootKey != HKEY_LOCAL_MACHINE)
- hr = _SHGetUserShellFolderPath(HKEY_LOCAL_MACHINE, NULL,
- CSIDL_Data[folder].szValueName, pszPath);
+ hr = _SHGetUserShellFolderPath(HKEY_LOCAL_MACHINE, NULL, szValueName, pszPath);
if (FAILED(hr))
hr = _SHGetDefaultValue(folder, pszPath);
if (userPrefix != NULL && userPrefix != DefaultW)
@@ -2361,6 +2370,8 @@ static HRESULT _SHRegisterFolders(HKEY hRootKey, HANDLE hToken,
LPCWSTR szUserShellFolderPath, LPCWSTR szShellFolderPath, const UINT folders[],
UINT foldersLen)
{
+ const WCHAR *szValueName;
+ WCHAR buffer[40];
UINT i;
WCHAR path[MAX_PATH];
HRESULT hr = S_OK;
@@ -2383,7 +2394,16 @@ static HRESULT _SHRegisterFolders(HKEY hRootKey, HANDLE hToken,
for (i = 0; SUCCEEDED(hr) && i < foldersLen; i++)
{
dwPathLen = MAX_PATH * sizeof(WCHAR);
- if (RegQueryValueExW(hUserKey, CSIDL_Data[folders[i]].szValueName, NULL,
+
+ /* For CSIDL_Type_User we also use the GUID if no szValueName is provided */
+ szValueName = CSIDL_Data[folders[i]].szValueName;
+ if (!szValueName && CSIDL_Data[folders[i]].type == CSIDL_Type_User)
+ {
+ StringFromGUID2( CSIDL_Data[folders[i]].id, buffer, 39 );
+ szValueName = &buffer[0];
+ }
+
+ if (RegQueryValueExW(hUserKey, szValueName, NULL,
&dwType, (LPBYTE)path, &dwPathLen) || (dwType != REG_SZ &&
dwType != REG_EXPAND_SZ))
{
@@ -2407,8 +2427,7 @@ static HRESULT _SHRegisterFolders(HKEY hRootKey, HANDLE hToken,
hr = E_FAIL;
if (*path)
{
- ret = RegSetValueExW(hUserKey,
- CSIDL_Data[folders[i]].szValueName, 0, REG_EXPAND_SZ,
+ ret = RegSetValueExW(hUserKey, szValueName, 0, REG_EXPAND_SZ,
(LPBYTE)path, (strlenW(path) + 1) * sizeof(WCHAR));
if (ret)
hr = HRESULT_FROM_WIN32(ret);
@@ -2416,8 +2435,7 @@ static HRESULT _SHRegisterFolders(HKEY hRootKey, HANDLE hToken,
{
hr = SHGetFolderPathW(NULL, folders[i] | CSIDL_FLAG_CREATE,
hToken, SHGFP_TYPE_DEFAULT, path);
- ret = RegSetValueExW(hKey,
- CSIDL_Data[folders[i]].szValueName, 0, REG_SZ,
+ ret = RegSetValueExW(hKey, szValueName, 0, REG_SZ,
(LPBYTE)path, (strlenW(path) + 1) * sizeof(WCHAR));
if (ret)
hr = HRESULT_FROM_WIN32(ret);
@@ -2457,7 +2475,13 @@ static HRESULT _SHRegisterUserShellFolders(BOOL bDefault)
CSIDL_HISTORY,
CSIDL_MYPICTURES,
CSIDL_FONTS,
- CSIDL_ADMINTOOLS
+ CSIDL_ADMINTOOLS,
+ CSIDL_WINE_CONTACTS,
+ CSIDL_WINE_DOWNLOADS,
+ CSIDL_WINE_LINKS,
+ CSIDL_WINE_APPDATA_LOCALLOW,
+ CSIDL_WINE_SAVED_GAMES,
+ CSIDL_WINE_SEARCHES
};
WCHAR userShellFolderPath[MAX_PATH], shellFolderPath[MAX_PATH];
LPCWSTR pUserShellFolderPath, pShellFolderPath;
diff --git a/include/shlobj.h b/include/shlobj.h
index 9025a73..dcea14e 100644
--- a/include/shlobj.h
+++ b/include/shlobj.h
@@ -1529,6 +1529,15 @@ HRESULT WINAPI SHGetFolderPathW(HWND hwnd, int nFolder, HANDLE hToken, DWORD dwF
#define CSIDL_CDBURN_AREA 0x003b
#define CSIDL_COMPUTERSNEARME 0x003d
#define CSIDL_PROFILES 0x003e
+
+/* Wine internal CSIDLs */
+#define CSIDL_WINE_CONTACTS 0x0043
+#define CSIDL_WINE_DOWNLOADS 0x0047
+#define CSIDL_WINE_LINKS 0x004d
+#define CSIDL_WINE_APPDATA_LOCALLOW 0x004e
+#define CSIDL_WINE_SAVED_GAMES 0x0062
+#define CSIDL_WINE_SEARCHES 0x0063
+
#define CSIDL_FOLDER_MASK 0x00ff
#define CSIDL_FLAG_PER_USER_INIT 0x0800
#define CSIDL_FLAG_NO_ALIAS 0x1000
--
1.7.9.5

View File

@ -1,56 +0,0 @@
From 093b6e556c965b00693148f49ff0b35063cd1d01 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Michael=20M=C3=BCller?= <michael@fds-team.de>
Date: Sun, 27 Jul 2014 02:53:11 +0200
Subject: shell32: create AppData\LocalLow directory
---
dlls/shell32/shellpath.c | 6 ++++--
include/shlobj.h | 1 +
2 files changed, 5 insertions(+), 2 deletions(-)
diff --git a/dlls/shell32/shellpath.c b/dlls/shell32/shellpath.c
index 78487e2..30db774 100644
--- a/dlls/shell32/shellpath.c
+++ b/dlls/shell32/shellpath.c
@@ -772,6 +772,7 @@ static const WCHAR szCurrentVersion[] = {'S','o','f','t','w','a','r','e','\\','M
static const WCHAR Administrative_ToolsW[] = {'A','d','m','i','n','i','s','t','r','a','t','i','v','e',' ','T','o','o','l','s','\0'};
static const WCHAR AppDataW[] = {'A','p','p','D','a','t','a','\0'};
static const WCHAR AppData_LocalLowW[] = {'A','p','p','D','a','t','a','\\','L','o','c','a','l','L','o','w','\0'};
+static const WCHAR AppData_LocalLow_FOLDERIDW[] = {'{','A','5','2','0','A','1','A','4','-','1','7','8','0','-','4','F','F','6','-','B','D','1','8','-','1','6','7','3','4','C','5','A','F','1','6','}','\0'};
static const WCHAR Application_DataW[] = {'A','p','p','l','i','c','a','t','i','o','n',' ','D','a','t','a','\0'};
static const WCHAR CacheW[] = {'C','a','c','h','e','\0'};
static const WCHAR CD_BurningW[] = {'C','D',' ','B','u','r','n','i','n','g','\0'};
@@ -1349,7 +1350,7 @@ static const CSIDL_DATA CSIDL_Data[] =
{ /* 0x4e */
&FOLDERID_LocalAppDataLow,
CSIDL_Type_User,
- NULL,
+ AppData_LocalLow_FOLDERIDW,
AppData_LocalLowW
},
{ /* 0x4f */
@@ -2542,7 +2543,8 @@ static HRESULT _SHRegisterUserShellFolders(BOOL bDefault)
CSIDL_HISTORY,
CSIDL_MYPICTURES,
CSIDL_FONTS,
- CSIDL_ADMINTOOLS
+ CSIDL_ADMINTOOLS,
+ CSIDL_WINE_APPDATA_LOCALLOW
};
WCHAR userShellFolderPath[MAX_PATH], shellFolderPath[MAX_PATH];
LPCWSTR pUserShellFolderPath, pShellFolderPath;
diff --git a/include/shlobj.h b/include/shlobj.h
index 9025a73..1189ae2 100644
--- a/include/shlobj.h
+++ b/include/shlobj.h
@@ -1529,6 +1529,7 @@ HRESULT WINAPI SHGetFolderPathW(HWND hwnd, int nFolder, HANDLE hToken, DWORD dwF
#define CSIDL_CDBURN_AREA 0x003b
#define CSIDL_COMPUTERSNEARME 0x003d
#define CSIDL_PROFILES 0x003e
+#define CSIDL_WINE_APPDATA_LOCALLOW 0x004e
#define CSIDL_FOLDER_MASK 0x00ff
#define CSIDL_FLAG_PER_USER_INIT 0x0800
#define CSIDL_FLAG_NO_ALIAS 0x1000
--
1.8.3.2

View File

@ -1,4 +1,5 @@
Author: Michael Müller
Subject: Create AppData\LocalLow in user profile directory.
Revision: 1
Fixes: [22896] Create AppData\LocalLow in user profile directory
Subject: Create additional profile directories available in vista and above.
Revision: 2
Fixes: [22896] Create AppData\LocalLow directory inside the profile directory
Fixes: [28312] Create Saved Games directory inside the profile directory