diff --git a/patches/ntdll-Junction_Points/0001-ntdll-Add-support-for-junction-point-creation.patch b/patches/ntdll-Junction_Points/0001-ntdll-Add-support-for-junction-point-creation.patch index b4cd950f..e4dc862d 100644 --- a/patches/ntdll-Junction_Points/0001-ntdll-Add-support-for-junction-point-creation.patch +++ b/patches/ntdll-Junction_Points/0001-ntdll-Add-support-for-junction-point-creation.patch @@ -1,4 +1,4 @@ -From e4f4a5fdd7688699cabbe98bedf1314df6bca246 Mon Sep 17 00:00:00 2001 +From 87bbbc7d6c67c2ec3e13f84a7eecccb71e486ac0 Mon Sep 17 00:00:00 2001 From: "Erich E. Hoover" Date: Thu, 16 Jan 2014 20:56:49 -0700 Subject: ntdll: Add support for junction point creation. @@ -6,22 +6,22 @@ Subject: ntdll: Add support for junction point creation. Signed-off-by: Erich E. Hoover --- configure.ac | 2 + - dlls/ntdll/file.c | 116 ++++++++++++++++++++++++++++++++++++++++ + dlls/ntdll/file.c | 118 ++++++++++++++++++++++++++++++++++++++++ dlls/ntdll/tests/file.c | 101 ++++++++++++++++++++++++++++++++++ include/Makefile.in | 1 + - include/ntifs.h | 42 +++++++++++++++ - include/wine/port.h | 9 ++++ + include/ntifs.h | 42 ++++++++++++++ + include/wine/port.h | 9 +++ libs/port/Makefile.in | 1 + libs/port/renameat2.c | 55 +++++++++++++++++++ - 8 files changed, 327 insertions(+) + 8 files changed, 329 insertions(+) create mode 100644 include/ntifs.h create mode 100644 libs/port/renameat2.c diff --git a/configure.ac b/configure.ac -index c2f97e0f7d..10c60429e6 100644 +index d1502bacf7..84307f0f54 100644 --- a/configure.ac +++ b/configure.ac -@@ -2189,6 +2189,8 @@ AC_CHECK_FUNCS(\ +@@ -2207,6 +2207,8 @@ AC_CHECK_FUNCS(\ pwrite \ readdir \ readlink \ @@ -31,7 +31,7 @@ index c2f97e0f7d..10c60429e6 100644 select \ setproctitle \ diff --git a/dlls/ntdll/file.c b/dlls/ntdll/file.c -index 3dafdcfb44..5f2da14398 100644 +index 3dafdcfb44..c0992ea657 100644 --- a/dlls/ntdll/file.c +++ b/dlls/ntdll/file.c @@ -21,6 +21,7 @@ @@ -50,7 +50,7 @@ index 3dafdcfb44..5f2da14398 100644 WINE_DEFAULT_DEBUG_CHANNEL(ntdll); WINE_DECLARE_DEBUG_CHANNEL(winediag); -@@ -1648,6 +1650,102 @@ NTSTATUS WINAPI NtDeviceIoControlFile(HANDLE handle, HANDLE event, +@@ -1648,6 +1650,104 @@ NTSTATUS WINAPI NtDeviceIoControlFile(HANDLE handle, HANDLE event, } @@ -64,7 +64,7 @@ index 3dafdcfb44..5f2da14398 100644 + int dest_len = buffer->MountPointReparseBuffer.SubstituteNameLength; + int offset = buffer->MountPointReparseBuffer.SubstituteNameOffset; + WCHAR *dest = &buffer->MountPointReparseBuffer.PathBuffer[offset]; -+ char tmpdir[PATH_MAX], tmplink[PATH_MAX]; ++ char tmpdir[PATH_MAX], tmplink[PATH_MAX], *d; + ANSI_STRING unix_src, unix_dest; + char magic_dest[PATH_MAX]; + int dest_fd, needs_close; @@ -80,7 +80,8 @@ index 3dafdcfb44..5f2da14398 100644 + src_allocated = TRUE; + nt_dest.Buffer = dest; + nt_dest.Length = dest_len; -+ if ((status = wine_nt_to_unix_file_name( &nt_dest, &unix_dest, FILE_OPEN, FALSE ))) ++ status = wine_nt_to_unix_file_name( &nt_dest, &unix_dest, 0, FALSE ); ++ if (status != STATUS_SUCCESS && status != STATUS_NO_SUCH_FILE) + goto cleanup; + dest_allocated = TRUE; + @@ -98,7 +99,8 @@ index 3dafdcfb44..5f2da14398 100644 + + /* Produce the link in a temporary location in the same folder */ + strcpy( tmpdir, unix_src.Buffer ); -+ dirname( tmpdir) ; ++ d = dirname( tmpdir); ++ if (d != tmpdir) strcpy( tmpdir, d ); + strcat( tmpdir, "/.winelink.XXXXXX" ); + if (mkdtemp( tmpdir ) == NULL) + { @@ -153,7 +155,7 @@ index 3dafdcfb44..5f2da14398 100644 /************************************************************************** * NtFsControlFile [NTDLL.@] * ZwFsControlFile [NTDLL.@] -@@ -1732,6 +1830,24 @@ NTSTATUS WINAPI NtFsControlFile(HANDLE handle, HANDLE event, PIO_APC_ROUTINE apc +@@ -1732,6 +1832,24 @@ NTSTATUS WINAPI NtFsControlFile(HANDLE handle, HANDLE event, PIO_APC_ROUTINE apc io->Information = 0; status = STATUS_SUCCESS; break; @@ -303,10 +305,10 @@ index 8e54dbb541..322dadefe3 100644 + test_reparse_points(); } diff --git a/include/Makefile.in b/include/Makefile.in -index 09c84d8254..616f265900 100644 +index 4a0f927082..519a34c856 100644 --- a/include/Makefile.in +++ b/include/Makefile.in -@@ -479,6 +479,7 @@ SOURCES = \ +@@ -480,6 +480,7 @@ SOURCES = \ ntddvdeo.h \ ntdef.h \ ntdsapi.h \ diff --git a/patches/ntdll-Junction_Points/0002-ntdll-Add-support-for-reading-junction-points.patch b/patches/ntdll-Junction_Points/0002-ntdll-Add-support-for-reading-junction-points.patch index 1305e2dd..4b873882 100644 --- a/patches/ntdll-Junction_Points/0002-ntdll-Add-support-for-reading-junction-points.patch +++ b/patches/ntdll-Junction_Points/0002-ntdll-Add-support-for-reading-junction-points.patch @@ -1,4 +1,4 @@ -From 7c01bde97a63851a367aa0bd76c9aee398857b4e Mon Sep 17 00:00:00 2001 +From 38245bc3099137dd16dc78e3f41c6d50b7f0f804 Mon Sep 17 00:00:00 2001 From: "Erich E. Hoover" Date: Thu, 16 Jan 2014 20:57:57 -0700 Subject: ntdll: Add support for reading junction points. @@ -10,10 +10,10 @@ Signed-off-by: Erich E. Hoover 2 files changed, 119 insertions(+), 1 deletion(-) diff --git a/dlls/ntdll/file.c b/dlls/ntdll/file.c -index 5f2da14398..ee561d9268 100644 +index c0992ea657..e0984b4567 100644 --- a/dlls/ntdll/file.c +++ b/dlls/ntdll/file.c -@@ -1746,6 +1746,106 @@ cleanup: +@@ -1748,6 +1748,106 @@ cleanup: } @@ -120,7 +120,7 @@ index 5f2da14398..ee561d9268 100644 /************************************************************************** * NtFsControlFile [NTDLL.@] * ZwFsControlFile [NTDLL.@] -@@ -1831,6 +1931,12 @@ NTSTATUS WINAPI NtFsControlFile(HANDLE handle, HANDLE event, PIO_APC_ROUTINE apc +@@ -1833,6 +1933,12 @@ NTSTATUS WINAPI NtFsControlFile(HANDLE handle, HANDLE event, PIO_APC_ROUTINE apc status = STATUS_SUCCESS; break; diff --git a/patches/ntdll-Junction_Points/0003-ntdll-Add-support-for-deleting-junction-points.patch b/patches/ntdll-Junction_Points/0003-ntdll-Add-support-for-deleting-junction-points.patch index d124cc74..9e39d5f8 100644 --- a/patches/ntdll-Junction_Points/0003-ntdll-Add-support-for-deleting-junction-points.patch +++ b/patches/ntdll-Junction_Points/0003-ntdll-Add-support-for-deleting-junction-points.patch @@ -1,20 +1,20 @@ -From 8e8839dfe0b2eeae7b0d124b65725257792e3813 Mon Sep 17 00:00:00 2001 +From 9f0a95668d86bacd6cd006e6fe6c6d463cfb5e9b Mon Sep 17 00:00:00 2001 From: "Erich E. Hoover" Date: Thu, 16 Jan 2014 21:00:21 -0700 Subject: ntdll: Add support for deleting junction points. Signed-off-by: Erich E. Hoover --- - dlls/ntdll/file.c | 96 +++++++++++++++++++++++++++++++++++++++++ + dlls/ntdll/file.c | 97 +++++++++++++++++++++++++++++++++++++++++ dlls/ntdll/tests/file.c | 23 +++++++++- - include/ntifs.h | 12 ++++++ - 3 files changed, 130 insertions(+), 1 deletion(-) + include/ntifs.h | 12 +++++ + 3 files changed, 131 insertions(+), 1 deletion(-) diff --git a/dlls/ntdll/file.c b/dlls/ntdll/file.c -index ee561d9268..1730d816d9 100644 +index e0984b4567..54768695b3 100644 --- a/dlls/ntdll/file.c +++ b/dlls/ntdll/file.c -@@ -1846,6 +1846,86 @@ cleanup: +@@ -1848,6 +1848,87 @@ cleanup: } @@ -24,7 +24,7 @@ index ee561d9268..1730d816d9 100644 + */ +NTSTATUS FILE_RemoveSymlink(HANDLE handle, REPARSE_GUID_DATA_BUFFER *buffer) +{ -+ char tmpdir[PATH_MAX], tmpfile[PATH_MAX]; ++ char tmpdir[PATH_MAX], tmpfile[PATH_MAX], *d; + BOOL tempdir_created = FALSE; + int dest_fd, needs_close; + ANSI_STRING unix_name; @@ -46,7 +46,8 @@ index ee561d9268..1730d816d9 100644 + goto cleanup; + } + strcpy( tmpdir, unix_name.Buffer ); -+ dirname( tmpdir) ; ++ d = dirname( tmpdir); ++ if (d != tmpdir) strcpy( tmpdir, d ); + strcat( tmpdir, "/.winelink.XXXXXX" ); + if (mkdtemp( tmpdir ) == NULL) + { @@ -101,7 +102,7 @@ index ee561d9268..1730d816d9 100644 /************************************************************************** * NtFsControlFile [NTDLL.@] * ZwFsControlFile [NTDLL.@] -@@ -1931,6 +2011,22 @@ NTSTATUS WINAPI NtFsControlFile(HANDLE handle, HANDLE event, PIO_APC_ROUTINE apc +@@ -1933,6 +2014,22 @@ NTSTATUS WINAPI NtFsControlFile(HANDLE handle, HANDLE event, PIO_APC_ROUTINE apc status = STATUS_SUCCESS; break; diff --git a/patches/ntdll-Junction_Points/0004-ntdll-Add-a-test-for-junction-point-advertisement.patch b/patches/ntdll-Junction_Points/0004-ntdll-Add-a-test-for-junction-point-advertisement.patch index 14c6d51e..b71cff04 100644 --- a/patches/ntdll-Junction_Points/0004-ntdll-Add-a-test-for-junction-point-advertisement.patch +++ b/patches/ntdll-Junction_Points/0004-ntdll-Add-a-test-for-junction-point-advertisement.patch @@ -1,4 +1,4 @@ -From c94b245b19d852b13048227551641c655c591da1 Mon Sep 17 00:00:00 2001 +From 52fb88dc16f22188dd2b3800fc1cd0034dbd118e Mon Sep 17 00:00:00 2001 From: "Erich E. Hoover" Date: Thu, 16 Jan 2014 21:01:25 -0700 Subject: ntdll: Add a test for junction point advertisement. diff --git a/patches/ntdll-Junction_Points/0005-kernel32-ntdll-Add-support-for-deleting-junction-poi.patch b/patches/ntdll-Junction_Points/0005-kernel32-ntdll-Add-support-for-deleting-junction-poi.patch index caf7c103..e16101ff 100644 --- a/patches/ntdll-Junction_Points/0005-kernel32-ntdll-Add-support-for-deleting-junction-poi.patch +++ b/patches/ntdll-Junction_Points/0005-kernel32-ntdll-Add-support-for-deleting-junction-poi.patch @@ -1,4 +1,4 @@ -From 8b1d430506bf0127a4782594937e1ae1505d64f0 Mon Sep 17 00:00:00 2001 +From db064094e068f3e6434f4b4302c5b2eadf8395ef Mon Sep 17 00:00:00 2001 From: "Erich E. Hoover" Date: Thu, 16 Jan 2014 21:02:11 -0700 Subject: kernel32,ntdll: Add support for deleting junction points with @@ -11,7 +11,7 @@ Signed-off-by: Erich E. Hoover 2 files changed, 46 insertions(+), 8 deletions(-) diff --git a/dlls/kernel32/path.c b/dlls/kernel32/path.c -index cf1c768970..6369225b3e 100644 +index b8f49bd597..76a9512c77 100644 --- a/dlls/kernel32/path.c +++ b/dlls/kernel32/path.c @@ -1696,6 +1696,7 @@ BOOL WINAPI CreateDirectoryExW( LPCWSTR template, LPCWSTR path, LPSECURITY_ATTRI diff --git a/patches/ntdll-Junction_Points/0006-kernel32-Advertise-junction-point-support.patch b/patches/ntdll-Junction_Points/0006-kernel32-Advertise-junction-point-support.patch index 905e3983..ab5eb977 100644 --- a/patches/ntdll-Junction_Points/0006-kernel32-Advertise-junction-point-support.patch +++ b/patches/ntdll-Junction_Points/0006-kernel32-Advertise-junction-point-support.patch @@ -1,24 +1,120 @@ -From 602c311b76c08f4d06c71ee0925ea7c3329d7d73 Mon Sep 17 00:00:00 2001 +From aa5ad3e25315a3ca2113df9a80e178fdfef58296 Mon Sep 17 00:00:00 2001 From: "Erich E. Hoover" Date: Thu, 16 Jan 2014 21:03:47 -0700 Subject: kernel32: Advertise junction point support. Signed-off-by: Erich E. Hoover --- - dlls/kernel32/volume.c | 3 ++- - 1 file changed, 2 insertions(+), 1 deletion(-) + dlls/kernel32/volume.c | 85 +++++++++++++++++++++++++++++++++++++++++- + 1 file changed, 84 insertions(+), 1 deletion(-) diff --git a/dlls/kernel32/volume.c b/dlls/kernel32/volume.c -index 12084369cb..b8ab8896b9 100644 +index 12084369cb..76bb32b850 100644 --- a/dlls/kernel32/volume.c +++ b/dlls/kernel32/volume.c -@@ -824,7 +824,8 @@ fill_fs_info: /* now fill in the information that depends on the file system ty +@@ -44,6 +44,19 @@ + #include "wine/unicode.h" + #include "wine/debug.h" + ++#ifdef HAVE_SYS_MOUNT_H ++# include ++#endif ++#ifdef HAVE_SYS_STATFS_H ++# include ++#endif ++#ifdef HAVE_SYS_SYSCALL_H ++# include ++#endif ++#ifdef HAVE_SYS_VFS_H ++# include ++#endif ++ + WINE_DEFAULT_DEBUG_CHANNEL(volume); + + #define BLOCK_SIZE 2048 +@@ -680,6 +693,75 @@ static DWORD VOLUME_GetAudioCDSerial( const CDROM_TOC *toc ) + } + + ++static DWORD WINAPI get_fs_flags( UNICODE_STRING *nt_name ) ++{ ++#if defined(__NR_renameat2) || defined(RENAME_SWAP) ++ ANSI_STRING unix_name; ++#if defined(HAVE_FSTATFS) ++ struct statfs stfs; ++#elif defined(HAVE_FSTATVFS) ++ struct statvfs stfs; ++#endif ++ NTSTATUS status; ++ DWORD flags = 0; ++ ++ status = wine_nt_to_unix_file_name( nt_name, &unix_name, FILE_OPEN, FALSE ); ++ if (status != STATUS_SUCCESS) ++ return flags; ++#if defined(HAVE_FSTATFS) ++ if (statfs(unix_name.Buffer, &stfs)) ++ return flags; ++#elif defined(HAVE_FSTATVFS) ++ if (statvfs(unix_name.Buffer, &stfs)) ++ return flags; ++#endif ++#if defined(HAVE_FSTATFS) && defined(linux) ++ switch (stfs.f_type) ++ { ++ case 0x6969: /* nfs */ ++ case 0xff534d42: /* cifs */ ++ case 0x564c: /* ncpfs */ ++ case 0x01021994: /* tmpfs */ ++ case 0x28cd3d45: /* cramfs */ ++ case 0x1373: /* devfs */ ++ case 0x9fa0: /* procfs */ ++ case 0xef51: /* old ext2 */ ++ case 0xef53: /* ext2/3/4 */ ++ case 0x4244: /* hfs */ ++ case 0xf995e849: /* hpfs */ ++ case 0x5346544e: /* ntfs */ ++ flags |= FILE_SUPPORTS_REPARSE_POINTS; ++ break; ++ default: ++ break; ++ } ++#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__OpenBSD__) || defined(__DragonFly__) || defined(__APPLE__) || defined(__NetBSD__) ++ if (!strcmp("apfs", stfs.f_fstypename) || ++ !strcmp("nfs", stfs.f_fstypename) || ++ !strcmp("cifs", stfs.f_fstypename) || ++ !strcmp("ncpfs", stfs.f_fstypename) || ++ !strcmp("tmpfs", stfs.f_fstypename) || ++ !strcmp("cramfs", stfs.f_fstypename) || ++ !strcmp("devfs", stfs.f_fstypename) || ++ !strcmp("procfs", stfs.f_fstypename) || ++ !strcmp("ext2", stfs.f_fstypename) || ++ !strcmp("ext3", stfs.f_fstypename) || ++ !strcmp("ext4", stfs.f_fstypename) || ++ !strcmp("hfs", stfs.f_fstypename) || ++ !strcmp("hpfs", stfs.f_fstypename) || ++ !strcmp("ntfs", stfs.f_fstypename)) ++ { ++ flags |= FILE_SUPPORTS_REPARSE_POINTS; ++ } ++#endif ++ RtlFreeAnsiString( &unix_name ); ++ return flags; ++#else ++ return 0; ++#endif ++} ++ ++ + /*********************************************************************** + * GetVolumeInformationW (KERNEL32.@) + */ +@@ -824,7 +906,8 @@ fill_fs_info: /* now fill in the information that depends on the file system ty default: if (fsname) lstrcpynW( fsname, ntfsW, fsname_len ); if (filename_len) *filename_len = 255; - if (flags) *flags = FILE_CASE_PRESERVED_NAMES | FILE_PERSISTENT_ACLS; + if (flags) *flags = FILE_CASE_PRESERVED_NAMES | FILE_PERSISTENT_ACLS -+ | FILE_SUPPORTS_REPARSE_POINTS; ++ | get_fs_flags( &nt_name ); break; } ret = TRUE; diff --git a/patches/ntdll-Junction_Points/0007-ntdll-Add-support-for-absolute-symlink-creation.patch b/patches/ntdll-Junction_Points/0007-ntdll-Add-support-for-absolute-symlink-creation.patch index b095e539..524113db 100644 --- a/patches/ntdll-Junction_Points/0007-ntdll-Add-support-for-absolute-symlink-creation.patch +++ b/patches/ntdll-Junction_Points/0007-ntdll-Add-support-for-absolute-symlink-creation.patch @@ -1,4 +1,4 @@ -From 6c1d1b1d7819118d3511aaa314a8e3da05f4c7ea Mon Sep 17 00:00:00 2001 +From 8547ee103b062ae2c8e1a5fd058ea3e9dc8a2146 Mon Sep 17 00:00:00 2001 From: "Erich E. Hoover" Date: Thu, 16 Jan 2014 21:06:24 -0700 Subject: ntdll: Add support for absolute symlink creation. @@ -11,7 +11,7 @@ Signed-off-by: Erich E. Hoover 3 files changed, 139 insertions(+), 15 deletions(-) diff --git a/dlls/ntdll/file.c b/dlls/ntdll/file.c -index 1730d816d9..78ea4c5b00 100644 +index 54768695b3..18630c12c9 100644 --- a/dlls/ntdll/file.c +++ b/dlls/ntdll/file.c @@ -1657,17 +1657,33 @@ NTSTATUS WINAPI NtDeviceIoControlFile(HANDLE handle, HANDLE event, @@ -21,7 +21,7 @@ index 1730d816d9..78ea4c5b00 100644 - int dest_len = buffer->MountPointReparseBuffer.SubstituteNameLength; - int offset = buffer->MountPointReparseBuffer.SubstituteNameOffset; - WCHAR *dest = &buffer->MountPointReparseBuffer.PathBuffer[offset]; - char tmpdir[PATH_MAX], tmplink[PATH_MAX]; + char tmpdir[PATH_MAX], tmplink[PATH_MAX], *d; ANSI_STRING unix_src, unix_dest; char magic_dest[PATH_MAX]; int dest_fd, needs_close; @@ -51,7 +51,7 @@ index 1730d816d9..78ea4c5b00 100644 if ((status = server_get_unix_fd( handle, FILE_SPECIAL_ACCESS, &dest_fd, &needs_close, NULL, NULL ))) return status; -@@ -1690,6 +1706,18 @@ NTSTATUS FILE_CreateSymlink(HANDLE handle, REPARSE_DATA_BUFFER *buffer) +@@ -1691,6 +1707,18 @@ NTSTATUS FILE_CreateSymlink(HANDLE handle, REPARSE_DATA_BUFFER *buffer) strcat( magic_dest, "." ); strcat( magic_dest, "/" ); } @@ -70,7 +70,7 @@ index 1730d816d9..78ea4c5b00 100644 strcat( magic_dest, unix_dest.Buffer ); /* Produce the link in a temporary location in the same folder */ -@@ -2040,6 +2068,7 @@ NTSTATUS WINAPI NtFsControlFile(HANDLE handle, HANDLE event, PIO_APC_ROUTINE apc +@@ -2043,6 +2071,7 @@ NTSTATUS WINAPI NtFsControlFile(HANDLE handle, HANDLE event, PIO_APC_ROUTINE apc switch(buffer->ReparseTag) { case IO_REPARSE_TAG_MOUNT_POINT: diff --git a/patches/ntdll-Junction_Points/0008-ntdll-Add-support-for-reading-absolute-symlinks.patch b/patches/ntdll-Junction_Points/0008-ntdll-Add-support-for-reading-absolute-symlinks.patch index 17528103..2403c11b 100644 --- a/patches/ntdll-Junction_Points/0008-ntdll-Add-support-for-reading-absolute-symlinks.patch +++ b/patches/ntdll-Junction_Points/0008-ntdll-Add-support-for-reading-absolute-symlinks.patch @@ -1,4 +1,4 @@ -From 498e0feb3c25f92c9930e4007259b12c6ff4e567 Mon Sep 17 00:00:00 2001 +From b9fa01baf73dc3975bd56b9b0ce0d26eddb45e81 Mon Sep 17 00:00:00 2001 From: "Erich E. Hoover" Date: Wed, 13 Mar 2019 12:55:20 -0600 Subject: ntdll: Add support for reading absolute symlinks. @@ -10,10 +10,10 @@ Signed-off-by: Erich E. Hoover 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/dlls/ntdll/file.c b/dlls/ntdll/file.c -index 78ea4c5b00..812bfd0e36 100644 +index 18630c12c9..80d3e9b089 100644 --- a/dlls/ntdll/file.c +++ b/dlls/ntdll/file.c -@@ -1787,6 +1787,7 @@ NTSTATUS FILE_GetSymlink(HANDLE handle, REPARSE_DATA_BUFFER *buffer, ULONG out_s +@@ -1789,6 +1789,7 @@ NTSTATUS FILE_GetSymlink(HANDLE handle, REPARSE_DATA_BUFFER *buffer, ULONG out_s UNICODE_STRING nt_dest; DWORD max_length; NTSTATUS status; @@ -21,7 +21,7 @@ index 78ea4c5b00..812bfd0e36 100644 INT prefix_len; ssize_t ret; char *p; -@@ -1833,6 +1834,17 @@ NTSTATUS FILE_GetSymlink(HANDLE handle, REPARSE_DATA_BUFFER *buffer, ULONG out_s +@@ -1835,6 +1836,17 @@ NTSTATUS FILE_GetSymlink(HANDLE handle, REPARSE_DATA_BUFFER *buffer, ULONG out_s } buffer->ReparseTag |= (val << i); } @@ -39,7 +39,7 @@ index 78ea4c5b00..812bfd0e36 100644 unix_dest.Length -= (p - unix_dest.Buffer); memmove(unix_dest.Buffer, p, unix_dest.Length); -@@ -1851,6 +1863,16 @@ NTSTATUS FILE_GetSymlink(HANDLE handle, REPARSE_DATA_BUFFER *buffer, ULONG out_s +@@ -1853,6 +1865,16 @@ NTSTATUS FILE_GetSymlink(HANDLE handle, REPARSE_DATA_BUFFER *buffer, ULONG out_s buffer->MountPointReparseBuffer.PrintNameLength = nt_dest.Length - prefix_len*sizeof(WCHAR); print_name = &buffer->MountPointReparseBuffer.PathBuffer[buffer->MountPointReparseBuffer.PrintNameOffset/sizeof(WCHAR)]; break; diff --git a/patches/ntdll-Junction_Points/0009-ntdll-Add-support-for-deleting-symlinks.patch b/patches/ntdll-Junction_Points/0009-ntdll-Add-support-for-deleting-symlinks.patch index 7da60739..e653b8a6 100644 --- a/patches/ntdll-Junction_Points/0009-ntdll-Add-support-for-deleting-symlinks.patch +++ b/patches/ntdll-Junction_Points/0009-ntdll-Add-support-for-deleting-symlinks.patch @@ -1,4 +1,4 @@ -From c32fc6d0a84e857f17c1c51af9bab5aab6a5ff1e Mon Sep 17 00:00:00 2001 +From 90921ac6aba0f98fb9b33104c82d77e07cc82278 Mon Sep 17 00:00:00 2001 From: "Erich E. Hoover" Date: Wed, 13 Mar 2019 13:02:22 -0600 Subject: ntdll: Add support for deleting symlinks. @@ -10,10 +10,10 @@ Signed-off-by: Erich E. Hoover 2 files changed, 17 insertions(+) diff --git a/dlls/ntdll/file.c b/dlls/ntdll/file.c -index 812bfd0e36..262d24b9d2 100644 +index 80d3e9b089..60affd59a2 100644 --- a/dlls/ntdll/file.c +++ b/dlls/ntdll/file.c -@@ -2068,6 +2068,7 @@ NTSTATUS WINAPI NtFsControlFile(HANDLE handle, HANDLE event, PIO_APC_ROUTINE apc +@@ -2071,6 +2071,7 @@ NTSTATUS WINAPI NtFsControlFile(HANDLE handle, HANDLE event, PIO_APC_ROUTINE apc switch(buffer->ReparseTag) { case IO_REPARSE_TAG_MOUNT_POINT: diff --git a/patches/ntdll-Junction_Points/0010-ntdll-Add-support-for-relative-symlink-creation.patch b/patches/ntdll-Junction_Points/0010-ntdll-Add-support-for-relative-symlink-creation.patch index f5108871..2c9a0ac8 100644 --- a/patches/ntdll-Junction_Points/0010-ntdll-Add-support-for-relative-symlink-creation.patch +++ b/patches/ntdll-Junction_Points/0010-ntdll-Add-support-for-relative-symlink-creation.patch @@ -1,17 +1,17 @@ -From 273149c2baf56e80063a33ebb5d143819a138436 Mon Sep 17 00:00:00 2001 +From 4cfe8631a57057a13afa650f41576c8c3ae465d5 Mon Sep 17 00:00:00 2001 From: "Erich E. Hoover" Date: Thu, 11 Apr 2019 12:16:49 -0600 Subject: ntdll: Add support for relative symlink creation. Signed-off-by: Erich E. Hoover --- - dlls/ntdll/file.c | 57 ++++++++++++++++++++++++++++++++++++----- - dlls/ntdll/tests/file.c | 30 +++++++++++++++++----- + dlls/ntdll/file.c | 58 ++++++++++++++++++++++++++++++++++++----- + dlls/ntdll/tests/file.c | 30 ++++++++++++++++----- include/ntifs.h | 2 ++ - 3 files changed, 76 insertions(+), 13 deletions(-) + 3 files changed, 77 insertions(+), 13 deletions(-) diff --git a/dlls/ntdll/file.c b/dlls/ntdll/file.c -index 262d24b9d2..186156159c 100644 +index 60affd59a2..8487bb5158 100644 --- a/dlls/ntdll/file.c +++ b/dlls/ntdll/file.c @@ -1656,16 +1656,19 @@ NTSTATUS WINAPI NtDeviceIoControlFile(HANDLE handle, HANDLE event, @@ -21,9 +21,9 @@ index 262d24b9d2..186156159c 100644 - BOOL src_allocated = FALSE, dest_allocated = FALSE, tempdir_created = FALSE; + BOOL src_allocated = FALSE, path_allocated = FALSE, dest_allocated = FALSE; + BOOL nt_dest_allocated = FALSE, tempdir_created = FALSE; -+ ANSI_STRING unix_src, unix_dest, unix_path; - char tmpdir[PATH_MAX], tmplink[PATH_MAX]; + char tmpdir[PATH_MAX], tmplink[PATH_MAX], *d; - ANSI_STRING unix_src, unix_dest; ++ ANSI_STRING unix_src, unix_dest, unix_path; char magic_dest[PATH_MAX]; int dest_fd, needs_close; + int relative_offset = 0; @@ -50,7 +50,7 @@ index 262d24b9d2..186156159c 100644 break; default: return STATUS_NOT_IMPLEMENTED; -@@ -1690,16 +1695,52 @@ NTSTATUS FILE_CreateSymlink(HANDLE handle, REPARSE_DATA_BUFFER *buffer) +@@ -1690,17 +1695,54 @@ NTSTATUS FILE_CreateSymlink(HANDLE handle, REPARSE_DATA_BUFFER *buffer) if ((status = server_get_unix_name( handle, &unix_src ))) goto cleanup; src_allocated = TRUE; @@ -64,7 +64,8 @@ index 262d24b9d2..186156159c 100644 + unix_path.Buffer = RtlAllocateHeap( GetProcessHeap(), 0, unix_path.MaximumLength ); + path_allocated = TRUE; + strcpy( unix_path.Buffer, unix_src.Buffer ); -+ dirname( unix_path.Buffer ); ++ d = dirname( unix_path.Buffer ); ++ if (d != unix_path.Buffer) strcpy( unix_path.Buffer, d ); + strcat( unix_path.Buffer, "/"); + unix_path.Length = strlen( unix_path.Buffer ); + if ((status = wine_unix_to_nt_file_name( &unix_path, &nt_path ))) @@ -82,7 +83,8 @@ index 262d24b9d2..186156159c 100644 + nt_dest.Length = dest_len; + } + nt_dest_allocated = TRUE; - if ((status = wine_nt_to_unix_file_name( &nt_dest, &unix_dest, FILE_OPEN, FALSE ))) + status = wine_nt_to_unix_file_name( &nt_dest, &unix_dest, 0, FALSE ); + if (status != STATUS_SUCCESS && status != STATUS_NO_SUCH_FILE) goto cleanup; dest_allocated = TRUE; + if (flags == SYMLINK_FLAG_RELATIVE) @@ -107,7 +109,7 @@ index 262d24b9d2..186156159c 100644 for (i = 0; i < sizeof(ULONG)*8; i++) { if ((buffer->ReparseTag >> i) & 1) -@@ -1718,7 +1759,7 @@ NTSTATUS FILE_CreateSymlink(HANDLE handle, REPARSE_DATA_BUFFER *buffer) +@@ -1719,7 +1761,7 @@ NTSTATUS FILE_CreateSymlink(HANDLE handle, REPARSE_DATA_BUFFER *buffer) strcat( magic_dest, "." ); strcat( magic_dest, "/" ); } @@ -116,7 +118,7 @@ index 262d24b9d2..186156159c 100644 /* Produce the link in a temporary location in the same folder */ strcpy( tmpdir, unix_src.Buffer ); -@@ -1767,7 +1808,9 @@ NTSTATUS FILE_CreateSymlink(HANDLE handle, REPARSE_DATA_BUFFER *buffer) +@@ -1769,7 +1811,9 @@ NTSTATUS FILE_CreateSymlink(HANDLE handle, REPARSE_DATA_BUFFER *buffer) cleanup: if (tempdir_created) rmdir( tmpdir ); diff --git a/patches/ntdll-Junction_Points/0011-ntdll-Add-support-for-reading-relative-symlinks.patch b/patches/ntdll-Junction_Points/0011-ntdll-Add-support-for-reading-relative-symlinks.patch index ccfaa672..defd790c 100644 --- a/patches/ntdll-Junction_Points/0011-ntdll-Add-support-for-reading-relative-symlinks.patch +++ b/patches/ntdll-Junction_Points/0011-ntdll-Add-support-for-reading-relative-symlinks.patch @@ -1,19 +1,19 @@ -From 2618729bcbd286d60e0a80c3ad1ef840c58c5689 Mon Sep 17 00:00:00 2001 +From cdd6070ee2b8876877c66bfdaa44b4b152633b1d Mon Sep 17 00:00:00 2001 From: "Erich E. Hoover" Date: Thu, 11 Apr 2019 12:31:16 -0600 Subject: ntdll: Add support for reading relative symlinks. Signed-off-by: Erich E. Hoover --- - dlls/ntdll/file.c | 42 ++++++++++++++++++++++++++++++++++++++++- - dlls/ntdll/tests/file.c | 13 ++++++++++++- - 2 files changed, 53 insertions(+), 2 deletions(-) + dlls/ntdll/file.c | 44 ++++++++++++++++++++++++++++++++++++++++- + dlls/ntdll/tests/file.c | 13 +++++++++++- + 2 files changed, 55 insertions(+), 2 deletions(-) diff --git a/dlls/ntdll/file.c b/dlls/ntdll/file.c -index 186156159c..8795eb6e9d 100644 +index 8487bb5158..5df2d8c3fa 100644 --- a/dlls/ntdll/file.c +++ b/dlls/ntdll/file.c -@@ -1828,6 +1828,7 @@ NTSTATUS FILE_GetSymlink(HANDLE handle, REPARSE_DATA_BUFFER *buffer, ULONG out_s +@@ -1831,6 +1831,7 @@ NTSTATUS FILE_GetSymlink(HANDLE handle, REPARSE_DATA_BUFFER *buffer, ULONG out_s BOOL dest_allocated = FALSE; int dest_fd, needs_close; UNICODE_STRING nt_dest; @@ -21,7 +21,7 @@ index 186156159c..8795eb6e9d 100644 DWORD max_length; NTSTATUS status; ULONG flags = 0; -@@ -1855,6 +1856,11 @@ NTSTATUS FILE_GetSymlink(HANDLE handle, REPARSE_DATA_BUFFER *buffer, ULONG out_s +@@ -1858,6 +1859,11 @@ NTSTATUS FILE_GetSymlink(HANDLE handle, REPARSE_DATA_BUFFER *buffer, ULONG out_s /* Decode the reparse tag from the symlink */ p = unix_dest.Buffer; @@ -33,7 +33,7 @@ index 186156159c..8795eb6e9d 100644 if (*p++ != '/') { status = STATUS_NOT_IMPLEMENTED; -@@ -1891,10 +1897,44 @@ NTSTATUS FILE_GetSymlink(HANDLE handle, REPARSE_DATA_BUFFER *buffer, ULONG out_s +@@ -1894,10 +1900,46 @@ NTSTATUS FILE_GetSymlink(HANDLE handle, REPARSE_DATA_BUFFER *buffer, ULONG out_s unix_dest.Length -= (p - unix_dest.Buffer); memmove(unix_dest.Buffer, p, unix_dest.Length); @@ -41,11 +41,13 @@ index 186156159c..8795eb6e9d 100644 + if (flags == SYMLINK_FLAG_RELATIVE) + { + int offset = unix_src.Length + 2; ++ char *d; + memcpy( &unix_dest.Buffer[offset], unix_dest.Buffer, unix_dest.Length ); + unix_dest.Buffer[offset+unix_dest.Length] = 0; + memcpy( unix_dest.Buffer, unix_src.Buffer, unix_src.Length ); + unix_dest.Buffer[unix_src.Length] = 0; -+ dirname( unix_dest.Buffer ); ++ d = dirname( unix_dest.Buffer ); ++ if (d != unix_dest.Buffer) strcpy( unix_dest.Buffer, d ); + strcat( unix_dest.Buffer, "/" ); + path_len = strlen( unix_dest.Buffer ); + memmove( &unix_dest.Buffer[path_len], &unix_dest.Buffer[offset], unix_dest.Length + 1 ); diff --git a/patches/ntdll-Junction_Points/0012-ntdll-Add-support-for-file-symlinks.patch b/patches/ntdll-Junction_Points/0012-ntdll-Add-support-for-file-symlinks.patch index b2b2a237..a719b4d5 100644 --- a/patches/ntdll-Junction_Points/0012-ntdll-Add-support-for-file-symlinks.patch +++ b/patches/ntdll-Junction_Points/0012-ntdll-Add-support-for-file-symlinks.patch @@ -1,4 +1,4 @@ -From 0cf6512a8532b065dc92d6ac16678dff180a1107 Mon Sep 17 00:00:00 2001 +From 05a16c210c3dabb07cc5b5514e9745f00fb364ea Mon Sep 17 00:00:00 2001 From: "Erich E. Hoover" Date: Thu, 11 Apr 2019 17:57:53 -0600 Subject: ntdll: Add support for file symlinks. @@ -10,7 +10,7 @@ Signed-off-by: Erich E. Hoover 2 files changed, 55 insertions(+), 5 deletions(-) diff --git a/dlls/ntdll/file.c b/dlls/ntdll/file.c -index 8795eb6e9d..a9fe846e08 100644 +index 5df2d8c3fa..03a07d46cd 100644 --- a/dlls/ntdll/file.c +++ b/dlls/ntdll/file.c @@ -1665,6 +1665,7 @@ NTSTATUS FILE_CreateSymlink(HANDLE handle, REPARSE_DATA_BUFFER *buffer) @@ -21,7 +21,7 @@ index 8795eb6e9d..a9fe846e08 100644 NTSTATUS status; struct stat st; WCHAR *dest; -@@ -1755,7 +1756,8 @@ NTSTATUS FILE_CreateSymlink(HANDLE handle, REPARSE_DATA_BUFFER *buffer) +@@ -1757,7 +1758,8 @@ NTSTATUS FILE_CreateSymlink(HANDLE handle, REPARSE_DATA_BUFFER *buffer) status = FILE_GetNtStatus(); goto cleanup; } @@ -31,7 +31,7 @@ index 8795eb6e9d..a9fe846e08 100644 strcat( magic_dest, "." ); strcat( magic_dest, "/" ); } -@@ -1781,8 +1783,11 @@ NTSTATUS FILE_CreateSymlink(HANDLE handle, REPARSE_DATA_BUFFER *buffer) +@@ -1784,8 +1786,11 @@ NTSTATUS FILE_CreateSymlink(HANDLE handle, REPARSE_DATA_BUFFER *buffer) /* Atomically move the link into position */ if (!renameat2( -1, tmplink, -1, unix_src.Buffer, RENAME_EXCHANGE )) { @@ -45,7 +45,7 @@ index 8795eb6e9d..a9fe846e08 100644 } else if (errno == ENOSYS) { -@@ -1989,6 +1994,7 @@ NTSTATUS FILE_RemoveSymlink(HANDLE handle, REPARSE_GUID_DATA_BUFFER *buffer) +@@ -1994,6 +1999,7 @@ NTSTATUS FILE_RemoveSymlink(HANDLE handle, REPARSE_GUID_DATA_BUFFER *buffer) BOOL tempdir_created = FALSE; int dest_fd, needs_close; ANSI_STRING unix_name; @@ -53,7 +53,7 @@ index 8795eb6e9d..a9fe846e08 100644 NTSTATUS status; struct stat st; -@@ -2000,12 +2006,13 @@ NTSTATUS FILE_RemoveSymlink(HANDLE handle, REPARSE_GUID_DATA_BUFFER *buffer) +@@ -2005,12 +2011,13 @@ NTSTATUS FILE_RemoveSymlink(HANDLE handle, REPARSE_GUID_DATA_BUFFER *buffer) TRACE("Deleting symlink %s\n", unix_name.Buffer); @@ -66,9 +66,9 @@ index 8795eb6e9d..a9fe846e08 100644 } + is_dir = S_ISDIR(st.st_mode); strcpy( tmpdir, unix_name.Buffer ); - dirname( tmpdir) ; - strcat( tmpdir, "/.winelink.XXXXXX" ); -@@ -2017,11 +2024,21 @@ NTSTATUS FILE_RemoveSymlink(HANDLE handle, REPARSE_GUID_DATA_BUFFER *buffer) + d = dirname( tmpdir); + if (d != tmpdir) strcpy( tmpdir, d ); +@@ -2023,11 +2030,21 @@ NTSTATUS FILE_RemoveSymlink(HANDLE handle, REPARSE_GUID_DATA_BUFFER *buffer) tempdir_created = TRUE; strcpy( tmpfile, tmpdir ); strcat( tmpfile, "/tmpfile" ); diff --git a/patches/ntdll-Junction_Points/0013-ntdll-Correctly-report-file-symbolic-links-as-files.patch b/patches/ntdll-Junction_Points/0013-ntdll-Correctly-report-file-symbolic-links-as-files.patch index b946d1a2..47a44009 100644 --- a/patches/ntdll-Junction_Points/0013-ntdll-Correctly-report-file-symbolic-links-as-files.patch +++ b/patches/ntdll-Junction_Points/0013-ntdll-Correctly-report-file-symbolic-links-as-files.patch @@ -1,4 +1,4 @@ -From 2ccff55de1a8e43f12fde63870b0d93ec63dd4ab Mon Sep 17 00:00:00 2001 +From 9c0229cf831240320ef2797dbfd21493d7871088 Mon Sep 17 00:00:00 2001 From: "Erich E. Hoover" Date: Sat, 30 Mar 2019 12:00:51 -0600 Subject: ntdll: Correctly report file symbolic links as files. @@ -10,7 +10,7 @@ Signed-off-by: Erich E. Hoover 2 files changed, 79 insertions(+), 39 deletions(-) diff --git a/dlls/ntdll/file.c b/dlls/ntdll/file.c -index a9fe846e08..8ffd79ccbf 100644 +index 03a07d46cd..8b78306fbf 100644 --- a/dlls/ntdll/file.c +++ b/dlls/ntdll/file.c @@ -124,6 +124,9 @@ mode_t FILE_umask = 0; @@ -38,7 +38,7 @@ index a9fe846e08..8ffd79ccbf 100644 } *attr |= get_file_attributes( st ); return ret; -@@ -1822,48 +1829,34 @@ cleanup: +@@ -1825,48 +1832,34 @@ cleanup: } @@ -102,7 +102,7 @@ index a9fe846e08..8ffd79ccbf 100644 p++; } if (*p++ != '/') -@@ -1871,7 +1864,7 @@ NTSTATUS FILE_GetSymlink(HANDLE handle, REPARSE_DATA_BUFFER *buffer, ULONG out_s +@@ -1874,7 +1867,7 @@ NTSTATUS FILE_GetSymlink(HANDLE handle, REPARSE_DATA_BUFFER *buffer, ULONG out_s status = STATUS_NOT_IMPLEMENTED; goto cleanup; } @@ -111,7 +111,7 @@ index a9fe846e08..8ffd79ccbf 100644 for (i = 0; i < sizeof(ULONG)*8; i++) { char c = *p++; -@@ -1886,21 +1879,68 @@ NTSTATUS FILE_GetSymlink(HANDLE handle, REPARSE_DATA_BUFFER *buffer, ULONG out_s +@@ -1889,21 +1882,68 @@ NTSTATUS FILE_GetSymlink(HANDLE handle, REPARSE_DATA_BUFFER *buffer, ULONG out_s status = STATUS_NOT_IMPLEMENTED; goto cleanup; } diff --git a/patches/ntdll-Junction_Points/0014-kernel32-Set-error-code-when-attempting-to-delete-fi.patch b/patches/ntdll-Junction_Points/0014-kernel32-Set-error-code-when-attempting-to-delete-fi.patch index de51da4f..76301c98 100644 --- a/patches/ntdll-Junction_Points/0014-kernel32-Set-error-code-when-attempting-to-delete-fi.patch +++ b/patches/ntdll-Junction_Points/0014-kernel32-Set-error-code-when-attempting-to-delete-fi.patch @@ -1,4 +1,4 @@ -From 447ceb46b34604f8c72014b8516851e81850b4de Mon Sep 17 00:00:00 2001 +From e34db8f28e43091a02cccb2eb590f9beda9da059 Mon Sep 17 00:00:00 2001 From: "Erich E. Hoover" Date: Sat, 30 Mar 2019 12:01:50 -0600 Subject: kernel32: Set error code when attempting to delete file symlinks as @@ -11,7 +11,7 @@ Signed-off-by: Erich E. Hoover 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/dlls/kernel32/path.c b/dlls/kernel32/path.c -index 6369225b3e..832e77bfc0 100644 +index 76a9512c77..f15b6dd68b 100644 --- a/dlls/kernel32/path.c +++ b/dlls/kernel32/path.c @@ -1738,7 +1738,10 @@ BOOL WINAPI RemoveDirectoryW( LPCWSTR path ) diff --git a/patches/ntdll-Junction_Points/0015-server-Properly-handle-file-symlink-deletion.patch b/patches/ntdll-Junction_Points/0015-server-Properly-handle-file-symlink-deletion.patch index 44301710..464afc5a 100644 --- a/patches/ntdll-Junction_Points/0015-server-Properly-handle-file-symlink-deletion.patch +++ b/patches/ntdll-Junction_Points/0015-server-Properly-handle-file-symlink-deletion.patch @@ -1,4 +1,4 @@ -From d6f127ccdc6bb2a2c74551bfae669a6eee55c312 Mon Sep 17 00:00:00 2001 +From 245f8c8ad1d014bbf726020fd4c37c99e8bcafea Mon Sep 17 00:00:00 2001 From: "Erich E. Hoover" Date: Sat, 30 Mar 2019 13:41:07 -0600 Subject: server: Properly handle file symlink deletion. diff --git a/patches/ntdll-Junction_Points/0016-kernel32-Implement-CreateSymbolicLink-A-W-with-ntdll.patch b/patches/ntdll-Junction_Points/0016-kernel32-Implement-CreateSymbolicLink-A-W-with-ntdll.patch index a991ed89..660bfcaa 100644 --- a/patches/ntdll-Junction_Points/0016-kernel32-Implement-CreateSymbolicLink-A-W-with-ntdll.patch +++ b/patches/ntdll-Junction_Points/0016-kernel32-Implement-CreateSymbolicLink-A-W-with-ntdll.patch @@ -1,4 +1,4 @@ -From a4a9f0c9c9b4453a46d5060d0ec32b8f49cf19a1 Mon Sep 17 00:00:00 2001 +From 99b54adfcc2740af27224957748f94a0e84b47c3 Mon Sep 17 00:00:00 2001 From: "Erich E. Hoover" Date: Wed, 13 Mar 2019 16:02:05 -0600 Subject: kernel32: Implement CreateSymbolicLink[A|W] with ntdll reparse @@ -11,7 +11,7 @@ Signed-off-by: Erich E. Hoover 2 files changed, 214 insertions(+), 4 deletions(-) diff --git a/dlls/kernel32/path.c b/dlls/kernel32/path.c -index 832e77bfc0..9fef494cfa 100644 +index f15b6dd68b..d96471e4c6 100644 --- a/dlls/kernel32/path.c +++ b/dlls/kernel32/path.c @@ -34,6 +34,8 @@ @@ -23,7 +23,7 @@ index 832e77bfc0..9fef494cfa 100644 #include "kernel_private.h" #include "wine/unicode.h" -@@ -2088,8 +2090,106 @@ WCHAR * CDECL wine_get_dos_file_name( LPCSTR str ) +@@ -2087,8 +2089,106 @@ WCHAR * CDECL wine_get_dos_file_name( LPCSTR str ) */ BOOLEAN WINAPI CreateSymbolicLinkW(LPCWSTR link, LPCWSTR target, DWORD flags) { @@ -132,7 +132,7 @@ index 832e77bfc0..9fef494cfa 100644 } /************************************************************************* -@@ -2097,8 +2197,24 @@ BOOLEAN WINAPI CreateSymbolicLinkW(LPCWSTR link, LPCWSTR target, DWORD flags) +@@ -2096,8 +2196,24 @@ BOOLEAN WINAPI CreateSymbolicLinkW(LPCWSTR link, LPCWSTR target, DWORD flags) */ BOOLEAN WINAPI CreateSymbolicLinkA(LPCSTR link, LPCSTR target, DWORD flags) {