Alexandre Julliard : shell32: Use the mount manager for initial shell folders creation.
Alexandre Julliard
julliard at winehq.org
Fri Sep 17 16:03:08 CDT 2021
Module: wine
Branch: master
Commit: d1e1efe0f6cfceb2c6ebe25b815eb1f97e0cb1bb
URL: https://source.winehq.org/git/wine.git/?a=commit;h=d1e1efe0f6cfceb2c6ebe25b815eb1f97e0cb1bb
Author: Alexandre Julliard <julliard at winehq.org>
Date: Fri Sep 17 16:51:31 2021 +0200
shell32: Use the mount manager for initial shell folders creation.
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/shell32/shellpath.c | 53 +++++++++++++++++++++++++++----------------
dlls/shell32/shfldr_desktop.c | 2 +-
2 files changed, 34 insertions(+), 21 deletions(-)
diff --git a/dlls/shell32/shellpath.c b/dlls/shell32/shellpath.c
index d6a1a1df2d6..4c8913b977c 100644
--- a/dlls/shell32/shellpath.c
+++ b/dlls/shell32/shellpath.c
@@ -40,6 +40,9 @@
#include "winreg.h"
#include "wingdi.h"
#include "winuser.h"
+#include "winioctl.h"
+#define WINE_MOUNTMGR_EXTENSIONS
+#include "ddk/mountmgr.h"
#include "shlobj.h"
#include "shtypes.h"
@@ -4127,24 +4130,22 @@ static char *get_xdg_path( const char *var )
return ret;
}
-static BOOL link_folder( const char *target, const char *link )
+static BOOL link_folder( HANDLE mgr, const UNICODE_STRING *path, const char *link )
{
- struct stat st;
- char *dir = NULL;
+ struct mountmgr_shell_folder *ioctl;
+ DWORD len = sizeof(*ioctl) + path->Length + strlen(link) + 1;
BOOL ret;
- if (!strcmp( target, "$HOME" ) || !strncmp( target, "$HOME/", 6 ))
- {
- const char *home = getenv( "HOME" );
+ if (!(ioctl = heap_alloc( len ))) return FALSE;
+ ioctl->create_backup = FALSE;
+ ioctl->folder_offset = sizeof(*ioctl);
+ ioctl->folder_size = path->Length;
+ memcpy( (char *)ioctl + ioctl->folder_offset, path->Buffer, ioctl->folder_size );
+ ioctl->symlink_offset = ioctl->folder_offset + ioctl->folder_size;
+ strcpy( (char *)ioctl + ioctl->symlink_offset, link );
- target += 5;
- dir = heap_alloc( strlen(home) + strlen(target) + 1 );
- strcpy( dir, home );
- strcat( dir, target );
- target = dir;
- }
- if ((ret = !stat( target, &st ) && S_ISDIR( st.st_mode ))) symlink( target, link );
- heap_free( dir );
+ ret = DeviceIoControl( mgr, IOCTL_MOUNTMGR_DEFINE_SHELL_FOLDER, ioctl, len, NULL, 0, NULL, NULL );
+ heap_free( ioctl );
return ret;
}
@@ -4156,22 +4157,34 @@ static BOOL link_folder( const char *target, const char *link )
*/
static void create_link( const WCHAR *path, const char *xdg_name, const char *default_name )
{
- char *target, *link;
+ UNICODE_STRING nt_name;
+ char *target = NULL;
+ HANDLE mgr;
+
+ if ((mgr = CreateFileW( MOUNTMGR_DOS_DEVICE_NAME, GENERIC_READ | GENERIC_WRITE,
+ FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING,
+ 0, 0 )) == INVALID_HANDLE_VALUE)
+ {
+ FIXME( "failed to connect to mount manager\n" );
+ return;
+ }
- if (!(link = wine_get_unix_file_name( path ))) return;
+ nt_name.Buffer = NULL;
+ if (!RtlDosPathNameToNtPathName_U( path, &nt_name, NULL, NULL )) goto done;
if ((target = get_xdg_path( xdg_name )))
{
- if (link_folder( target, link )) goto done;
+ if (link_folder( mgr, &nt_name, target )) goto done;
}
- if (link_folder( default_name, link )) goto done;
+ if (link_folder( mgr, &nt_name, default_name )) goto done;
/* fall back to HOME */
- link_folder( "$HOME", link );
+ link_folder( mgr, &nt_name, "$HOME" );
done:
+ RtlFreeUnicodeString( &nt_name );
heap_free( target );
- heap_free( link );
+ CloseHandle( mgr );
}
/******************************************************************************
diff --git a/dlls/shell32/shfldr_desktop.c b/dlls/shell32/shfldr_desktop.c
index 7c55f02525a..60cea772b01 100644
--- a/dlls/shell32/shfldr_desktop.c
+++ b/dlls/shell32/shfldr_desktop.c
@@ -935,7 +935,7 @@ HRESULT WINAPI ISF_Desktop_Constructor (
{
IDesktopFolderImpl *sf;
- if (!SHGetSpecialFolderPathW( 0, szMyPath, CSIDL_DESKTOPDIRECTORY, TRUE ))
+ if (!SHGetSpecialFolderPathW( 0, szMyPath, CSIDL_DESKTOPDIRECTORY, FALSE ))
return E_UNEXPECTED;
sf = LocalAlloc( LMEM_ZEROINIT, sizeof (IDesktopFolderImpl) );
More information about the wine-cvs
mailing list