ntdll-Junction_Points: Updates from Erich E. Hoover.

This commit is contained in:
Zebediah Figura 2020-11-22 20:16:54 -06:00
parent 0ae7315541
commit 18032936f1
5 changed files with 49 additions and 47 deletions

View File

@ -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;
}

View File

@ -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;

View File

@ -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);

View File

@ -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

View File

@ -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);