mirror of
https://gitlab.winehq.org/wine/wine-staging.git
synced 2024-11-21 16:46:54 -08:00
Rebase against 16c6c249a5134de2422fbd3471ead7425c968301.
This commit is contained in:
parent
0ea57a0262
commit
e6f9a449cd
@ -1,122 +0,0 @@
|
||||
From 80cb1bf9077b1e754fc2f3426229733c3417c397 Mon Sep 17 00:00:00 2001
|
||||
From: "Erich E. Hoover" <erich.e.hoover@gmail.com>
|
||||
Date: Tue, 19 Aug 2014 22:10:49 -0600
|
||||
Subject: [PATCH] ntdll: Implement retrieving DOS attributes in
|
||||
[fd_]get_file_info().
|
||||
|
||||
---
|
||||
configure.ac | 12 ++++++++++++
|
||||
dlls/ntdll/unix/file.c | 39 ++++++++++++++++++++++++++++++++++++++-
|
||||
2 files changed, 50 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/configure.ac b/configure.ac
|
||||
index c68c5975e63..84efc670ca4 100644
|
||||
--- a/configure.ac
|
||||
+++ b/configure.ac
|
||||
@@ -64,6 +64,7 @@ AC_ARG_WITH(unwind, AS_HELP_STRING([--without-unwind],[do not use the libunwi
|
||||
AC_ARG_WITH(usb, AS_HELP_STRING([--without-usb],[do not use the libusb library]))
|
||||
AC_ARG_WITH(v4l2, AS_HELP_STRING([--without-v4l2],[do not use v4l2 (video capture)]))
|
||||
AC_ARG_WITH(vulkan, AS_HELP_STRING([--without-vulkan],[do not use Vulkan]))
|
||||
+AC_ARG_WITH(xattr, AS_HELP_STRING([--without-xattr],[do not use xattr (security attributes support)]))
|
||||
AC_ARG_WITH(xcomposite,AS_HELP_STRING([--without-xcomposite],[do not use the Xcomposite extension]),
|
||||
[if test "x$withval" = "xno"; then ac_cv_header_X11_extensions_Xcomposite_h=no; fi])
|
||||
AC_ARG_WITH(xcursor, AS_HELP_STRING([--without-xcursor],[do not use the Xcursor extension]),
|
||||
@@ -634,6 +635,17 @@ AC_CHECK_HEADERS([libprocstat.h],,,
|
||||
#include <sys/queue.h>
|
||||
#endif])
|
||||
|
||||
+if test "x$with_xattr" != "xno"
|
||||
+then
|
||||
+ AC_CHECK_HEADERS(attr/xattr.h, [HAVE_XATTR=1])
|
||||
+fi
|
||||
+if test "x$with_xattr" = "xyes"
|
||||
+then
|
||||
+ WINE_ERROR_WITH(xattr,[test "x$HAVE_XATTR" = "x"],[xattr ${notice_platform}development files \
|
||||
+not found. Wine will be built without extended attribute support, which probably isn't what you \
|
||||
+want. You will need to install ${notice_platform}development packages of libattr at the very least.])
|
||||
+fi
|
||||
+
|
||||
dnl **** Check for working dll ****
|
||||
|
||||
AC_SUBST(DLLFLAGS,"")
|
||||
diff --git a/dlls/ntdll/unix/file.c b/dlls/ntdll/unix/file.c
|
||||
index a29b5cbb980..1ae4645c6fb 100644
|
||||
--- a/dlls/ntdll/unix/file.c
|
||||
+++ b/dlls/ntdll/unix/file.c
|
||||
@@ -98,6 +98,9 @@
|
||||
#ifdef HAVE_SYS_STATFS_H
|
||||
#include <sys/statfs.h>
|
||||
#endif
|
||||
+#ifdef HAVE_ATTR_XATTR_H
|
||||
+#include <attr/xattr.h>
|
||||
+#endif
|
||||
#include <time.h>
|
||||
#include <unistd.h>
|
||||
|
||||
@@ -355,6 +358,20 @@ NTSTATUS errno_to_status( int err )
|
||||
}
|
||||
}
|
||||
|
||||
+#ifndef XATTR_USER_PREFIX
|
||||
+#define XATTR_USER_PREFIX "user."
|
||||
+#endif
|
||||
+
|
||||
+static int xattr_get( const char *path, const char *name, void *value, size_t size )
|
||||
+{
|
||||
+#if defined(HAVE_ATTR_XATTR_H)
|
||||
+ return getxattr( path, name, value, size );
|
||||
+#else
|
||||
+ errno = ENOSYS;
|
||||
+ return -1;
|
||||
+#endif
|
||||
+}
|
||||
+
|
||||
/* get space from the current directory data buffer, allocating a new one if necessary */
|
||||
static void *get_dir_data_space( struct dir_data *data, unsigned int size )
|
||||
{
|
||||
@@ -1436,6 +1453,22 @@ static BOOL append_entry( struct dir_data *data, const char *long_name,
|
||||
}
|
||||
|
||||
|
||||
+/* Match the Samba conventions for storing DOS file attributes */
|
||||
+#define SAMBA_XATTR_DOS_ATTRIB XATTR_USER_PREFIX "DOSATTRIB"
|
||||
+/* We are only interested in some attributes, the others have corresponding Unix attributes */
|
||||
+#define XATTR_ATTRIBS_MASK (FILE_ATTRIBUTE_HIDDEN|FILE_ATTRIBUTE_SYSTEM)
|
||||
+
|
||||
+/* decode the xattr-stored DOS attributes */
|
||||
+static inline int get_file_xattr( char *hexattr, int attrlen )
|
||||
+{
|
||||
+ if (attrlen > 2 && hexattr[0] == '0' && hexattr[1] == 'x')
|
||||
+ {
|
||||
+ hexattr[attrlen] = 0;
|
||||
+ return strtol( hexattr+2, NULL, 16 ) & XATTR_ATTRIBS_MASK;
|
||||
+ }
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
/* fetch the attributes of a file */
|
||||
static inline ULONG get_file_attributes( const struct stat *st )
|
||||
{
|
||||
@@ -1479,7 +1512,8 @@ static int fd_get_file_info( int fd, unsigned int options, struct stat *st, ULON
|
||||
static int get_file_info( const char *path, struct stat *st, ULONG *attr )
|
||||
{
|
||||
char *parent_path;
|
||||
- int ret;
|
||||
+ char hexattr[11];
|
||||
+ int len, ret;
|
||||
|
||||
*attr = 0;
|
||||
ret = lstat( path, st );
|
||||
@@ -1505,6 +1539,9 @@ static int get_file_info( const char *path, struct stat *st, ULONG *attr )
|
||||
free( parent_path );
|
||||
}
|
||||
*attr |= get_file_attributes( st );
|
||||
+ len = xattr_get( path, SAMBA_XATTR_DOS_ATTRIB, hexattr, sizeof(hexattr)-1 );
|
||||
+ if (len == -1) return ret;
|
||||
+ *attr |= get_file_xattr( hexattr, len );
|
||||
return ret;
|
||||
}
|
||||
|
||||
--
|
||||
2.34.1
|
||||
|
@ -1,160 +0,0 @@
|
||||
From 49f8ae15c8065c9133e0c08eaba68049cdb85e0b Mon Sep 17 00:00:00 2001
|
||||
From: "Erich E. Hoover" <erich.e.hoover@gmail.com>
|
||||
Date: Wed, 20 Aug 2014 00:08:52 -0600
|
||||
Subject: [PATCH] ntdll: Implement storing DOS attributes in
|
||||
NtSetInformationFile.
|
||||
|
||||
---
|
||||
dlls/ntdll/tests/file.c | 8 ++---
|
||||
dlls/ntdll/unix/file.c | 74 ++++++++++++++++++++++++++++++-----------
|
||||
2 files changed, 58 insertions(+), 24 deletions(-)
|
||||
|
||||
diff --git a/dlls/ntdll/tests/file.c b/dlls/ntdll/tests/file.c
|
||||
index 4014b395b56..ad718fab828 100644
|
||||
--- a/dlls/ntdll/tests/file.c
|
||||
+++ b/dlls/ntdll/tests/file.c
|
||||
@@ -1401,7 +1401,7 @@ static void test_file_basic_information(void)
|
||||
memset(&fbi, 0, sizeof(fbi));
|
||||
res = pNtQueryInformationFile(h, &io, &fbi, sizeof fbi, FileBasicInformation);
|
||||
ok ( res == STATUS_SUCCESS, "can't get attributes\n");
|
||||
- todo_wine ok ( (fbi.FileAttributes & attrib_mask) == FILE_ATTRIBUTE_SYSTEM, "attribute %lx not FILE_ATTRIBUTE_SYSTEM\n", fbi.FileAttributes );
|
||||
+ ok ( (fbi.FileAttributes & attrib_mask) == FILE_ATTRIBUTE_SYSTEM, "attribute %lx not FILE_ATTRIBUTE_SYSTEM (ok in old linux without xattr)\n", fbi.FileAttributes );
|
||||
|
||||
/* Then HIDDEN */
|
||||
memset(&fbi, 0, sizeof(fbi));
|
||||
@@ -1414,7 +1414,7 @@ static void test_file_basic_information(void)
|
||||
memset(&fbi, 0, sizeof(fbi));
|
||||
res = pNtQueryInformationFile(h, &io, &fbi, sizeof fbi, FileBasicInformation);
|
||||
ok ( res == STATUS_SUCCESS, "can't get attributes\n");
|
||||
- todo_wine ok ( (fbi.FileAttributes & attrib_mask) == FILE_ATTRIBUTE_HIDDEN, "attribute %lx not FILE_ATTRIBUTE_HIDDEN\n", fbi.FileAttributes );
|
||||
+ ok ( (fbi.FileAttributes & attrib_mask) == FILE_ATTRIBUTE_HIDDEN, "attribute %lx not FILE_ATTRIBUTE_HIDDEN (ok in old linux without xattr)\n", fbi.FileAttributes );
|
||||
|
||||
/* Check NORMAL last of all (to make sure we can clear attributes) */
|
||||
memset(&fbi, 0, sizeof(fbi));
|
||||
@@ -1471,7 +1471,7 @@ static void test_file_all_information(void)
|
||||
memset(&fai_buf.fai, 0, sizeof(fai_buf.fai));
|
||||
res = pNtQueryInformationFile(h, &io, &fai_buf.fai, sizeof fai_buf, FileAllInformation);
|
||||
ok ( res == STATUS_SUCCESS, "can't get attributes, res %x\n", res);
|
||||
- todo_wine ok ( (fai_buf.fai.BasicInformation.FileAttributes & attrib_mask) == FILE_ATTRIBUTE_SYSTEM, "attribute %lx not FILE_ATTRIBUTE_SYSTEM\n", fai_buf.fai.BasicInformation.FileAttributes );
|
||||
+ ok ( (fai_buf.fai.BasicInformation.FileAttributes & attrib_mask) == FILE_ATTRIBUTE_SYSTEM, "attribute %lx not FILE_ATTRIBUTE_SYSTEM (ok in old linux without xattr)\n", fai_buf.fai.BasicInformation.FileAttributes );
|
||||
|
||||
/* Then HIDDEN */
|
||||
memset(&fai_buf.fai.BasicInformation, 0, sizeof(fai_buf.fai.BasicInformation));
|
||||
@@ -1484,7 +1484,7 @@ static void test_file_all_information(void)
|
||||
memset(&fai_buf.fai, 0, sizeof(fai_buf.fai));
|
||||
res = pNtQueryInformationFile(h, &io, &fai_buf.fai, sizeof fai_buf, FileAllInformation);
|
||||
ok ( res == STATUS_SUCCESS, "can't get attributes\n");
|
||||
- todo_wine ok ( (fai_buf.fai.BasicInformation.FileAttributes & attrib_mask) == FILE_ATTRIBUTE_HIDDEN, "attribute %lx not FILE_ATTRIBUTE_HIDDEN\n", fai_buf.fai.BasicInformation.FileAttributes );
|
||||
+ ok ( (fai_buf.fai.BasicInformation.FileAttributes & attrib_mask) == FILE_ATTRIBUTE_HIDDEN, "attribute %lx not FILE_ATTRIBUTE_HIDDEN (ok in old linux without xattr)\n", fai_buf.fai.BasicInformation.FileAttributes );
|
||||
|
||||
/* Check NORMAL last of all (to make sure we can clear attributes) */
|
||||
memset(&fai_buf.fai.BasicInformation, 0, sizeof(fai_buf.fai.BasicInformation));
|
||||
diff --git a/dlls/ntdll/unix/file.c b/dlls/ntdll/unix/file.c
|
||||
index a3520898d57..cd53ca36238 100644
|
||||
--- a/dlls/ntdll/unix/file.c
|
||||
+++ b/dlls/ntdll/unix/file.c
|
||||
@@ -362,6 +362,26 @@ NTSTATUS errno_to_status( int err )
|
||||
#define XATTR_USER_PREFIX "user."
|
||||
#endif
|
||||
|
||||
+static int xattr_fremove( int filedes, const char *name )
|
||||
+{
|
||||
+#if defined(HAVE_ATTR_XATTR_H)
|
||||
+ return fremovexattr( filedes, name );
|
||||
+#else
|
||||
+ errno = ENOSYS;
|
||||
+ return -1;
|
||||
+#endif
|
||||
+}
|
||||
+
|
||||
+static int xattr_fset( int filedes, const char *name, void *value, size_t size )
|
||||
+{
|
||||
+#if defined(HAVE_ATTR_XATTR_H)
|
||||
+ return fsetxattr( filedes, name, value, size, 0 );
|
||||
+#else
|
||||
+ errno = ENOSYS;
|
||||
+ return -1;
|
||||
+#endif
|
||||
+}
|
||||
+
|
||||
static int xattr_get( const char *path, const char *name, void *value, size_t size )
|
||||
{
|
||||
#if defined(HAVE_ATTR_XATTR_H)
|
||||
@@ -1508,6 +1528,39 @@ static int fd_get_file_info( int fd, unsigned int options, struct stat *st, ULON
|
||||
}
|
||||
|
||||
|
||||
+/* set the stat info and file attributes for a file (by file descriptor) */
|
||||
+NTSTATUS fd_set_file_info( int fd, ULONG attr )
|
||||
+{
|
||||
+ char hexattr[11];
|
||||
+ struct stat st;
|
||||
+
|
||||
+ if (fstat( fd, &st ) == -1) return errno_to_status( errno );
|
||||
+ if (attr & FILE_ATTRIBUTE_READONLY)
|
||||
+ {
|
||||
+ if (S_ISDIR( st.st_mode))
|
||||
+ WARN("FILE_ATTRIBUTE_READONLY ignored for directory.\n");
|
||||
+ else
|
||||
+ st.st_mode &= ~0222; /* clear write permission bits */
|
||||
+ }
|
||||
+ else
|
||||
+ {
|
||||
+ /* add write permission only where we already have read permission */
|
||||
+ st.st_mode |= (0600 | ((st.st_mode & 044) >> 1)) & (~start_umask);
|
||||
+ }
|
||||
+ if (fchmod( fd, st.st_mode ) == -1) return errno_to_status( errno );
|
||||
+ attr &= ~FILE_ATTRIBUTE_NORMAL; /* do not store everything, but keep everything Samba can use */
|
||||
+ if (attr != 0)
|
||||
+ {
|
||||
+ int len;
|
||||
+
|
||||
+ len = sprintf( hexattr, "0x%x", attr );
|
||||
+ xattr_fset( fd, SAMBA_XATTR_DOS_ATTRIB, hexattr, len );
|
||||
+ }
|
||||
+ else
|
||||
+ xattr_fremove( fd, SAMBA_XATTR_DOS_ATTRIB );
|
||||
+ return STATUS_SUCCESS;
|
||||
+}
|
||||
+
|
||||
/* get the stat info and file attributes for a file (by name) */
|
||||
static int get_file_info( const char *path, struct stat *st, ULONG *attr )
|
||||
{
|
||||
@@ -4359,7 +4412,6 @@ NTSTATUS WINAPI NtSetInformationFile( HANDLE handle, IO_STATUS_BLOCK *io,
|
||||
case FileBasicInformation:
|
||||
if (len >= sizeof(FILE_BASIC_INFORMATION))
|
||||
{
|
||||
- struct stat st;
|
||||
const FILE_BASIC_INFORMATION *info = ptr;
|
||||
LARGE_INTEGER mtime, atime;
|
||||
|
||||
@@ -4373,25 +4425,7 @@ NTSTATUS WINAPI NtSetInformationFile( HANDLE handle, IO_STATUS_BLOCK *io,
|
||||
status = set_file_times( fd, &mtime, &atime );
|
||||
|
||||
if (status == STATUS_SUCCESS && info->FileAttributes)
|
||||
- {
|
||||
- if (fstat( fd, &st ) == -1) status = errno_to_status( errno );
|
||||
- else
|
||||
- {
|
||||
- if (info->FileAttributes & FILE_ATTRIBUTE_READONLY)
|
||||
- {
|
||||
- if (S_ISDIR( st.st_mode))
|
||||
- WARN("FILE_ATTRIBUTE_READONLY ignored for directory.\n");
|
||||
- else
|
||||
- st.st_mode &= ~0222; /* clear write permission bits */
|
||||
- }
|
||||
- else
|
||||
- {
|
||||
- /* add write permission only where we already have read permission */
|
||||
- st.st_mode |= (0600 | ((st.st_mode & 044) >> 1)) & (~start_umask);
|
||||
- }
|
||||
- if (fchmod( fd, st.st_mode ) == -1) status = errno_to_status( errno );
|
||||
- }
|
||||
- }
|
||||
+ status = fd_set_file_info( fd, info->FileAttributes );
|
||||
|
||||
if (needs_close) close( fd );
|
||||
}
|
||||
--
|
||||
2.35.1
|
||||
|
@ -1,154 +0,0 @@
|
||||
From 2f6ec5b1accc1ac275bcb4edeb44c15e271d2f72 Mon Sep 17 00:00:00 2001
|
||||
From: "Erich E. Hoover" <erich.e.hoover@gmail.com>
|
||||
Date: Wed, 20 Aug 2014 15:28:00 -0600
|
||||
Subject: [PATCH] ntdll: Implement storing DOS attributes in NtCreateFile.
|
||||
|
||||
---
|
||||
dlls/ntdll/tests/directory.c | 24 ++++++++---------
|
||||
dlls/ntdll/unix/file.c | 51 ++++++++++++++++++++++++++++++++----
|
||||
2 files changed, 57 insertions(+), 18 deletions(-)
|
||||
|
||||
diff --git a/dlls/ntdll/tests/directory.c b/dlls/ntdll/tests/directory.c
|
||||
index 77b17a50037..07211ebf5de 100644
|
||||
--- a/dlls/ntdll/tests/directory.c
|
||||
+++ b/dlls/ntdll/tests/directory.c
|
||||
@@ -56,7 +56,6 @@ static NTSTATUS (WINAPI *pRtlWow64EnableFsRedirectionEx)( ULONG disable, ULONG *
|
||||
|
||||
/* The attribute sets to test */
|
||||
static struct testfile_s {
|
||||
- BOOL todo; /* set if it doesn't work on wine yet */
|
||||
BOOL attr_done; /* set if attributes were tested for this file already */
|
||||
const DWORD attr; /* desired attribute */
|
||||
WCHAR name[20]; /* filename to use */
|
||||
@@ -64,16 +63,16 @@ static struct testfile_s {
|
||||
const char *description; /* for error messages */
|
||||
int nfound; /* How many were found (expect 1) */
|
||||
} testfiles[] = {
|
||||
- { 0, 0, FILE_ATTRIBUTE_NORMAL, {'l','o','n','g','f','i','l','e','n','a','m','e','.','t','m','p'}, "normal" },
|
||||
- { 0, 0, FILE_ATTRIBUTE_NORMAL, {'n','.','t','m','p',}, "normal" },
|
||||
- { 1, 0, FILE_ATTRIBUTE_HIDDEN, {'h','.','t','m','p',}, "hidden" },
|
||||
- { 1, 0, FILE_ATTRIBUTE_SYSTEM, {'s','.','t','m','p',}, "system" },
|
||||
- { 0, 0, FILE_ATTRIBUTE_DIRECTORY, {'d','.','t','m','p',}, "directory" },
|
||||
- { 0, 0, FILE_ATTRIBUTE_NORMAL, {0xe9,'a','.','t','m','p'}, "normal" },
|
||||
- { 0, 0, FILE_ATTRIBUTE_NORMAL, {0xc9,'b','.','t','m','p'}, "normal" },
|
||||
- { 0, 0, FILE_ATTRIBUTE_NORMAL, {'e','a','.','t','m','p'}, "normal" },
|
||||
- { 0, 0, FILE_ATTRIBUTE_DIRECTORY, {'.'}, ". directory" },
|
||||
- { 0, 0, FILE_ATTRIBUTE_DIRECTORY, {'.','.'}, ".. directory" }
|
||||
+ { 0, FILE_ATTRIBUTE_NORMAL, {'l','o','n','g','f','i','l','e','n','a','m','e','.','t','m','p'}, "normal" },
|
||||
+ { 0, FILE_ATTRIBUTE_NORMAL, {'n','.','t','m','p',}, "normal" },
|
||||
+ { 0, FILE_ATTRIBUTE_HIDDEN, {'h','.','t','m','p',}, "hidden" },
|
||||
+ { 0, FILE_ATTRIBUTE_SYSTEM, {'s','.','t','m','p',}, "system" },
|
||||
+ { 0, FILE_ATTRIBUTE_DIRECTORY, {'d','.','t','m','p',}, "directory" },
|
||||
+ { 0, FILE_ATTRIBUTE_NORMAL, {0xe9,'a','.','t','m','p'}, "normal" },
|
||||
+ { 0, FILE_ATTRIBUTE_NORMAL, {0xc9,'b','.','t','m','p'}, "normal" },
|
||||
+ { 0, FILE_ATTRIBUTE_NORMAL, {'e','a','.','t','m','p'}, "normal" },
|
||||
+ { 0, FILE_ATTRIBUTE_DIRECTORY, {'.'}, ". directory" },
|
||||
+ { 0, FILE_ATTRIBUTE_DIRECTORY, {'.','.'}, ".. directory" }
|
||||
};
|
||||
static const int test_dir_count = ARRAY_SIZE(testfiles);
|
||||
static const int max_test_dir_size = ARRAY_SIZE(testfiles) + 5; /* size of above plus some for .. etc */
|
||||
@@ -163,8 +162,7 @@ static void tally_test_file(FILE_BOTH_DIRECTORY_INFORMATION *dir_info)
|
||||
if (namelen != len || memcmp(nameW, testfiles[i].name, len*sizeof(WCHAR)))
|
||||
continue;
|
||||
if (!testfiles[i].attr_done) {
|
||||
- todo_wine_if (testfiles[i].todo)
|
||||
- ok (attrib == (testfiles[i].attr & attribmask), "file %s: expected %s (%lx), got %lx (is your linux new enough?)\n", wine_dbgstr_w(testfiles[i].name), testfiles[i].description, testfiles[i].attr, attrib);
|
||||
+ ok (attrib == (testfiles[i].attr & attribmask), "file %s: expected %s (%lx), got %lx (is your linux new enough?)\n", wine_dbgstr_w(testfiles[i].name), testfiles[i].description, testfiles[i].attr, attrib);
|
||||
testfiles[i].attr_done = TRUE;
|
||||
}
|
||||
testfiles[i].nfound++;
|
||||
diff --git a/dlls/ntdll/unix/file.c b/dlls/ntdll/unix/file.c
|
||||
index cd53ca36238..185db877d55 100644
|
||||
--- a/dlls/ntdll/unix/file.c
|
||||
+++ b/dlls/ntdll/unix/file.c
|
||||
@@ -392,6 +392,26 @@ static int xattr_get( const char *path, const char *name, void *value, size_t si
|
||||
#endif
|
||||
}
|
||||
|
||||
+static int xattr_remove( const char *path, const char *name )
|
||||
+{
|
||||
+#if defined(HAVE_ATTR_XATTR_H)
|
||||
+ return removexattr( path, name );
|
||||
+#else
|
||||
+ errno = ENOSYS;
|
||||
+ return -1;
|
||||
+#endif
|
||||
+}
|
||||
+
|
||||
+static int xattr_set( const char *path, const char *name, void *value, size_t size )
|
||||
+{
|
||||
+#if defined(HAVE_ATTR_XATTR_H)
|
||||
+ return setxattr( path, name, value, size, 0 );
|
||||
+#else
|
||||
+ errno = ENOSYS;
|
||||
+ return -1;
|
||||
+#endif
|
||||
+}
|
||||
+
|
||||
/* get space from the current directory data buffer, allocating a new one if necessary */
|
||||
static void *get_dir_data_space( struct dir_data *data, unsigned int size )
|
||||
{
|
||||
@@ -3786,6 +3806,20 @@ static NTSTATUS unmount_device( HANDLE handle )
|
||||
return status;
|
||||
}
|
||||
|
||||
+NTSTATUS set_file_info( const char *path, ULONG attr )
|
||||
+{
|
||||
+ char hexattr[11];
|
||||
+ int len;
|
||||
+
|
||||
+ /* Note: unix mode already set when called this way */
|
||||
+ attr &= ~FILE_ATTRIBUTE_NORMAL; /* do not store everything, but keep everything Samba can use */
|
||||
+ len = sprintf( hexattr, "0x%x", attr );
|
||||
+ if (attr != 0)
|
||||
+ xattr_set( path, SAMBA_XATTR_DOS_ATTRIB, hexattr, len );
|
||||
+ else
|
||||
+ xattr_remove( path, SAMBA_XATTR_DOS_ATTRIB );
|
||||
+ return STATUS_SUCCESS;
|
||||
+}
|
||||
|
||||
/******************************************************************************
|
||||
* open_unix_file
|
||||
@@ -3871,13 +3905,14 @@ NTSTATUS WINAPI NtCreateFile( HANDLE *handle, ACCESS_MASK access, OBJECT_ATTRIBU
|
||||
status = STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
- if (status == STATUS_SUCCESS)
|
||||
+ if (status != STATUS_SUCCESS)
|
||||
{
|
||||
- status = open_unix_file( handle, unix_name, access, &new_attr, attributes,
|
||||
- sharing, disposition, options, ea_buffer, ea_length );
|
||||
- free( unix_name );
|
||||
+ WARN( "%s not found (%x)\n", debugstr_us(attr->ObjectName), io->u.Status );
|
||||
+ return status;
|
||||
}
|
||||
- else WARN( "%s not found (%x)\n", debugstr_us(attr->ObjectName), status );
|
||||
+
|
||||
+ status = open_unix_file( handle, unix_name, access, &new_attr, attributes,
|
||||
+ sharing, disposition, options, ea_buffer, ea_length );
|
||||
|
||||
if (status == STATUS_SUCCESS)
|
||||
{
|
||||
@@ -3899,6 +3934,11 @@ NTSTATUS WINAPI NtCreateFile( HANDLE *handle, ACCESS_MASK access, OBJECT_ATTRIBU
|
||||
io->Information = FILE_OVERWRITTEN;
|
||||
break;
|
||||
}
|
||||
+ if (io->Information == FILE_CREATED)
|
||||
+ {
|
||||
+ /* set any DOS extended attributes */
|
||||
+ set_file_info( unix_name, attributes );
|
||||
+ }
|
||||
}
|
||||
else if (status == STATUS_TOO_MANY_OPENED_FILES)
|
||||
{
|
||||
@@ -3907,6 +3947,7 @@ NTSTATUS WINAPI NtCreateFile( HANDLE *handle, ACCESS_MASK access, OBJECT_ATTRIBU
|
||||
}
|
||||
|
||||
free( nt_name.Buffer );
|
||||
+ free( unix_name );
|
||||
return io->u.Status = status;
|
||||
}
|
||||
|
||||
--
|
||||
2.35.1
|
||||
|
@ -1,2 +1,4 @@
|
||||
Fixes: [9158] Support for DOS hidden/system file attributes
|
||||
Fixes: [15679] cygwin symlinks not working in wine
|
||||
# Hopefully in the process of upstreaming.
|
||||
Disabled: true
|
@ -1,4 +1,4 @@
|
||||
From 6209b270e6f2a7913a95f6c1da18c11e2e2a73a5 Mon Sep 17 00:00:00 2001
|
||||
From 98350beb9209a2fdb1caeaf9ca6cf508ab2b4d80 Mon Sep 17 00:00:00 2001
|
||||
From: "Erich E. Hoover" <erich.e.hoover@gmail.com>
|
||||
Date: Thu, 16 Jan 2014 20:56:49 -0700
|
||||
Subject: [PATCH] ntdll: Add support for creating reparse points.
|
||||
@ -15,10 +15,10 @@ Signed-off-by: Erich E. Hoover <erich.e.hoover@gmail.com>
|
||||
create mode 100644 include/ntifs.h
|
||||
|
||||
diff --git a/configure.ac b/configure.ac
|
||||
index 3ea4c2afe0a..d0ec1d837c3 100644
|
||||
index 41a29cee398..167839c5793 100644
|
||||
--- a/configure.ac
|
||||
+++ b/configure.ac
|
||||
@@ -2030,6 +2030,8 @@ AC_CHECK_FUNCS(\
|
||||
@@ -2025,6 +2025,8 @@ AC_CHECK_FUNCS(\
|
||||
prctl \
|
||||
proc_pidinfo \
|
||||
sched_yield \
|
||||
@ -41,7 +41,7 @@ index 3b1cdb54f9f..6eb4690f8e0 100644
|
||||
EXTRADLLFLAGS = -nodefaultlibs -Wl,--image-base,0x7bc00000
|
||||
x86_64_EXTRADLLFLAGS = -nodefaultlibs -Wl,--image-base,0x170000000
|
||||
diff --git a/dlls/ntdll/tests/file.c b/dlls/ntdll/tests/file.c
|
||||
index 4b142f241e5..5f6cb223951 100644
|
||||
index ddc864b3588..2baacaa9bc3 100644
|
||||
--- a/dlls/ntdll/tests/file.c
|
||||
+++ b/dlls/ntdll/tests/file.c
|
||||
@@ -38,6 +38,7 @@
|
||||
@ -217,19 +217,19 @@ index 4b142f241e5..5f6cb223951 100644
|
||||
test_mailslot_name();
|
||||
}
|
||||
diff --git a/dlls/ntdll/unix/file.c b/dlls/ntdll/unix/file.c
|
||||
index d103e3195b5..3fb4ded846c 100644
|
||||
index 604ca866890..58310fd8504 100644
|
||||
--- a/dlls/ntdll/unix/file.c
|
||||
+++ b/dlls/ntdll/unix/file.c
|
||||
@@ -35,6 +35,8 @@
|
||||
#include <string.h>
|
||||
@@ -36,6 +36,8 @@
|
||||
#include <stdlib.h>
|
||||
#include <stdint.h>
|
||||
#include <stdio.h>
|
||||
+#include <math.h>
|
||||
+#include <libgen.h>
|
||||
#include <limits.h>
|
||||
#include <unistd.h>
|
||||
#ifdef HAVE_MNTENT_H
|
||||
@@ -127,6 +129,7 @@
|
||||
@@ -121,6 +123,7 @@
|
||||
#include "wine/list.h"
|
||||
#include "wine/debug.h"
|
||||
#include "unix_private.h"
|
||||
@ -237,7 +237,7 @@ index d103e3195b5..3fb4ded846c 100644
|
||||
|
||||
WINE_DEFAULT_DEBUG_CHANNEL(file);
|
||||
WINE_DECLARE_DEBUG_CHANNEL(winediag);
|
||||
@@ -138,6 +141,12 @@ WINE_DECLARE_DEBUG_CHANNEL(winediag);
|
||||
@@ -132,6 +135,12 @@ WINE_DECLARE_DEBUG_CHANNEL(winediag);
|
||||
#undef EXT2_IOC_GETFLAGS
|
||||
#undef EXT4_CASEFOLD_FL
|
||||
|
||||
@ -250,7 +250,7 @@ index d103e3195b5..3fb4ded846c 100644
|
||||
#ifdef linux
|
||||
|
||||
/* We want the real kernel dirent structure, not the libc one */
|
||||
@@ -239,6 +248,95 @@ static const BOOL is_case_sensitive = FALSE;
|
||||
@@ -236,6 +245,95 @@ static const BOOL is_case_sensitive = FALSE;
|
||||
static pthread_mutex_t dir_mutex = PTHREAD_MUTEX_INITIALIZER;
|
||||
static pthread_mutex_t mnt_mutex = PTHREAD_MUTEX_INITIALIZER;
|
||||
|
||||
@ -346,7 +346,7 @@ index d103e3195b5..3fb4ded846c 100644
|
||||
/* check if a given Unicode char is OK in a DOS short name */
|
||||
static inline BOOL is_invalid_dos_char( WCHAR ch )
|
||||
{
|
||||
@@ -1574,6 +1672,28 @@ static inline ULONG get_file_attributes( const struct stat *st )
|
||||
@@ -1540,6 +1638,28 @@ static int parse_samba_dos_attrib_data( char *data, int len )
|
||||
}
|
||||
|
||||
|
||||
@ -375,7 +375,7 @@ index d103e3195b5..3fb4ded846c 100644
|
||||
static BOOL fd_is_mount_point( int fd, const struct stat *st )
|
||||
{
|
||||
struct stat parent;
|
||||
@@ -3313,6 +3433,179 @@ done:
|
||||
@@ -3303,6 +3423,179 @@ done:
|
||||
}
|
||||
|
||||
|
||||
@ -555,7 +555,7 @@ index d103e3195b5..3fb4ded846c 100644
|
||||
/******************************************************************************
|
||||
* lookup_unix_name
|
||||
*
|
||||
@@ -6060,6 +6353,13 @@ NTSTATUS WINAPI NtFsControlFile( HANDLE handle, HANDLE event, PIO_APC_ROUTINE ap
|
||||
@@ -6052,6 +6345,13 @@ NTSTATUS WINAPI NtFsControlFile( HANDLE handle, HANDLE event, PIO_APC_ROUTINE ap
|
||||
break;
|
||||
}
|
||||
|
||||
@ -570,7 +570,7 @@ index d103e3195b5..3fb4ded846c 100644
|
||||
TRACE("FSCTL_SET_SPARSE: Ignoring request\n");
|
||||
io->Information = 0;
|
||||
diff --git a/include/Makefile.in b/include/Makefile.in
|
||||
index 70134a7bcb7..bdddf5426fe 100644
|
||||
index 1c04f9a298b..7a2c9f96c1b 100644
|
||||
--- a/include/Makefile.in
|
||||
+++ b/include/Makefile.in
|
||||
@@ -563,6 +563,7 @@ SOURCES = \
|
||||
|
@ -1,4 +1,4 @@
|
||||
From f93a10fd26b694aa0df49f032844f9ddd34c632d Mon Sep 17 00:00:00 2001
|
||||
From e64115c5421f37bbc426455d338d16ccb60ac9b2 Mon Sep 17 00:00:00 2001
|
||||
From: "Erich E. Hoover" <erich.e.hoover@gmail.com>
|
||||
Date: Thu, 16 Jan 2014 21:01:25 -0700
|
||||
Subject: [PATCH] ntdll: Add support for testing for reparse points with
|
||||
@ -7,11 +7,11 @@ Subject: [PATCH] ntdll: Add support for testing for reparse points with
|
||||
Signed-off-by: Erich E. Hoover <erich.e.hoover@gmail.com>
|
||||
---
|
||||
dlls/ntdll/tests/file.c | 5 +++++
|
||||
dlls/ntdll/unix/file.c | 25 ++++++++++++++++++++-----
|
||||
2 files changed, 25 insertions(+), 5 deletions(-)
|
||||
dlls/ntdll/unix/file.c | 26 +++++++++++++++++++++-----
|
||||
2 files changed, 26 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/dlls/ntdll/tests/file.c b/dlls/ntdll/tests/file.c
|
||||
index 54f7c7fc860..7fa50ec59a6 100644
|
||||
index 2641197130b..4a18bd5c01a 100644
|
||||
--- a/dlls/ntdll/tests/file.c
|
||||
+++ b/dlls/ntdll/tests/file.c
|
||||
@@ -5469,6 +5469,11 @@ static void test_reparse_points(void)
|
||||
@ -27,10 +27,10 @@ index 54f7c7fc860..7fa50ec59a6 100644
|
||||
HeapFree(GetProcessHeap(), 0, buffer);
|
||||
buffer_len = sizeof(*buffer) + 2*32767;
|
||||
diff --git a/dlls/ntdll/unix/file.c b/dlls/ntdll/unix/file.c
|
||||
index af390214624..201eeab7013 100644
|
||||
index 0b2987bf140..92dcd7775d6 100644
|
||||
--- a/dlls/ntdll/unix/file.c
|
||||
+++ b/dlls/ntdll/unix/file.c
|
||||
@@ -1788,10 +1788,20 @@ static int fd_get_file_info( int fd, unsigned int options, struct stat *st, ULON
|
||||
@@ -1755,11 +1755,22 @@ static int fd_get_file_info( int fd, unsigned int options, struct stat *st, ULON
|
||||
*attr = 0;
|
||||
ret = fstat( fd, st );
|
||||
if (ret == -1) return ret;
|
||||
@ -38,6 +38,7 @@ index af390214624..201eeab7013 100644
|
||||
/* consider mount points to be reparse points (IO_REPARSE_TAG_MOUNT_POINT) */
|
||||
if ((options & FILE_OPEN_REPARSE_POINT) && fd_is_mount_point( fd, st ))
|
||||
*attr |= FILE_ATTRIBUTE_REPARSE_POINT;
|
||||
|
||||
+ if (S_ISLNK( st->st_mode ))
|
||||
+ {
|
||||
+ BOOL is_dir;
|
||||
@ -49,10 +50,11 @@ index af390214624..201eeab7013 100644
|
||||
+ st->st_mode = (st->st_mode & ~S_IFMT) | (is_dir ? S_IFDIR : S_IFREG);
|
||||
+ }
|
||||
+ *attr |= get_file_attributes( st );
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -1841,10 +1851,15 @@ static int get_file_info( const char *path, struct stat *st, ULONG *attr )
|
||||
+
|
||||
attr_len = xattr_fget( fd, SAMBA_XATTR_DOS_ATTRIB, attr_data, sizeof(attr_data)-1 );
|
||||
if (attr_len != -1)
|
||||
*attr |= parse_samba_dos_attrib_data( attr_data, attr_len );
|
||||
@@ -1828,10 +1839,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 ))
|
||||
{
|
||||
|
@ -1,5 +1,4 @@
|
||||
Fixes: [12401] NET Framework 2.0, 3.0, 4.0 installers and other apps that make use of GAC API for managed assembly installation on NTFS filesystems need reparse point/junction API support (FSCTL_SET_REPARSE_POINT/FSCTL_GET_REPARSE_POINT)
|
||||
Fixes: [44948] Multiple apps (Spine (Mod starter for Gothic), MS Office 365 installer) need CreateSymbolicLinkW implementation
|
||||
Depends: ntdll-DOS_Attributes
|
||||
Depends: ntdll-NtQueryEaFile
|
||||
Depends: ntdll-Serial_Port_Detection
|
||||
|
@ -51,7 +51,7 @@ usage()
|
||||
# Get the upstream commit sha
|
||||
upstream_commit()
|
||||
{
|
||||
echo "2a4ec7dafc7ee38108f6a9f626a7c39e6b6777e0"
|
||||
echo "16c6c249a5134de2422fbd3471ead7425c968301"
|
||||
}
|
||||
|
||||
# Show version information
|
||||
@ -132,7 +132,6 @@ patch_enable_all ()
|
||||
enable_ntdll_APC_Performance="$1"
|
||||
enable_ntdll_Builtin_Prot="$1"
|
||||
enable_ntdll_CriticalSection="$1"
|
||||
enable_ntdll_DOS_Attributes="$1"
|
||||
enable_ntdll_Exception="$1"
|
||||
enable_ntdll_ForceBottomUpAlloc="$1"
|
||||
enable_ntdll_HashLinks="$1"
|
||||
@ -416,9 +415,6 @@ patch_enable ()
|
||||
ntdll-CriticalSection)
|
||||
enable_ntdll_CriticalSection="$2"
|
||||
;;
|
||||
ntdll-DOS_Attributes)
|
||||
enable_ntdll_DOS_Attributes="$2"
|
||||
;;
|
||||
ntdll-Exception)
|
||||
enable_ntdll_Exception="$2"
|
||||
;;
|
||||
@ -1208,13 +1204,9 @@ if test "$enable_shell32_Progress_Dialog" -eq 1; then
|
||||
fi
|
||||
|
||||
if test "$enable_server_Stored_ACLs" -eq 1; then
|
||||
if test "$enable_ntdll_DOS_Attributes" -gt 1; then
|
||||
abort "Patchset ntdll-DOS_Attributes disabled, but server-Stored_ACLs depends on that."
|
||||
fi
|
||||
if test "$enable_server_File_Permissions" -gt 1; then
|
||||
abort "Patchset server-File_Permissions disabled, but server-Stored_ACLs depends on that."
|
||||
fi
|
||||
enable_ntdll_DOS_Attributes=1
|
||||
enable_server_File_Permissions=1
|
||||
fi
|
||||
|
||||
@ -1301,16 +1293,12 @@ if test "$enable_eventfd_synchronization" -eq 1; then
|
||||
fi
|
||||
|
||||
if test "$enable_ntdll_Junction_Points" -eq 1; then
|
||||
if test "$enable_ntdll_DOS_Attributes" -gt 1; then
|
||||
abort "Patchset ntdll-DOS_Attributes disabled, but ntdll-Junction_Points depends on that."
|
||||
fi
|
||||
if test "$enable_ntdll_NtQueryEaFile" -gt 1; then
|
||||
abort "Patchset ntdll-NtQueryEaFile disabled, but ntdll-Junction_Points depends on that."
|
||||
fi
|
||||
if test "$enable_ntdll_Serial_Port_Detection" -gt 1; then
|
||||
abort "Patchset ntdll-Serial_Port_Detection disabled, but ntdll-Junction_Points depends on that."
|
||||
fi
|
||||
enable_ntdll_DOS_Attributes=1
|
||||
enable_ntdll_NtQueryEaFile=1
|
||||
enable_ntdll_Serial_Port_Detection=1
|
||||
fi
|
||||
@ -1677,25 +1665,6 @@ if test "$enable_dsound_EAX" -eq 1; then
|
||||
patch_apply dsound-EAX/0023-dsound-Fake-success-for-EAX-Set-Buffer-ListenerPrope.patch
|
||||
fi
|
||||
|
||||
# Patchset ntdll-DOS_Attributes
|
||||
# |
|
||||
# | This patchset fixes the following Wine bugs:
|
||||
# | * [#9158] Support for DOS hidden/system file attributes
|
||||
# | * [#15679] cygwin symlinks not working in wine
|
||||
# |
|
||||
# | Modified files:
|
||||
# | * configure.ac, dlls/ntdll/tests/directory.c, dlls/ntdll/tests/file.c, dlls/ntdll/unix/file.c
|
||||
# |
|
||||
if test "$enable_ntdll_DOS_Attributes" -eq 1; then
|
||||
patch_apply ntdll-DOS_Attributes/0001-ntdll-Implement-retrieving-DOS-attributes-in-fd_-get.patch
|
||||
patch_apply ntdll-DOS_Attributes/0003-ntdll-Implement-storing-DOS-attributes-in-NtSetInfor.patch
|
||||
patch_apply ntdll-DOS_Attributes/0004-ntdll-Implement-storing-DOS-attributes-in-NtCreateFi.patch
|
||||
patch_apply ntdll-DOS_Attributes/0005-libport-Add-support-for-Mac-OS-X-style-extended-attr.patch
|
||||
patch_apply ntdll-DOS_Attributes/0006-libport-Add-support-for-FreeBSD-style-extended-attri.patch
|
||||
patch_apply ntdll-DOS_Attributes/0007-ntdll-Perform-the-Unix-style-hidden-file-check-withi.patch
|
||||
patch_apply ntdll-DOS_Attributes/0008-ntdll-Always-store-SAMBA_XATTR_DOS_ATTRIB-when-path-.patch
|
||||
fi
|
||||
|
||||
# Patchset ntdll-NtQueryEaFile
|
||||
# |
|
||||
# | Modified files:
|
||||
@ -1720,7 +1689,7 @@ fi
|
||||
# Patchset ntdll-Junction_Points
|
||||
# |
|
||||
# | This patchset has the following (direct or indirect) dependencies:
|
||||
# | * ntdll-DOS_Attributes, ntdll-NtQueryEaFile, ntdll-Serial_Port_Detection
|
||||
# | * ntdll-NtQueryEaFile, ntdll-Serial_Port_Detection
|
||||
# |
|
||||
# | This patchset fixes the following Wine bugs:
|
||||
# | * [#12401] NET Framework 2.0, 3.0, 4.0 installers and other apps that make use of GAC API for managed assembly
|
||||
@ -1797,8 +1766,8 @@ fi
|
||||
# Patchset eventfd_synchronization
|
||||
# |
|
||||
# | This patchset has the following (direct or indirect) dependencies:
|
||||
# | * ntdll-DOS_Attributes, ntdll-NtQueryEaFile, ntdll-Serial_Port_Detection, ntdll-Junction_Points, server-PeekMessage,
|
||||
# | server-Realtime_Priority, server-Signal_Thread
|
||||
# | * ntdll-NtQueryEaFile, ntdll-Serial_Port_Detection, ntdll-Junction_Points, server-PeekMessage, server-Realtime_Priority,
|
||||
# | server-Signal_Thread
|
||||
# |
|
||||
# | This patchset fixes the following Wine bugs:
|
||||
# | * [#36692] Many multi-threaded applications have poor performance due to heavy use of synchronization primitives
|
||||
@ -2577,14 +2546,13 @@ fi
|
||||
# | * [#51775] sapi: Allow iteration of Token objects.
|
||||
# |
|
||||
# | Modified files:
|
||||
# | * dlls/sapi/sapi.rgs, dlls/sapi/tests/token.c, dlls/sapi/token.c
|
||||
# | * dlls/sapi/sapi.rgs, dlls/sapi/token.c
|
||||
# |
|
||||
if test "$enable_sapi_iteration_tokens" -eq 1; then
|
||||
patch_apply sapi-iteration-tokens/0001-sapi-Implement-ISpRegDataKey-CreateKey.patch
|
||||
patch_apply sapi-iteration-tokens/0003-sapi-Implement-ISpRegDataKey-GetStringValue.patch
|
||||
patch_apply sapi-iteration-tokens/0004-sapi-EnumTokens-setup-enumeration-members.patch
|
||||
patch_apply sapi-iteration-tokens/0005-sapi-Implement-ISpObjectTokenEnumBuilder-Item.patch
|
||||
patch_apply sapi-iteration-tokens/0006-sapi-Implement-ISpObjectToken-GetId.patch
|
||||
patch_apply sapi-iteration-tokens/0007-sapi-Implement-ISpObjectToken-OpenKey.patch
|
||||
patch_apply sapi-iteration-tokens/0008-sapi-Add-default-voice-registry-key.patch
|
||||
patch_apply sapi-iteration-tokens/0009-sapi-Return-dump-object-in-ISpObjectTokenEnumBuilder.patch
|
||||
@ -2605,7 +2573,7 @@ fi
|
||||
# Patchset server-File_Permissions
|
||||
# |
|
||||
# | This patchset has the following (direct or indirect) dependencies:
|
||||
# | * ntdll-DOS_Attributes, ntdll-NtQueryEaFile, ntdll-Serial_Port_Detection, ntdll-Junction_Points
|
||||
# | * ntdll-NtQueryEaFile, ntdll-Serial_Port_Detection, ntdll-Junction_Points
|
||||
# |
|
||||
# | Modified files:
|
||||
# | * dlls/advapi32/tests/security.c, dlls/ntdll/tests/file.c, server/fd.c
|
||||
@ -2623,7 +2591,7 @@ fi
|
||||
# Patchset server-Stored_ACLs
|
||||
# |
|
||||
# | This patchset has the following (direct or indirect) dependencies:
|
||||
# | * ntdll-DOS_Attributes, ntdll-NtQueryEaFile, ntdll-Serial_Port_Detection, ntdll-Junction_Points, server-File_Permissions
|
||||
# | * ntdll-NtQueryEaFile, ntdll-Serial_Port_Detection, ntdll-Junction_Points, server-File_Permissions
|
||||
# |
|
||||
# | This patchset fixes the following Wine bugs:
|
||||
# | * [#33576] Support for stored file ACLs
|
||||
|
@ -1,17 +1,17 @@
|
||||
From 9642c43791d10664565e11fb11f9e6165eb4cef6 Mon Sep 17 00:00:00 2001
|
||||
From 8e0713bfe03d37f19c2645a67b05024a86df0af8 Mon Sep 17 00:00:00 2001
|
||||
From: Alistair Leslie-Hughes <leslie_alistair@hotmail.com>
|
||||
Date: Wed, 22 Sep 2021 19:01:44 +1000
|
||||
Subject: [PATCH 5/8] sapi: Implement ISpObjectTokenEnumBuilder Item
|
||||
Subject: [PATCH] sapi: Implement ISpObjectTokenEnumBuilder Item
|
||||
|
||||
---
|
||||
dlls/sapi/token.c | 67 ++++++++++++++++++++++++++++++++++++-----------
|
||||
1 file changed, 52 insertions(+), 15 deletions(-)
|
||||
dlls/sapi/token.c | 69 ++++++++++++++++++++++++++++++++++++-----------
|
||||
1 file changed, 53 insertions(+), 16 deletions(-)
|
||||
|
||||
diff --git a/dlls/sapi/token.c b/dlls/sapi/token.c
|
||||
index 6bf66bc0d5b..d16478d0064 100644
|
||||
index c16572ff1f2..eb6d746cb04 100644
|
||||
--- a/dlls/sapi/token.c
|
||||
+++ b/dlls/sapi/token.c
|
||||
@@ -64,6 +64,19 @@ static struct token_enum *impl_from_ISpObjectTokenEnumBuilder( ISpObjectTokenEnu
|
||||
@@ -64,6 +64,20 @@ static struct token_enum *impl_from_ISpObjectTokenEnumBuilder( ISpObjectTokenEnu
|
||||
return CONTAINING_RECORD( iface, struct token_enum, ISpObjectTokenEnumBuilder_iface );
|
||||
}
|
||||
|
||||
@ -21,6 +21,7 @@ index 6bf66bc0d5b..d16478d0064 100644
|
||||
+ LONG ref;
|
||||
+
|
||||
+ HKEY token_key;
|
||||
+ WCHAR *token_id;
|
||||
+};
|
||||
+
|
||||
+static struct object_token *impl_from_ISpObjectToken( ISpObjectToken *iface )
|
||||
@ -31,7 +32,7 @@ index 6bf66bc0d5b..d16478d0064 100644
|
||||
static HRESULT WINAPI data_key_QueryInterface( ISpRegDataKey *iface, REFIID iid, void **obj )
|
||||
{
|
||||
struct data_key *This = impl_from_ISpRegDataKey( iface );
|
||||
@@ -725,8 +738,45 @@ static HRESULT WINAPI token_enum_Clone( ISpObjectTokenEnumBuilder *iface,
|
||||
@@ -725,8 +739,45 @@ static HRESULT WINAPI token_enum_Clone( ISpObjectTokenEnumBuilder *iface,
|
||||
static HRESULT WINAPI token_enum_Item( ISpObjectTokenEnumBuilder *iface,
|
||||
ULONG index, ISpObjectToken **token )
|
||||
{
|
||||
@ -79,7 +80,7 @@ index 6bf66bc0d5b..d16478d0064 100644
|
||||
}
|
||||
|
||||
static HRESULT WINAPI token_enum_GetCount( ISpObjectTokenEnumBuilder *iface,
|
||||
@@ -837,19 +887,6 @@ HRESULT token_enum_create( IUnknown *outer, REFIID iid, void **obj )
|
||||
@@ -838,20 +889,6 @@ HRESULT token_enum_create( IUnknown *outer, REFIID iid, void **obj )
|
||||
return hr;
|
||||
}
|
||||
|
||||
@ -89,6 +90,7 @@ index 6bf66bc0d5b..d16478d0064 100644
|
||||
- LONG ref;
|
||||
-
|
||||
- HKEY token_key;
|
||||
- WCHAR *token_id;
|
||||
-};
|
||||
-
|
||||
-static struct object_token *impl_from_ISpObjectToken( ISpObjectToken *iface )
|
||||
@ -100,5 +102,5 @@ index 6bf66bc0d5b..d16478d0064 100644
|
||||
REFIID iid, void **obj )
|
||||
{
|
||||
--
|
||||
2.33.0
|
||||
2.35.1
|
||||
|
||||
|
@ -1,114 +0,0 @@
|
||||
From 614d8a2d74f7b5e7fdd2739741dc0fc42e57eebd Mon Sep 17 00:00:00 2001
|
||||
From: Alistair Leslie-Hughes <leslie_alistair@hotmail.com>
|
||||
Date: Wed, 22 Sep 2021 19:01:44 +1000
|
||||
Subject: [PATCH] sapi: Implement ISpObjectToken GetId
|
||||
|
||||
---
|
||||
dlls/sapi/tests/token.c | 7 ++++---
|
||||
dlls/sapi/token.c | 27 ++++++++++++++++++++++++---
|
||||
2 files changed, 28 insertions(+), 6 deletions(-)
|
||||
|
||||
diff --git a/dlls/sapi/tests/token.c b/dlls/sapi/tests/token.c
|
||||
index 9473d56b4d1..260e059127d 100644
|
||||
--- a/dlls/sapi/tests/token.c
|
||||
+++ b/dlls/sapi/tests/token.c
|
||||
@@ -185,11 +185,11 @@ static void test_object_token(void)
|
||||
ok( hr == S_OK, "got %08lx\n", hr );
|
||||
|
||||
hr = ISpObjectToken_GetId( token, NULL );
|
||||
- todo_wine ok( hr == SPERR_UNINITIALIZED, "got %08lx\n", hr );
|
||||
+ ok( hr == SPERR_UNINITIALIZED, "got %08lx\n", hr );
|
||||
|
||||
tempW = (LPWSTR)0xdeadbeef;
|
||||
hr = ISpObjectToken_GetId( token, &tempW );
|
||||
- todo_wine ok( hr == SPERR_UNINITIALIZED, "got %08lx\n", hr );
|
||||
+ ok( hr == SPERR_UNINITIALIZED, "got %08lx\n", hr );
|
||||
ok( tempW == (LPWSTR)0xdeadbeef, "got %s\n", wine_dbgstr_w(tempW) );
|
||||
|
||||
hr = ISpObjectToken_GetCategory( token, NULL );
|
||||
@@ -220,7 +220,7 @@ static void test_object_token(void)
|
||||
ok( hr == SPERR_ALREADY_INITIALIZED, "got %08lx\n", hr );
|
||||
|
||||
hr = ISpObjectToken_GetId( token, NULL );
|
||||
- todo_wine ok( hr == E_POINTER, "got %08lx\n", hr );
|
||||
+ ok( hr == E_POINTER, "got %08lx\n", hr );
|
||||
|
||||
hr = ISpObjectToken_GetCategory( token, NULL );
|
||||
todo_wine ok( hr == E_POINTER, "got %08lx\n", hr );
|
||||
@@ -297,6 +297,7 @@ static void test_object_token(void)
|
||||
ISpObjectToken_Release( token );
|
||||
}
|
||||
|
||||
+
|
||||
START_TEST(token)
|
||||
{
|
||||
CoInitialize( NULL );
|
||||
diff --git a/dlls/sapi/token.c b/dlls/sapi/token.c
|
||||
index a514b2995b4..e0fbf200d65 100644
|
||||
--- a/dlls/sapi/token.c
|
||||
+++ b/dlls/sapi/token.c
|
||||
@@ -70,6 +70,7 @@ struct object_token
|
||||
LONG ref;
|
||||
|
||||
HKEY token_key;
|
||||
+ WCHAR *token_id;
|
||||
};
|
||||
|
||||
static struct object_token *impl_from_ISpObjectToken( ISpObjectToken *iface )
|
||||
@@ -765,7 +766,6 @@ static HRESULT WINAPI token_enum_Item( ISpObjectTokenEnumBuilder *iface,
|
||||
ret = RegOpenKeyExW (This->key, subkey, 0, KEY_READ, &key);
|
||||
if (ret != ERROR_SUCCESS)
|
||||
return HRESULT_FROM_WIN32(ret);
|
||||
- heap_free(subkey);
|
||||
|
||||
hr = token_create( NULL, &IID_ISpObjectToken, (void**)&subtoken );
|
||||
if (FAILED(hr))
|
||||
@@ -773,6 +773,7 @@ static HRESULT WINAPI token_enum_Item( ISpObjectTokenEnumBuilder *iface,
|
||||
|
||||
object = impl_from_ISpObjectToken( subtoken );
|
||||
object->token_key = key;
|
||||
+ object->token_id = subkey;
|
||||
|
||||
*token = subtoken;
|
||||
|
||||
@@ -927,6 +928,7 @@ static ULONG WINAPI token_Release( ISpObjectToken *iface )
|
||||
if (!ref)
|
||||
{
|
||||
if (This->token_key) RegCloseKey( This->token_key );
|
||||
+ heap_free(This->token_id);
|
||||
heap_free( This );
|
||||
}
|
||||
|
||||
@@ -1053,8 +1055,27 @@ static HRESULT WINAPI token_SetId( ISpObjectToken *iface,
|
||||
static HRESULT WINAPI token_GetId( ISpObjectToken *iface,
|
||||
LPWSTR *token_id )
|
||||
{
|
||||
- FIXME( "stub\n" );
|
||||
- return E_NOTIMPL;
|
||||
+ struct object_token *This = impl_from_ISpObjectToken( iface );
|
||||
+
|
||||
+ TRACE( "%p, %p\n", This, token_id);
|
||||
+
|
||||
+ if (!This->token_key)
|
||||
+ return SPERR_UNINITIALIZED;
|
||||
+
|
||||
+ if (!token_id)
|
||||
+ return E_POINTER;
|
||||
+
|
||||
+ if (!This->token_id)
|
||||
+ {
|
||||
+ FIXME("Loading default category not supported.\n");
|
||||
+ return E_POINTER;
|
||||
+ }
|
||||
+ *token_id = CoTaskMemAlloc( (wcslen(This->token_id) + 1) * sizeof(WCHAR));
|
||||
+ if (!*token_id)
|
||||
+ return E_OUTOFMEMORY;
|
||||
+
|
||||
+ wcscpy(*token_id, This->token_id);
|
||||
+ return S_OK;
|
||||
}
|
||||
|
||||
static HRESULT WINAPI token_GetCategory( ISpObjectToken *iface,
|
||||
--
|
||||
2.34.1
|
||||
|
@ -1,3 +1,2 @@
|
||||
Depends: ntdll-DOS_Attributes
|
||||
Depends: server-File_Permissions
|
||||
Fixes: [33576] Support for stored file ACLs
|
||||
|
@ -1,4 +1,4 @@
|
||||
From ad46f8fd4e3d8e064606922e9f6fe8f9bbc1450f Mon Sep 17 00:00:00 2001
|
||||
From 69b8c9461157d1b988ec039c4f7e7a467cb9e951 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Michael=20M=C3=BCller?= <michael@fds-team.de>
|
||||
Date: Sun, 16 Aug 2015 17:34:22 +0200
|
||||
Subject: [PATCH] shell32: Implement NewMenu with new folder item.
|
||||
@ -21,10 +21,10 @@ Correct header issue when compiling i386 (var_arg)
|
||||
create mode 100644 dlls/shell32/shellnew.c
|
||||
|
||||
diff --git a/dlls/shell32/Makefile.in b/dlls/shell32/Makefile.in
|
||||
index eeb6cd63d60..619b33837ab 100644
|
||||
index 9e2395126fc..3bba1b0e3fd 100644
|
||||
--- a/dlls/shell32/Makefile.in
|
||||
+++ b/dlls/shell32/Makefile.in
|
||||
@@ -29,6 +29,7 @@ C_SRCS = \
|
||||
@@ -28,6 +28,7 @@ C_SRCS = \
|
||||
shelldispatch.c \
|
||||
shellitem.c \
|
||||
shelllink.c \
|
||||
@ -33,7 +33,7 @@ index eeb6cd63d60..619b33837ab 100644
|
||||
shellord.c \
|
||||
shellpath.c \
|
||||
diff --git a/dlls/shell32/shell32_classes.idl b/dlls/shell32/shell32_classes.idl
|
||||
index 22ef49ae5c7..699ad1a2f03 100644
|
||||
index dc65ed3728d..c5f4215196f 100644
|
||||
--- a/dlls/shell32/shell32_classes.idl
|
||||
+++ b/dlls/shell32/shell32_classes.idl
|
||||
@@ -86,6 +86,11 @@ coclass KnownFolderManager { interface IKnownFolderManager; }
|
||||
@ -49,7 +49,7 @@ index 22ef49ae5c7..699ad1a2f03 100644
|
||||
threading(apartment),
|
||||
uuid(00bb2763-6a77-11d0-a535-00c04fd7d062)
|
||||
diff --git a/dlls/shell32/shell32_main.h b/dlls/shell32/shell32_main.h
|
||||
index ca93293e50b..073bb7e9b2b 100644
|
||||
index 7bb26e46a6e..f539a1b1e00 100644
|
||||
--- a/dlls/shell32/shell32_main.h
|
||||
+++ b/dlls/shell32/shell32_main.h
|
||||
@@ -101,6 +101,7 @@ HRESULT WINAPI RecycleBin_Constructor(IUnknown * pUnkOuter, REFIID riif, LPVOID
|
||||
@ -58,8 +58,8 @@ index ca93293e50b..073bb7e9b2b 100644
|
||||
HRESULT WINAPI KnownFolderManager_Constructor(IUnknown *pUnkOuter, REFIID riid, LPVOID *ppv) DECLSPEC_HIDDEN;
|
||||
+HRESULT WINAPI NewMenu_Constructor(IUnknown *outer, REFIID riid, LPVOID *ppv) DECLSPEC_HIDDEN;
|
||||
HRESULT WINAPI IFileOperation_Constructor(IUnknown *outer, REFIID riid, void **out) DECLSPEC_HIDDEN;
|
||||
extern HRESULT CPanel_GetIconLocationW(LPCITEMIDLIST, LPWSTR, UINT, int*) DECLSPEC_HIDDEN;
|
||||
HRESULT WINAPI CPanel_ExtractIconA(LPITEMIDLIST pidl, LPCSTR pszFile, UINT nIconIndex, HICON *phiconLarge, HICON *phiconSmall, UINT nIconSize) DECLSPEC_HIDDEN;
|
||||
HRESULT WINAPI ActiveDesktop_Constructor(IUnknown *outer, REFIID riid, void **out) DECLSPEC_HIDDEN;
|
||||
|
||||
diff --git a/dlls/shell32/shellnew.c b/dlls/shell32/shellnew.c
|
||||
new file mode 100644
|
||||
index 00000000000..ba31b3787f8
|
||||
@ -564,7 +564,7 @@ index 00000000000..ba31b3787f8
|
||||
+ return hr;
|
||||
+}
|
||||
diff --git a/dlls/shell32/shellole.c b/dlls/shell32/shellole.c
|
||||
index 7cd46ba2d98..7265e1660ac 100644
|
||||
index 589e5c5170a..2984e691c17 100644
|
||||
--- a/dlls/shell32/shellole.c
|
||||
+++ b/dlls/shell32/shellole.c
|
||||
@@ -72,6 +72,7 @@ static const struct {
|
||||
@ -576,10 +576,10 @@ index 7cd46ba2d98..7265e1660ac 100644
|
||||
{&CLSID_QueryAssociations, QueryAssociations_Constructor},
|
||||
{&CLSID_RecycleBin, RecycleBin_Constructor},
|
||||
diff --git a/dlls/shell32/tests/shlview.c b/dlls/shell32/tests/shlview.c
|
||||
index b405a84bc19..4870dc11bcf 100644
|
||||
index a83f3137509..2781c2152f9 100644
|
||||
--- a/dlls/shell32/tests/shlview.c
|
||||
+++ b/dlls/shell32/tests/shlview.c
|
||||
@@ -1479,7 +1479,6 @@ static void test_newmenu(void)
|
||||
@@ -1478,7 +1478,6 @@ static void test_newmenu(void)
|
||||
HRESULT hr;
|
||||
|
||||
hr = CoCreateInstance(&CLSID_NewMenu, NULL, CLSCTX_INPROC_SERVER, &IID_IUnknown, (void **)&unk);
|
||||
@ -587,7 +587,7 @@ index b405a84bc19..4870dc11bcf 100644
|
||||
ok(hr == S_OK, "Failed to create NewMenu object, hr %#lx.\n", hr);
|
||||
if (hr != S_OK)
|
||||
{
|
||||
@@ -1491,6 +1490,14 @@ static void test_newmenu(void)
|
||||
@@ -1490,6 +1489,14 @@ static void test_newmenu(void)
|
||||
ok(hr == S_OK, "Failed to get IShellExtInit, hr %#lx.\n", hr);
|
||||
IUnknown_Release(unk2);
|
||||
|
||||
|
@ -1 +1 @@
|
||||
2a4ec7dafc7ee38108f6a9f626a7c39e6b6777e0
|
||||
16c6c249a5134de2422fbd3471ead7425c968301
|
||||
|
Loading…
Reference in New Issue
Block a user