mirror of
https://gitlab.winehq.org/wine/wine-staging.git
synced 2025-01-28 22:04:43 -08:00
ntdll-Junction_Points: Updates from Erich E. Hoover.
This commit is contained in:
parent
0ae7315541
commit
18032936f1
@ -1,4 +1,4 @@
|
||||
From 1c6eed5d7c8a60fb7f6a9ada5345ef2dc0c6e9ad Mon Sep 17 00:00:00 2001
|
||||
From 2d258fdb8d115451cec891a6132ef2b128aa9cc2 Mon Sep 17 00:00:00 2001
|
||||
From: "Erich E. Hoover" <erich.e.hoover@gmail.com>
|
||||
Date: Thu, 16 Jan 2014 20:57:57 -0700
|
||||
Subject: ntdll: Add support for reading junction points.
|
||||
@ -6,14 +6,14 @@ Subject: ntdll: Add support for reading junction points.
|
||||
Signed-off-by: Erich E. Hoover <erich.e.hoover@gmail.com>
|
||||
---
|
||||
dlls/ntdll/tests/file.c | 14 ++++-
|
||||
dlls/ntdll/unix/file.c | 119 ++++++++++++++++++++++++++++++++++++++++
|
||||
2 files changed, 132 insertions(+), 1 deletion(-)
|
||||
dlls/ntdll/unix/file.c | 120 ++++++++++++++++++++++++++++++++++++++++
|
||||
2 files changed, 133 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/dlls/ntdll/tests/file.c b/dlls/ntdll/tests/file.c
|
||||
index 43cf99e8e74..4fe94f58bf1 100644
|
||||
index 10bdef5d810..970a144935b 100644
|
||||
--- a/dlls/ntdll/tests/file.c
|
||||
+++ b/dlls/ntdll/tests/file.c
|
||||
@@ -5009,9 +5009,10 @@ static void test_reparse_points(void)
|
||||
@@ -5178,9 +5178,10 @@ static void test_reparse_points(void)
|
||||
static const WCHAR dotW[] = {'.',0};
|
||||
REPARSE_DATA_BUFFER *buffer = NULL;
|
||||
DWORD dwret, dwLen, dwFlags;
|
||||
@ -25,7 +25,7 @@ index 43cf99e8e74..4fe94f58bf1 100644
|
||||
BOOL bret;
|
||||
|
||||
/* Create a temporary folder for the junction point tests */
|
||||
@@ -5059,6 +5060,17 @@ static void test_reparse_points(void)
|
||||
@@ -5228,6 +5229,17 @@ static void test_reparse_points(void)
|
||||
buffer_len = build_reparse_buffer(nameW.Buffer, &buffer);
|
||||
bret = DeviceIoControl(handle, FSCTL_SET_REPARSE_POINT, (LPVOID)buffer, buffer_len, NULL, 0, &dwret, 0);
|
||||
ok(bret, "Failed to create junction point! (0x%x)\n", GetLastError());
|
||||
@ -44,10 +44,10 @@ index 43cf99e8e74..4fe94f58bf1 100644
|
||||
|
||||
cleanup:
|
||||
diff --git a/dlls/ntdll/unix/file.c b/dlls/ntdll/unix/file.c
|
||||
index 48e4c38b7ba..cd523dcd313 100644
|
||||
index 585ecf561a1..3a2ca3ba319 100644
|
||||
--- a/dlls/ntdll/unix/file.c
|
||||
+++ b/dlls/ntdll/unix/file.c
|
||||
@@ -5704,6 +5704,119 @@ cleanup:
|
||||
@@ -5890,6 +5890,120 @@ cleanup:
|
||||
}
|
||||
|
||||
|
||||
@ -111,6 +111,7 @@ index 48e4c38b7ba..cd523dcd313 100644
|
||||
+ }
|
||||
+ unix_dest_len -= (p - unix_dest);
|
||||
+ memmove(unix_dest, p, unix_dest_len);
|
||||
+ unix_dest[unix_dest_len] = 0;
|
||||
+
|
||||
+ for (;;)
|
||||
+ {
|
||||
@ -167,7 +168,7 @@ index 48e4c38b7ba..cd523dcd313 100644
|
||||
/******************************************************************************
|
||||
* NtFsControlFile (NTDLL.@)
|
||||
*/
|
||||
@@ -5786,6 +5899,12 @@ NTSTATUS WINAPI NtFsControlFile( HANDLE handle, HANDLE event, PIO_APC_ROUTINE ap
|
||||
@@ -5972,6 +6086,12 @@ NTSTATUS WINAPI NtFsControlFile( HANDLE handle, HANDLE event, PIO_APC_ROUTINE ap
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
From 3595e892dbf4d5b123ce641b6ce72490cc3d782f Mon Sep 17 00:00:00 2001
|
||||
From 37de2cfdefc0d51cec89f9fee2d8b7ee67a84ff0 Mon Sep 17 00:00:00 2001
|
||||
From: "Erich E. Hoover" <erich.e.hoover@gmail.com>
|
||||
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 <erich.e.hoover@gmail.com>
|
||||
2 files changed, 34 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/dlls/ntdll/tests/file.c b/dlls/ntdll/tests/file.c
|
||||
index 986468a1495..5b7bdf7ddfd 100644
|
||||
index 82f928bb432..0f2b3f9f7f2 100644
|
||||
--- a/dlls/ntdll/tests/file.c
|
||||
+++ b/dlls/ntdll/tests/file.c
|
||||
@@ -5208,7 +5208,6 @@ static void test_reparse_points(void)
|
||||
@@ -5377,7 +5377,6 @@ static void test_reparse_points(void)
|
||||
ok(dwret == STATUS_SUCCESS, "Failed to get symlink folder's attributes (0x%x).\n", dwret);
|
||||
buffer_len = build_reparse_buffer(nameW.Buffer, IO_REPARSE_TAG_SYMLINK, &buffer);
|
||||
bret = DeviceIoControl(handle, FSCTL_SET_REPARSE_POINT, (LPVOID)buffer, buffer_len, NULL, 0, &dwret, 0);
|
||||
@ -21,7 +21,7 @@ index 986468a1495..5b7bdf7ddfd 100644
|
||||
ok(bret, "Failed to create symlink! (0x%x)\n", GetLastError());
|
||||
|
||||
/* Check the file attributes of the symlink */
|
||||
@@ -5216,6 +5215,18 @@ static void test_reparse_points(void)
|
||||
@@ -5385,6 +5384,18 @@ static void test_reparse_points(void)
|
||||
ok(dwret != (DWORD)~0, "Symlink doesn't exist (attributes: 0x%x)!\n", dwret);
|
||||
ok(dwret & FILE_ATTRIBUTE_REPARSE_POINT, "File is not a symlink! (attributes: %d)\n", dwret);
|
||||
|
||||
@ -41,10 +41,10 @@ index 986468a1495..5b7bdf7ddfd 100644
|
||||
/* Cleanup */
|
||||
pRtlFreeUnicodeString(&nameW);
|
||||
diff --git a/dlls/ntdll/unix/file.c b/dlls/ntdll/unix/file.c
|
||||
index b8dc02127ba..cd14a2e24c3 100644
|
||||
index 20e7fbfc218..a61fe7a060b 100644
|
||||
--- a/dlls/ntdll/unix/file.c
|
||||
+++ b/dlls/ntdll/unix/file.c
|
||||
@@ -5746,6 +5746,7 @@ NTSTATUS FILE_GetSymlink(HANDLE handle, REPARSE_DATA_BUFFER *buffer, ULONG out_s
|
||||
@@ -5932,6 +5932,7 @@ NTSTATUS FILE_GetSymlink(HANDLE handle, REPARSE_DATA_BUFFER *buffer, ULONG out_s
|
||||
int unix_dest_len;
|
||||
DWORD max_length;
|
||||
NTSTATUS status;
|
||||
@ -52,7 +52,7 @@ index b8dc02127ba..cd14a2e24c3 100644
|
||||
WCHAR *nt_dest;
|
||||
INT prefix_len;
|
||||
ssize_t ret;
|
||||
@@ -5790,6 +5791,17 @@ NTSTATUS FILE_GetSymlink(HANDLE handle, REPARSE_DATA_BUFFER *buffer, ULONG out_s
|
||||
@@ -5976,6 +5977,17 @@ NTSTATUS FILE_GetSymlink(HANDLE handle, REPARSE_DATA_BUFFER *buffer, ULONG out_s
|
||||
}
|
||||
buffer->ReparseTag |= (val << i);
|
||||
}
|
||||
@ -69,8 +69,8 @@ index b8dc02127ba..cd14a2e24c3 100644
|
||||
+ }
|
||||
unix_dest_len -= (p - unix_dest);
|
||||
memmove(unix_dest, p, unix_dest_len);
|
||||
|
||||
@@ -5822,6 +5834,16 @@ NTSTATUS FILE_GetSymlink(HANDLE handle, REPARSE_DATA_BUFFER *buffer, ULONG out_s
|
||||
unix_dest[unix_dest_len] = 0;
|
||||
@@ -6009,6 +6021,16 @@ NTSTATUS FILE_GetSymlink(HANDLE handle, REPARSE_DATA_BUFFER *buffer, ULONG out_s
|
||||
buffer->MountPointReparseBuffer.PrintNameLength = nt_dest_len - prefix_len*sizeof(WCHAR);
|
||||
print_name = &buffer->MountPointReparseBuffer.PathBuffer[buffer->MountPointReparseBuffer.PrintNameOffset/sizeof(WCHAR)];
|
||||
break;
|
||||
|
@ -1,4 +1,4 @@
|
||||
From 5658e73f218d01b0e11bc4575cf0502b8235ec2c Mon Sep 17 00:00:00 2001
|
||||
From 47bde84ad4a5dc3320f7531e12909046730835dd Mon Sep 17 00:00:00 2001
|
||||
From: "Erich E. Hoover" <erich.e.hoover@gmail.com>
|
||||
Date: Thu, 11 Apr 2019 12:31:16 -0600
|
||||
Subject: ntdll: Add support for reading relative symlinks.
|
||||
@ -6,14 +6,14 @@ Subject: ntdll: Add support for reading relative symlinks.
|
||||
Signed-off-by: Erich E. Hoover <erich.e.hoover@gmail.com>
|
||||
---
|
||||
dlls/ntdll/tests/file.c | 13 ++++++++-
|
||||
dlls/ntdll/unix/file.c | 61 ++++++++++++++++++++++++++++++++++++++++-
|
||||
2 files changed, 72 insertions(+), 2 deletions(-)
|
||||
dlls/ntdll/unix/file.c | 60 ++++++++++++++++++++++++++++++++++++++++-
|
||||
2 files changed, 71 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/dlls/ntdll/tests/file.c b/dlls/ntdll/tests/file.c
|
||||
index 9b510fe9057..0db7372a0c8 100644
|
||||
index 7e9b214eb63..c288d7f62ab 100644
|
||||
--- a/dlls/ntdll/tests/file.c
|
||||
+++ b/dlls/ntdll/tests/file.c
|
||||
@@ -5258,9 +5258,20 @@ static void test_reparse_points(void)
|
||||
@@ -5427,9 +5427,20 @@ static void test_reparse_points(void)
|
||||
ok(dwret == STATUS_SUCCESS, "Failed to get symlink folder's attributes (0x%x).\n", dwret);
|
||||
buffer_len = build_reparse_buffer(targetW, IO_REPARSE_TAG_SYMLINK, SYMLINK_FLAG_RELATIVE, &buffer);
|
||||
bret = DeviceIoControl(handle, FSCTL_SET_REPARSE_POINT, (LPVOID)buffer, buffer_len, NULL, 0, &dwret, 0);
|
||||
@ -36,10 +36,10 @@ index 9b510fe9057..0db7372a0c8 100644
|
||||
/* Cleanup */
|
||||
pRtlFreeUnicodeString(&nameW);
|
||||
diff --git a/dlls/ntdll/unix/file.c b/dlls/ntdll/unix/file.c
|
||||
index 3652fbb1a0d..e62a2529bb2 100644
|
||||
index 638621fec87..628a76c795a 100644
|
||||
--- a/dlls/ntdll/unix/file.c
|
||||
+++ b/dlls/ntdll/unix/file.c
|
||||
@@ -5820,6 +5820,7 @@ NTSTATUS FILE_GetSymlink(HANDLE handle, REPARSE_DATA_BUFFER *buffer, ULONG out_s
|
||||
@@ -6008,6 +6008,7 @@ NTSTATUS FILE_GetSymlink(HANDLE handle, REPARSE_DATA_BUFFER *buffer, ULONG out_s
|
||||
BOOL dest_allocated = FALSE;
|
||||
int dest_fd, needs_close;
|
||||
int unix_dest_len;
|
||||
@ -47,7 +47,7 @@ index 3652fbb1a0d..e62a2529bb2 100644
|
||||
DWORD max_length;
|
||||
NTSTATUS status;
|
||||
ULONG flags = 0;
|
||||
@@ -5845,6 +5846,11 @@ NTSTATUS FILE_GetSymlink(HANDLE handle, REPARSE_DATA_BUFFER *buffer, ULONG out_s
|
||||
@@ -6033,6 +6034,11 @@ NTSTATUS FILE_GetSymlink(HANDLE handle, REPARSE_DATA_BUFFER *buffer, ULONG out_s
|
||||
|
||||
/* Decode the reparse tag from the symlink */
|
||||
p = unix_dest;
|
||||
@ -59,9 +59,9 @@ index 3652fbb1a0d..e62a2529bb2 100644
|
||||
if (*p++ != '/')
|
||||
{
|
||||
status = STATUS_NOT_IMPLEMENTED;
|
||||
@@ -5881,6 +5887,25 @@ NTSTATUS FILE_GetSymlink(HANDLE handle, REPARSE_DATA_BUFFER *buffer, ULONG out_s
|
||||
unix_dest_len -= (p - unix_dest);
|
||||
@@ -6070,6 +6076,24 @@ NTSTATUS FILE_GetSymlink(HANDLE handle, REPARSE_DATA_BUFFER *buffer, ULONG out_s
|
||||
memmove(unix_dest, p, unix_dest_len);
|
||||
unix_dest[unix_dest_len] = 0;
|
||||
|
||||
+ /* convert the relative path into an absolute path */
|
||||
+ if (flags == SYMLINK_FLAG_RELATIVE)
|
||||
@ -70,8 +70,7 @@ index 3652fbb1a0d..e62a2529bb2 100644
|
||||
+ int offset = unix_src_len + 2;
|
||||
+ char *d;
|
||||
+
|
||||
+ memcpy( &unix_dest[offset], unix_dest, unix_dest_len );
|
||||
+ unix_dest[offset+unix_dest_len] = 0;
|
||||
+ memcpy( &unix_dest[offset], unix_dest, unix_dest_len + 1 );
|
||||
+ memcpy( unix_dest, unix_src, unix_src_len );
|
||||
+ unix_dest[unix_src_len] = 0;
|
||||
+ d = dirname( unix_dest );
|
||||
@ -85,7 +84,7 @@ index 3652fbb1a0d..e62a2529bb2 100644
|
||||
for (;;)
|
||||
{
|
||||
nt_dest = malloc( nt_dest_len * sizeof(WCHAR) );
|
||||
@@ -5898,7 +5923,41 @@ NTSTATUS FILE_GetSymlink(HANDLE handle, REPARSE_DATA_BUFFER *buffer, ULONG out_s
|
||||
@@ -6087,7 +6111,41 @@ NTSTATUS FILE_GetSymlink(HANDLE handle, REPARSE_DATA_BUFFER *buffer, ULONG out_s
|
||||
goto cleanup;
|
||||
nt_dest_len *= sizeof(WCHAR);
|
||||
|
||||
|
@ -1,7 +1,7 @@
|
||||
From dcb3180f1f1569626956e51aa35b032271399390 Mon Sep 17 00:00:00 2001
|
||||
From a04e2603e0dda3eb635d9d2d524943eca203f19c Mon Sep 17 00:00:00 2001
|
||||
From: "Erich E. Hoover" <erich.e.hoover@gmail.com>
|
||||
Date: Sat, 30 Mar 2019 12:00:51 -0600
|
||||
Subject: [PATCH] ntdll: Correctly report file symbolic links as files.
|
||||
Subject: ntdll: Correctly report file symbolic links as files.
|
||||
|
||||
Signed-off-by: Erich E. Hoover <erich.e.hoover@gmail.com>
|
||||
---
|
||||
@ -9,10 +9,10 @@ Signed-off-by: Erich E. Hoover <erich.e.hoover@gmail.com>
|
||||
1 file changed, 77 insertions(+), 38 deletions(-)
|
||||
|
||||
diff --git a/dlls/ntdll/unix/file.c b/dlls/ntdll/unix/file.c
|
||||
index af964cf1334..205adafcd8f 100644
|
||||
index 4ee804b709a..bf81cc7c851 100644
|
||||
--- a/dlls/ntdll/unix/file.c
|
||||
+++ b/dlls/ntdll/unix/file.c
|
||||
@@ -1466,6 +1466,9 @@ static inline int get_file_xattr( char *hexattr, int attrlen )
|
||||
@@ -1599,6 +1599,9 @@ static inline int get_file_xattr( char *hexattr, int attrlen )
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -22,7 +22,7 @@ index af964cf1334..205adafcd8f 100644
|
||||
/* fetch the attributes of a file */
|
||||
static inline ULONG get_file_attributes( const struct stat *st )
|
||||
{
|
||||
@@ -1550,10 +1553,15 @@ static int get_file_info( const char *path, struct stat *st, ULONG *attr )
|
||||
@@ -1683,10 +1686,15 @@ static int get_file_info( const char *path, struct stat *st, ULONG *attr )
|
||||
if (ret == -1) return ret;
|
||||
if (S_ISLNK( st->st_mode ))
|
||||
{
|
||||
@ -42,7 +42,7 @@ index af964cf1334..205adafcd8f 100644
|
||||
}
|
||||
else if (S_ISDIR( st->st_mode ) && (parent_path = malloc( strlen(path) + 4 )))
|
||||
{
|
||||
@@ -5879,47 +5887,34 @@ cleanup:
|
||||
@@ -6014,47 +6022,34 @@ cleanup:
|
||||
}
|
||||
|
||||
|
||||
@ -105,7 +105,7 @@ index af964cf1334..205adafcd8f 100644
|
||||
p++;
|
||||
}
|
||||
if (*p++ != '/')
|
||||
@@ -5927,7 +5922,7 @@ NTSTATUS FILE_GetSymlink(HANDLE handle, REPARSE_DATA_BUFFER *buffer, ULONG out_s
|
||||
@@ -6062,7 +6057,7 @@ NTSTATUS FILE_GetSymlink(HANDLE handle, REPARSE_DATA_BUFFER *buffer, ULONG out_s
|
||||
status = STATUS_NOT_IMPLEMENTED;
|
||||
goto cleanup;
|
||||
}
|
||||
@ -114,7 +114,7 @@ index af964cf1334..205adafcd8f 100644
|
||||
for (i = 0; i < sizeof(ULONG)*8; i++)
|
||||
{
|
||||
char c = *p++;
|
||||
@@ -5942,21 +5937,65 @@ NTSTATUS FILE_GetSymlink(HANDLE handle, REPARSE_DATA_BUFFER *buffer, ULONG out_s
|
||||
@@ -6077,21 +6072,65 @@ NTSTATUS FILE_GetSymlink(HANDLE handle, REPARSE_DATA_BUFFER *buffer, ULONG out_s
|
||||
status = STATUS_NOT_IMPLEMENTED;
|
||||
goto cleanup;
|
||||
}
|
||||
@ -182,9 +182,9 @@ index af964cf1334..205adafcd8f 100644
|
||||
+
|
||||
+ if ((status = FILE_DecodeSymlink( unix_src, unix_dest, &unix_dest_len, &buffer->ReparseTag, &flags, NULL )))
|
||||
+ goto cleanup;
|
||||
unix_dest[unix_dest_len] = 0;
|
||||
|
||||
/* convert the relative path into an absolute path */
|
||||
if (flags == SYMLINK_FLAG_RELATIVE)
|
||||
--
|
||||
2.27.0
|
||||
2.17.1
|
||||
|
||||
|
@ -1,15 +1,15 @@
|
||||
From 508f77e1653e67bfa8ed54eeb25251684b495115 Mon Sep 17 00:00:00 2001
|
||||
From 73ac626fc54665899c44bbfa11f22e4877480796 Mon Sep 17 00:00:00 2001
|
||||
From: "Erich E. Hoover" <erich.e.hoover@gmail.com>
|
||||
Date: Wed, 29 May 2019 15:38:30 -0600
|
||||
Subject: wcmd: Show reparse point target in directory listing.
|
||||
|
||||
Signed-off-by: Erich E. Hoover <erich.e.hoover@gmail.com>
|
||||
---
|
||||
programs/cmd/directory.c | 34 ++++++++++++++++++++++++++++++++++
|
||||
1 file changed, 34 insertions(+)
|
||||
programs/cmd/directory.c | 36 ++++++++++++++++++++++++++++++++++++
|
||||
1 file changed, 36 insertions(+)
|
||||
|
||||
diff --git a/programs/cmd/directory.c b/programs/cmd/directory.c
|
||||
index 5b7416ce72a..87a5a310224 100644
|
||||
index 5b7416ce72a..6769491b888 100644
|
||||
--- a/programs/cmd/directory.c
|
||||
+++ b/programs/cmd/directory.c
|
||||
@@ -23,6 +23,8 @@
|
||||
@ -29,7 +29,7 @@ index 5b7416ce72a..87a5a310224 100644
|
||||
|
||||
dir_count = 0;
|
||||
file_count = 0;
|
||||
@@ -417,6 +420,37 @@ static DIRECTORY_STACK *WCMD_list_directory (DIRECTORY_STACK *inputparms, int le
|
||||
@@ -417,6 +420,39 @@ static DIRECTORY_STACK *WCMD_list_directory (DIRECTORY_STACK *inputparms, int le
|
||||
if (shortname) WCMD_output (fmt2, fd[i].cAlternateFileName);
|
||||
if (usernames) WCMD_output (fmt3, username);
|
||||
WCMD_output(fmt4,fd[i].cFileName);
|
||||
@ -41,7 +41,9 @@ index 5b7416ce72a..87a5a310224 100644
|
||||
+ DWORD dwret;
|
||||
+ BOOL bret;
|
||||
+
|
||||
+ hlink = CreateFileW(fd[i].cFileName, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING,
|
||||
+ lstrcpyW(string, inputparms->dirName);
|
||||
+ lstrcatW(string, fd[i].cFileName);
|
||||
+ hlink = CreateFileW(string, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING,
|
||||
+ FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OPEN_REPARSE_POINT, 0);
|
||||
+ buffer_len = sizeof(*buffer) + 2*MAX_PATH*sizeof(WCHAR);
|
||||
+ buffer = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, buffer_len);
|
||||
|
Loading…
x
Reference in New Issue
Block a user