Compare commits

..

10 Commits
v10.3 ... v10.4

Author SHA1 Message Date
Alistair Leslie-Hughes
c110178b0d Release v10.4 2025-03-22 17:50:09 +11:00
Alistair Leslie-Hughes
796c6b3a44 Added msxml3-element_props patchset 2025-03-22 15:34:38 +11:00
Alistair Leslie-Hughes
2ae11f25b0 Updated vkd3d-latest patchset 2025-03-22 15:33:02 +11:00
Elizabeth Figura
30f69aa45a Staging: Avoid leaking staging_event for every thread.
Just leak it for the first one.

Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=57989
2025-03-20 22:20:58 -05:00
Elizabeth Figura
bb826f2185 Rebase against ced1402d20ba874f9634a306630455366c3865b5. 2025-03-19 17:31:39 -05:00
Elizabeth Figura
c5767aad30 Rebase against e66405a5040ac233ebdc7bdd925919ad63b4dd69. 2025-03-19 09:33:51 -05:00
Alistair Leslie-Hughes
fa0cd8ead0 Rebase against 6298b0cab2086ae61f46b284d22c420dfbb2b44e. 2025-03-18 10:16:45 +11:00
Alistair Leslie-Hughes
f247cd5d6b Rebase against b201cd518f3448553c31e329d5504b94f21d84ce. 2025-03-13 16:44:46 +11:00
Alistair Leslie-Hughes
b17a3d6c54 Updated vkd3d-latest patchset
Squash to latest.
2025-03-13 07:08:10 +11:00
Elizabeth Figura
c0e113dd3a Rebase against 10bb431e0d0760d72921106c7607d66808b939bb. 2025-03-12 10:41:26 -05:00
24 changed files with 24904 additions and 9595 deletions

View File

@@ -1,15 +1,15 @@
From 601da0ae0c6b22f37d20e6e0f10558093277eca9 Mon Sep 17 00:00:00 2001
From 3dc4a148d7c91afea8f589f47daca82c5c27b7c1 Mon Sep 17 00:00:00 2001
From: Sebastian Lackner <sebastian@fds-team.de>
Date: Thu, 2 Oct 2014 19:44:31 +0200
Subject: [PATCH] ntdll: Print a warning message specifying the wine-staging
branch name and version.
---
dlls/ntdll/loader.c | 16 ++++++++++++++++
1 file changed, 16 insertions(+)
dlls/ntdll/loader.c | 19 +++++++++++++++++++
1 file changed, 19 insertions(+)
diff --git a/dlls/ntdll/loader.c b/dlls/ntdll/loader.c
index 5f84ca7e23b..fabf394fbe5 100644
index 74eb1b7f500..95639558155 100644
--- a/dlls/ntdll/loader.c
+++ b/dlls/ntdll/loader.c
@@ -43,6 +43,7 @@ WINE_DECLARE_DEBUG_CHANNEL(relay);
@@ -20,7 +20,7 @@ index 5f84ca7e23b..fabf394fbe5 100644
#ifdef _WIN64
#define DEFAULT_SECURITY_COOKIE_64 (((ULONGLONG)0x00002b99 << 32) | 0x2ddfa232)
@@ -3828,6 +3829,7 @@ void WINAPI LdrShutdownProcess(void)
@@ -3870,6 +3871,7 @@ void WINAPI LdrShutdownProcess(void)
process_detach();
}
@@ -28,7 +28,7 @@ index 5f84ca7e23b..fabf394fbe5 100644
/******************************************************************
* RtlExitUserProcess (NTDLL.@)
@@ -4322,6 +4324,9 @@ static void release_address_space(void)
@@ -4366,6 +4368,9 @@ static void release_address_space(void)
*/
void loader_init( CONTEXT *context, void **entry )
{
@@ -38,13 +38,13 @@ index 5f84ca7e23b..fabf394fbe5 100644
static int attach_done;
NTSTATUS status;
ULONG_PTR cookie, port = 0;
@@ -4407,7 +4412,18 @@ void loader_init( CONTEXT *context, void **entry )
@@ -4455,6 +4460,20 @@ void loader_init( CONTEXT *context, void **entry )
arm64ec_thread_init();
#endif
wm = get_modref( NtCurrentTeb()->Peb->ImageBaseAddress );
+ /* This hunk occasionally applies in the wrong place;
+ * add a comment here to try to prevent that. */
}
+ }
+ RtlInitUnicodeString( &staging_event_string, L"\\__wine_staging_warn_event" );
+ InitializeObjectAttributes( &staging_event_attr, &staging_event_string, OBJ_OPENIF, NULL, NULL );
+ if (NtCreateEvent( &staging_event, EVENT_ALL_ACCESS, &staging_event_attr, NotificationEvent, FALSE ) == STATUS_SUCCESS)
@@ -53,10 +53,12 @@ index 5f84ca7e23b..fabf394fbe5 100644
+ FIXME_(winediag)("Please mention your exact version when filing bug reports on winehq.org.\n");
+ }
+ else
+ {
+ WARN_(winediag)("wine-staging %s is a testing version containing experimental patches.\n", wine_get_version());
+ NtClose( staging_event );
}
NtCurrentTeb()->FlsSlots = fls_alloc_data();
--
2.45.2
2.47.2

View File

@@ -1,182 +0,0 @@
From ae80ae124a784078a9838a8aca4b3af308d645dd Mon Sep 17 00:00:00 2001
From: Patrick Hibbs <hibbsncc1701@gmail.com>
Date: Fri, 30 Sep 2022 17:58:15 -0400
Subject: [PATCH] d3dx9: Implement d3dx_effect_SetRawValue
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=46012
Signed-off-by: Patrick Hibbs <hibbsncc1701@gmail.com>
---
dlls/d3dx9_36/effect.c | 154 ++++++++++++++++++++++++++++++++++++++++-
1 file changed, 152 insertions(+), 2 deletions(-)
diff --git a/dlls/d3dx9_36/effect.c b/dlls/d3dx9_36/effect.c
index ea965ce789b..625af4af36b 100644
--- a/dlls/d3dx9_36/effect.c
+++ b/dlls/d3dx9_36/effect.c
@@ -4445,10 +4445,160 @@ static HRESULT WINAPI d3dx_effect_CloneEffect(ID3DXEffect *iface, IDirect3DDevic
static HRESULT WINAPI d3dx_effect_SetRawValue(ID3DXEffect *iface, D3DXHANDLE parameter, const void *data,
UINT byte_offset, UINT bytes)
{
- FIXME("iface %p, parameter %p, data %p, byte_offset %u, bytes %u stub!\n",
+ struct d3dx_effect *effect = impl_from_ID3DXEffect(iface);
+ struct d3dx_parameter *param = (parameter == INVALID_HANDLE_VALUE) ? NULL : get_valid_parameter(effect, parameter);
+ const unsigned int single_size = sizeof(DWORD);
+ unsigned int x, index_offset, remaining_byte_offset, remaining_bytes;
+ void *raw;
+
+ TRACE("iface %p, parameter %p, data %p, byte_offset %u, bytes %u.\n",
iface, parameter, data, byte_offset, bytes);
- return E_NOTIMPL;
+ /* pendentic */
+ index_offset = 0;
+ remaining_byte_offset = 0;
+
+ /* BOOLs and Matries with a single value copy require sanitization of the
+ byte_offset.
+
+ Specificly, matries with a single value copy only allow byte shifts that
+ are not multiples of the value (DWORD) size. For multiples, we increment
+ the index of the promoted data type, then add any remainder as a byte
+ offset.
+
+ For BOOLs, due to their value sanitization, we only care about the
+ index of their promoted data type. Unless it's a non value size matrix.
+ In that case we do care about the byte offset.
+ */
+ if (byte_offset > 0 && (param->type == D3DXPT_BOOL ||
+ (param->class == D3DXPC_MATRIX_COLUMNS ||
+ param->class == D3DXPC_MATRIX_ROWS)))
+ {
+ remaining_byte_offset = byte_offset % single_size;
+ if (remaining_byte_offset != 0)
+ index_offset = byte_offset / single_size;
+ else
+ index_offset = byte_offset;
+ if (param->type != D3DXPT_BOOL || (bytes != single_size &&
+ (param->class == D3DXPC_MATRIX_COLUMNS ||
+ param->class == D3DXPC_MATRIX_ROWS)))
+ {
+ index_offset = index_offset * single_size;
+ if (param->type != D3DXPT_BOOL)
+ index_offset = index_offset * single_size;
+ }
+ }
+
+ /* If parameter is bad, we are expected to throw C0000005. */
+ switch (param->class)
+ {
+ case D3DXPC_STRUCT:
+ break;
+ case D3DXPC_OBJECT:
+ raw = param_get_data_and_dirtify(effect, param, param->bytes, TRUE);
+ if (data && bytes)
+ {
+ if (((char*)raw)[0] != '\0')
+ {
+ memset(raw, '\0', param->bytes);
+ return S_OK; /* This returns a false success. */
+ }
+ else
+ {
+ return D3DERR_INVALIDCALL;
+ }
+ }
+ break;
+ case D3DXPC_SCALAR:
+ raw = param_get_data_and_dirtify(effect, param, param->bytes, TRUE);
+ if (param->type == D3DXPT_BOOL)
+ *(BOOL*)raw = *(BOOL*)data ? TRUE : FALSE;
+ else
+ memcpy((unsigned char*)raw + byte_offset, data, bytes);
+ return S_OK;
+ break;
+ case D3DXPC_VECTOR:
+ raw = (unsigned char*)param_get_data_and_dirtify(effect, param, param->bytes, TRUE);
+ if (param->type == D3DXPT_BOOL)
+ {
+ raw = (unsigned char*)raw + index_offset;
+ *(DWORD*)raw = *(DWORD*)data ? TRUE : FALSE;
+ memset((unsigned char*)raw + single_size, \
+ '\0', param->bytes - index_offset - single_size);
+ }
+ else
+ {
+ raw = (unsigned char*)raw + byte_offset;
+ for (x = 0; (x * single_size) + byte_offset < param->bytes && (x * single_size) < bytes; x++)
+ {
+ memcpy((unsigned char*)raw + (x * single_size), \
+ (unsigned char*)data + (x * single_size), \
+ single_size);
+ }
+ }
+ return S_OK;
+ break;
+ case D3DXPC_MATRIX_COLUMNS:
+ case D3DXPC_MATRIX_ROWS:
+ raw = (unsigned char*)param_get_data_and_dirtify(effect, param, param->bytes, TRUE);
+ if (param->type == D3DXPT_BOOL)
+ {
+ if (bytes == single_size)
+ {
+ raw = (unsigned char*)raw + index_offset;
+ for (x = 0; (x * single_size) < param->bytes - index_offset; x++)
+ {
+ remaining_bytes = param->bytes - index_offset - \
+ (x * single_size) - single_size;
+ *(DWORD*)raw = *(DWORD*)data ? TRUE : FALSE;
+ memset((unsigned char*)raw + single_size, \
+ '\0', (remaining_bytes > (single_size * 4) ? \
+ single_size * 4 : remaining_bytes));
+ raw = (unsigned char*)raw + (remaining_bytes > (single_size * 4) ? \
+ single_size * 4 : remaining_bytes);
+ }
+ }
+ else
+ {
+ raw = (unsigned char*)raw + index_offset;
+ for (x = 0; (x * single_size) < param->bytes - index_offset; x++)
+ {
+ ((DWORD*)raw)[x] = ((DWORD*)data)[x] ? TRUE : FALSE;
+ }
+ }
+ }
+ else
+ {
+ if (bytes == single_size)
+ {
+ raw = (unsigned char*)raw + index_offset + remaining_byte_offset;
+ for (x = 0; (x * single_size) + byte_offset < param->bytes && (x * single_size) < bytes; x++)
+ {
+ memcpy((unsigned char*)raw + (x * single_size), \
+ (unsigned char*)data + (x * single_size), \
+ single_size);
+ }
+ }
+ else
+ {
+ raw = (unsigned char*)raw + byte_offset;
+ for (x = 0; byte_offset + (x * single_size) < param->bytes &&
+ (x * single_size) < bytes; x++)
+ {
+ memcpy((unsigned char*)raw + (x * single_size), \
+ (unsigned char*)data + (x * single_size), \
+ single_size);
+ }
+ }
+ }
+ return S_OK;
+ break;
+ default:
+ FIXME("Unhandled param class %s.\n", debug_d3dxparameter_class(param->class));
+ break;
+ };
+
+ return D3DERR_INVALIDCALL;
}
#endif
--
2.43.0

View File

@@ -1,3 +0,0 @@
Fixes: [46012] d3d9: Implement ID3DXEffect::SetRawValue
# https://gitlab.winehq.org/wine/wine/-/merge_requests/979

View File

@@ -0,0 +1,5 @@
Fixes: msxml3: Correct regression when looping element properties.
# PR https://gitlab.winehq.org/wine/wine/-/merge_requests/7529
#

View File

@@ -1,4 +1,4 @@
From beaeb1935534ce99aa19b8009184b07bd602a24c Mon Sep 17 00:00:00 2001
From 4f26d71abf2447b5e0c6d7b6e878cf6b6c578558 Mon Sep 17 00:00:00 2001
From: "Erich E. Hoover" <erich.e.hoover@gmail.com>
Date: Sat, 3 Sep 2022 11:23:31 -0600
Subject: [PATCH] ntdll: Follow reparse points during path resolution.
@@ -6,14 +6,14 @@ Subject: [PATCH] ntdll: Follow reparse points during path resolution.
Signed-off-by: Erich E. Hoover <erich.e.hoover@gmail.com>
---
dlls/ntdll/tests/file.c | 11 ++-
dlls/ntdll/unix/file.c | 189 +++++++++++++++++++++++++++++++++++-----
2 files changed, 177 insertions(+), 23 deletions(-)
dlls/ntdll/unix/file.c | 196 +++++++++++++++++++++++++++++++++++-----
2 files changed, 184 insertions(+), 23 deletions(-)
diff --git a/dlls/ntdll/tests/file.c b/dlls/ntdll/tests/file.c
index 390768f557d..a0b84849490 100644
index 39b98af7efa..80b967f5469 100644
--- a/dlls/ntdll/tests/file.c
+++ b/dlls/ntdll/tests/file.c
@@ -5381,7 +5381,7 @@ static INT build_reparse_buffer(const WCHAR *filename, ULONG tag, ULONG flags,
@@ -6082,7 +6082,7 @@ static INT build_reparse_buffer(const WCHAR *filename, ULONG tag, ULONG flags,
static void test_reparse_points(void)
{
@@ -22,7 +22,7 @@ index 390768f557d..a0b84849490 100644
static const WCHAR new_reparseW[] = {'\\','n','e','w','_','r','e','p','a','r','s','e',0};
static const WCHAR reparseW[] = {'\\','r','e','p','a','r','s','e',0};
static const WCHAR targetW[] = {'\\','t','a','r','g','e','t',0};
@@ -5768,11 +5768,20 @@ static void test_reparse_points(void)
@@ -6469,11 +6469,20 @@ static void test_reparse_points(void)
bret = CopyFileW(reparse_path, new_path, TRUE);
ok(!bret, "Reparse points cannot be copied.\n");
@@ -44,10 +44,10 @@ index 390768f557d..a0b84849490 100644
ok(bret, "Failed to remove temporary reparse point directory!\n");
bret = RemoveDirectoryW(target_path);
diff --git a/dlls/ntdll/unix/file.c b/dlls/ntdll/unix/file.c
index 9211c6964a6..e90670ffc71 100644
index 49afb57b2b6..26e412d28f1 100644
--- a/dlls/ntdll/unix/file.c
+++ b/dlls/ntdll/unix/file.c
@@ -3548,6 +3548,35 @@ done:
@@ -3725,6 +3725,35 @@ done:
}
@@ -83,7 +83,7 @@ index 9211c6964a6..e90670ffc71 100644
/*
* Retrieve the unix name corresponding to a file handle, remove that directory, and then symlink
* the requested directory to the location of the old directory.
@@ -3724,16 +3753,14 @@ cleanup:
@@ -3901,16 +3930,14 @@ cleanup:
/*
@@ -102,7 +102,7 @@ index 9211c6964a6..e90670ffc71 100644
char *encoded = NULL;
int link_dir_fd = -1;
NTSTATUS status;
@@ -3741,9 +3768,6 @@ NTSTATUS get_reparse_point(HANDLE handle, REPARSE_DATA_BUFFER *buffer, ULONG *si
@@ -3918,9 +3945,6 @@ NTSTATUS get_reparse_point(HANDLE handle, REPARSE_DATA_BUFFER *buffer, ULONG *si
int depth;
char *p;
@@ -112,7 +112,7 @@ index 9211c6964a6..e90670ffc71 100644
ret = readlink( unix_name, link_path, sizeof(link_path) );
if (ret < 0)
{
@@ -3843,12 +3867,76 @@ NTSTATUS get_reparse_point(HANDLE handle, REPARSE_DATA_BUFFER *buffer, ULONG *si
@@ -4020,12 +4044,76 @@ NTSTATUS get_reparse_point(HANDLE handle, REPARSE_DATA_BUFFER *buffer, ULONG *si
cleanup:
if (link_dir_fd != -1) close( link_dir_fd );
@@ -190,7 +190,7 @@ index 9211c6964a6..e90670ffc71 100644
/*
* Retrieve the unix name corresponding to a file handle, remove that symlink, and then recreate
* a directory at the location of the old filename.
@@ -3942,15 +4030,25 @@ cleanup:
@@ -4119,15 +4207,24 @@ cleanup:
}
@@ -207,18 +207,16 @@ index 9211c6964a6..e90670ffc71 100644
*
* Helper for nt_to_unix_file_name
*/
-static NTSTATUS lookup_unix_name( const WCHAR *name, int name_len, char **buffer, int unix_len, int pos,
- UINT disposition, BOOL is_unix )
+static NTSTATUS lookup_unix_name( FILE_OBJECT *fileobj, const WCHAR *name, int name_len,
+ char **buffer, int unix_len, int pos, UINT disposition,
+ BOOL is_unix )
-static NTSTATUS lookup_unix_name( int root_fd, const WCHAR *name, int name_len, char **buffer, int unix_len,
+static NTSTATUS lookup_unix_name( FILE_OBJECT *fileobj, int root_fd, const WCHAR *name, int name_len, char **buffer, int unix_len,
int pos, UINT disposition, BOOL is_unix )
{
static const WCHAR invalid_charsW[] = { INVALID_NT_CHARS, '/', 0 };
+ const WCHAR *fullname = fileobj->FileName.Buffer;
NTSTATUS status;
int ret;
struct stat st;
@@ -4007,6 +4105,8 @@ static NTSTATUS lookup_unix_name( const WCHAR *name, int name_len, char **buffer
@@ -4184,6 +4281,8 @@ static NTSTATUS lookup_unix_name( int root_fd, const WCHAR *name, int name_len,
while (name_len)
{
const WCHAR *end, *next;
@@ -227,9 +225,9 @@ index 9211c6964a6..e90670ffc71 100644
end = name;
while (end < name + name_len && *end != '\\') end++;
@@ -4026,8 +4126,31 @@ static NTSTATUS lookup_unix_name( const WCHAR *name, int name_len, char **buffer
@@ -4203,8 +4302,31 @@ static NTSTATUS lookup_unix_name( int root_fd, const WCHAR *name, int name_len,
status = find_file_in_dir( unix_name, pos, name, end - name, is_unix );
status = find_file_in_dir( root_fd, unix_name, pos, name, end - name, is_unix );
+ /* follow reparse point and restart from there (if applicable) */
+ if (name_len && find_reparse_target( unix_name, fullname, name - fullname, &target, &target_len ) == STATUS_REPARSE)
@@ -260,7 +258,7 @@ index 9211c6964a6..e90670ffc71 100644
{
if (status == STATUS_OBJECT_NAME_NOT_FOUND)
{
@@ -4066,12 +4189,12 @@ static NTSTATUS lookup_unix_name( const WCHAR *name, int name_len, char **buffer
@@ -4243,12 +4365,12 @@ static NTSTATUS lookup_unix_name( int root_fd, const WCHAR *name, int name_len,
/******************************************************************************
* nt_to_unix_file_name_no_root
*/
@@ -275,16 +273,16 @@ index 9211c6964a6..e90670ffc71 100644
NTSTATUS status = STATUS_SUCCESS;
const WCHAR *name;
struct stat st;
@@ -4161,7 +4284,7 @@ static NTSTATUS nt_to_unix_file_name_no_root( const UNICODE_STRING *nameW, char
@@ -4338,7 +4460,7 @@ static NTSTATUS nt_to_unix_file_name_no_root( const UNICODE_STRING *nameW, char
name += prefix_len;
name_len -= prefix_len;
- status = lookup_unix_name( name, name_len, &unix_name, unix_len, pos, disposition, is_unix );
+ status = lookup_unix_name( fileobj, name, name_len, &unix_name, unix_len, pos, disposition, is_unix );
- status = lookup_unix_name( AT_FDCWD, name, name_len, &unix_name, unix_len, pos, disposition, is_unix );
+ status = lookup_unix_name( fileobj, AT_FDCWD, name, name_len, &unix_name, unix_len, pos, disposition, is_unix );
if (status == STATUS_SUCCESS || status == STATUS_NO_SUCH_FILE)
{
TRACE( "%s -> %s\n", debugstr_us(nameW), debugstr_a(unix_name) );
@@ -4169,7 +4292,8 @@ static NTSTATUS nt_to_unix_file_name_no_root( const UNICODE_STRING *nameW, char
@@ -4346,7 +4468,8 @@ static NTSTATUS nt_to_unix_file_name_no_root( const UNICODE_STRING *nameW, char
}
else
{
@@ -294,13 +292,14 @@ index 9211c6964a6..e90670ffc71 100644
free( unix_name );
}
return status;
@@ -4187,18 +4311,30 @@ static NTSTATUS nt_to_unix_file_name_no_root( const UNICODE_STRING *nameW, char
@@ -4364,18 +4487,30 @@ static NTSTATUS nt_to_unix_file_name_no_root( const UNICODE_STRING *nameW, char
*/
NTSTATUS nt_to_unix_file_name( const OBJECT_ATTRIBUTES *attr, char **name_ret, UINT disposition )
{
+ HANDLE rootdir = attr->RootDirectory;
enum server_fd_type type;
int old_cwd, root_fd, needs_close;
- int root_fd, needs_close;
+ int old_cwd, root_fd, needs_close;
+ int reparse_count = 0;
+ FILE_OBJECT fileobj;
const WCHAR *name;
@@ -329,7 +328,7 @@ index 9211c6964a6..e90670ffc71 100644
if (name_len && name[0] == '\\') return STATUS_INVALID_PARAMETER;
@@ -4206,7 +4342,7 @@ NTSTATUS nt_to_unix_file_name( const OBJECT_ATTRIBUTES *attr, char **name_ret, U
@@ -4383,7 +4518,7 @@ NTSTATUS nt_to_unix_file_name( const OBJECT_ATTRIBUTES *attr, char **name_ret, U
if (!(unix_name = malloc( unix_len ))) return STATUS_NO_MEMORY;
unix_name[0] = '.';
@@ -338,17 +337,25 @@ index 9211c6964a6..e90670ffc71 100644
{
if (type != FD_TYPE_DIR)
{
@@ -4218,7 +4354,8 @@ NTSTATUS nt_to_unix_file_name( const OBJECT_ATTRIBUTES *attr, char **name_ret, U
mutex_lock( &dir_mutex );
if ((old_cwd = open( ".", O_RDONLY )) != -1 && fchdir( root_fd ) != -1)
{
- status = lookup_unix_name( name, name_len, &unix_name, unix_len, 1, disposition, FALSE );
+ status = lookup_unix_name( &fileobj, name, name_len, &unix_name, unix_len, 1,
@@ -4392,7 +4527,16 @@ NTSTATUS nt_to_unix_file_name( const OBJECT_ATTRIBUTES *attr, char **name_ret, U
}
else
{
- status = lookup_unix_name( root_fd, name, name_len, &unix_name, unix_len, 1, disposition, FALSE );
+ mutex_lock( &dir_mutex );
+ if ((old_cwd = open( ".", O_RDONLY )) != -1 && fchdir( root_fd ) != -1)
+ {
+ status = lookup_unix_name( &fileobj, root_fd, name, name_len, &unix_name, unix_len, 1,
+ disposition, FALSE );
if (fchdir( old_cwd ) == -1) chdir( "/" );
}
else status = errno_to_status( errno );
@@ -4231,14 +4368,22 @@ NTSTATUS nt_to_unix_file_name( const OBJECT_ATTRIBUTES *attr, char **name_ret, U
+ if (fchdir( old_cwd ) == -1) chdir( "/" );
+ }
+ else status = errno_to_status( errno );
+ mutex_unlock( &dir_mutex );
+ if (old_cwd != -1) close( old_cwd );
if (needs_close) close( root_fd );
}
}
@@ -4400,14 +4544,22 @@ NTSTATUS nt_to_unix_file_name( const OBJECT_ATTRIBUTES *attr, char **name_ret, U
if (status == STATUS_SUCCESS || status == STATUS_NO_SUCH_FILE)
{
@@ -373,5 +380,5 @@ index 9211c6964a6..e90670ffc71 100644
}
--
2.35.1
2.47.2

View File

@@ -1,38 +0,0 @@
From a6b3f7507ade04bcd9338a0936a2b1bfa8696fc1 Mon Sep 17 00:00:00 2001
From: "Erich E. Hoover" <erich.e.hoover@gmail.com>
Date: Wed, 1 May 2019 17:48:51 -0600
Subject: ntdll: Find dangling symlinks quickly.
This is also necessary on systems (such as MacOS) that support
case-insensitive lookups of files.
Signed-off-by: Erich E. Hoover <erich.e.hoover@gmail.com>
---
dlls/ntdll/unix/file.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/dlls/ntdll/unix/file.c b/dlls/ntdll/unix/file.c
index caa454c024f..b26b239574b 100644
--- a/dlls/ntdll/unix/file.c
+++ b/dlls/ntdll/unix/file.c
@@ -2904,7 +2904,7 @@ static NTSTATUS find_file_in_dir( char *unix_name, int pos, const WCHAR *name, i
if (ret >= 0 && ret <= MAX_DIR_ENTRY_LEN)
{
unix_name[pos + ret] = 0;
- if (!stat( unix_name, &st )) return STATUS_SUCCESS;
+ if (!lstat( unix_name, &st )) return STATUS_SUCCESS;
}
if (check_case) goto not_found; /* we want an exact match */
@@ -4228,7 +4228,7 @@ static NTSTATUS lookup_unix_name( FILE_OBJECT *fileobj, const WCHAR *name, int n
char *p;
unix_name[pos + 1 + ret] = 0;
for (p = unix_name + pos ; *p; p++) if (*p == '\\') *p = '/';
- if (!stat( unix_name, &st ))
+ if (!lstat( unix_name, &st ))
{
if (disposition == FILE_CREATE) return STATUS_OBJECT_NAME_COLLISION;
return STATUS_SUCCESS;
--
2.17.1

View File

@@ -194,7 +194,7 @@ index 2c261e0f57d..562440f4f8b 100644
+
+ TRACE( "(%s %s %ld): stub\n", debugstr_w(link), debugstr_w(target), flags );
+
+ is_relative = (RtlDetermineDosPathNameType_U( target ) == RELATIVE_PATH);
+ is_relative = (RtlDetermineDosPathNameType_U( target ) == RtlPathTypeRelative);
+ is_dir = (flags & SYMBOLIC_LINK_FLAG_DIRECTORY);
+ if (is_dir && !CreateDirectoryW( link, NULL ))
+ return FALSE;

View File

@@ -1,130 +0,0 @@
From 80f173bf44417b65a4fdc2d09c0a513279101c22 Mon Sep 17 00:00:00 2001
From: Alistair Leslie-Hughes <leslie_alistair@hotmail.com>
Date: Thu, 27 Feb 2025 09:45:01 +1100
Subject: [PATCH] Updated vkd3d to 8297ea9aa6d92dec55dc782713655eea99878325.
---
libs/vkd3d/include/vkd3d_shader.h | 4 ++++
libs/vkd3d/libs/vkd3d-shader/spirv.c | 7 +++++++
libs/vkd3d/libs/vkd3d/device.c | 10 ++++++++++
libs/vkd3d/libs/vkd3d/state.c | 2 ++
libs/vkd3d/libs/vkd3d/vkd3d_private.h | 1 +
5 files changed, 24 insertions(+)
diff --git a/libs/vkd3d/include/vkd3d_shader.h b/libs/vkd3d/include/vkd3d_shader.h
index 7e51bdd5179..2e1f37f12e6 100644
--- a/libs/vkd3d/include/vkd3d_shader.h
+++ b/libs/vkd3d/include/vkd3d_shader.h
@@ -249,6 +249,10 @@ enum vkd3d_shader_compile_option_feature_flags
* QUAD bits set.
* - supportedStages include COMPUTE and FRAGMENT. \since 1.12 */
VKD3D_SHADER_COMPILE_OPTION_FEATURE_WAVE_OPS = 0x00000004,
+ /** The SPIR-V target environment supports zero-initializing workgroup
+ * memory. This corresponds to the "shaderZeroInitializeWorkgroupMemory"
+ * Vulkan feature. \since 1.16 */
+ VKD3D_SHADER_COMPILE_OPTION_FEATURE_ZERO_INITIALIZE_WORKGROUP_MEMORY = 0x00000008,
VKD3D_FORCE_32_BIT_ENUM(VKD3D_SHADER_COMPILE_OPTION_FEATURE_FLAGS),
};
diff --git a/libs/vkd3d/libs/vkd3d-shader/spirv.c b/libs/vkd3d/libs/vkd3d-shader/spirv.c
index b65082e35a7..695def77b34 100644
--- a/libs/vkd3d/libs/vkd3d-shader/spirv.c
+++ b/libs/vkd3d/libs/vkd3d-shader/spirv.c
@@ -6905,6 +6905,13 @@ static void spirv_compiler_emit_workgroup_memory(struct spirv_compiler *compiler
const SpvStorageClass storage_class = SpvStorageClassWorkgroup;
struct vkd3d_symbol reg_symbol;
+ if (zero_init && !(compiler->features & VKD3D_SHADER_COMPILE_OPTION_FEATURE_ZERO_INITIALIZE_WORKGROUP_MEMORY))
+ {
+ WARN("Unsupported zero-initialized workgroup memory.\n");
+ spirv_compiler_error(compiler, VKD3D_SHADER_ERROR_SPV_UNSUPPORTED_FEATURE,
+ "The target environment does not support zero-initialized workgroup memory.");
+ }
+
/* Alignment is supported only in the Kernel execution model. */
if (alignment)
TRACE("Ignoring alignment %u.\n", alignment);
diff --git a/libs/vkd3d/libs/vkd3d/device.c b/libs/vkd3d/libs/vkd3d/device.c
index 67bc4493855..a1f451efa7c 100644
--- a/libs/vkd3d/libs/vkd3d/device.c
+++ b/libs/vkd3d/libs/vkd3d/device.c
@@ -97,6 +97,7 @@ static const struct vkd3d_optional_extension_info optional_device_extensions[] =
VK_EXTENSION(KHR_PUSH_DESCRIPTOR, KHR_push_descriptor),
VK_EXTENSION(KHR_SAMPLER_MIRROR_CLAMP_TO_EDGE, KHR_sampler_mirror_clamp_to_edge),
VK_EXTENSION(KHR_TIMELINE_SEMAPHORE, KHR_timeline_semaphore),
+ VK_EXTENSION(KHR_ZERO_INITIALIZE_WORKGROUP_MEMORY, KHR_zero_initialize_workgroup_memory),
/* EXT extensions */
VK_EXTENSION(EXT_4444_FORMATS, EXT_4444_formats),
VK_EXTENSION(EXT_CALIBRATED_TIMESTAMPS, EXT_calibrated_timestamps),
@@ -835,6 +836,7 @@ struct vkd3d_physical_device_info
VkPhysicalDeviceTimelineSemaphoreFeaturesKHR timeline_semaphore_features;
VkPhysicalDeviceMutableDescriptorTypeFeaturesEXT mutable_features;
VkPhysicalDevice4444FormatsFeaturesEXT formats4444_features;
+ VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR zero_initialize_workgroup_memory_features;
VkPhysicalDeviceFeatures2 features2;
};
@@ -870,6 +872,8 @@ static void vkd3d_chain_physical_device_info_structures(struct vkd3d_physical_de
vk_prepend_struct(&info->features2, &info->mutable_features);
if (vulkan_info->EXT_4444_formats)
vk_prepend_struct(&info->features2, &info->formats4444_features);
+ if (vulkan_info->KHR_zero_initialize_workgroup_memory)
+ vk_prepend_struct(&info->features2, &info->zero_initialize_workgroup_memory_features);
info->properties2.pNext = NULL;
@@ -908,6 +912,7 @@ static void vkd3d_physical_device_info_init(struct vkd3d_physical_device_info *i
info->timeline_semaphore_features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_FEATURES_KHR;
info->mutable_features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MUTABLE_DESCRIPTOR_TYPE_FEATURES_EXT;
info->formats4444_features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_4444_FORMATS_FEATURES_EXT;
+ info->zero_initialize_workgroup_memory_features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ZERO_INITIALIZE_WORKGROUP_MEMORY_FEATURES_KHR;
info->properties2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2;
info->maintenance3_properties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_3_PROPERTIES;
@@ -1418,6 +1423,9 @@ static void vkd3d_init_feature_level(struct vkd3d_vulkan_info *vk_info,
else if (!vk_info->vertex_attrib_zero_divisor)
WARN("Vertex attribute instance rate zero divisor is not supported.\n");
+ if (!vk_info->KHR_zero_initialize_workgroup_memory)
+ WARN("Shader zero initialize workgroup memory is not supported.\n");
+
#undef CHECK_MIN_REQUIREMENT
#undef CHECK_MAX_REQUIREMENT
#undef CHECK_FEATURE
@@ -1834,6 +1842,8 @@ static HRESULT vkd3d_init_device_caps(struct d3d12_device *device,
vulkan_info->EXT_mutable_descriptor_type = false;
if (!physical_device_info->timeline_semaphore_features.timelineSemaphore)
vulkan_info->KHR_timeline_semaphore = false;
+ if (!physical_device_info->zero_initialize_workgroup_memory_features.shaderZeroInitializeWorkgroupMemory)
+ vulkan_info->KHR_zero_initialize_workgroup_memory = false;
physical_device_info->formats4444_features.formatA4B4G4R4 = VK_FALSE;
diff --git a/libs/vkd3d/libs/vkd3d/state.c b/libs/vkd3d/libs/vkd3d/state.c
index b5a8d1331fb..a1f09422305 100644
--- a/libs/vkd3d/libs/vkd3d/state.c
+++ b/libs/vkd3d/libs/vkd3d/state.c
@@ -2370,6 +2370,8 @@ static unsigned int feature_flags_compile_option(const struct d3d12_device *devi
flags |= VKD3D_SHADER_COMPILE_OPTION_FEATURE_FLOAT64;
if (device->feature_options1.WaveOps)
flags |= VKD3D_SHADER_COMPILE_OPTION_FEATURE_WAVE_OPS;
+ if (device->vk_info.KHR_zero_initialize_workgroup_memory)
+ flags |= VKD3D_SHADER_COMPILE_OPTION_FEATURE_ZERO_INITIALIZE_WORKGROUP_MEMORY;
return flags;
}
diff --git a/libs/vkd3d/libs/vkd3d/vkd3d_private.h b/libs/vkd3d/libs/vkd3d/vkd3d_private.h
index 7015508e384..e0e44248053 100644
--- a/libs/vkd3d/libs/vkd3d/vkd3d_private.h
+++ b/libs/vkd3d/libs/vkd3d/vkd3d_private.h
@@ -132,6 +132,7 @@ struct vkd3d_vulkan_info
bool KHR_push_descriptor;
bool KHR_sampler_mirror_clamp_to_edge;
bool KHR_timeline_semaphore;
+ bool KHR_zero_initialize_workgroup_memory;
/* EXT device extensions */
bool EXT_4444_formats;
bool EXT_calibrated_timestamps;
--
2.47.2

View File

@@ -1,28 +0,0 @@
From 0c3d48134adbb00dcbb561ae920fcf9f4c58fc0f Mon Sep 17 00:00:00 2001
From: Dmitry Timoshkov <dmitry@baikal.ru>
Date: Fri, 30 Dec 2016 12:40:21 +0800
Subject: winex11.drv: Don't use MWM_DECOR_RESIZEH, window resizing is
controlled by MWM_FUNC_RESIZE.
This patch fixes double caption observed under some WMs (Metacity,
its successor Mate, and XFCE).
---
dlls/winex11.drv/window.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/dlls/winex11.drv/window.c b/dlls/winex11.drv/window.c
index 7408a0eb480..08856422bb7 100644
--- a/dlls/winex11.drv/window.c
+++ b/dlls/winex11.drv/window.c
@@ -279,7 +279,7 @@ static unsigned long get_mwm_decorations( struct x11drv_win_data *data,
if (style & WS_MAXIMIZEBOX) ret |= MWM_DECOR_MAXIMIZE;
}
if (ex_style & WS_EX_DLGMODALFRAME) ret |= MWM_DECOR_BORDER;
- else if (style & WS_THICKFRAME) ret |= MWM_DECOR_BORDER | MWM_DECOR_RESIZEH;
+ else if (style & WS_THICKFRAME) ret |= MWM_DECOR_BORDER;
else if ((style & (WS_DLGFRAME|WS_BORDER)) == WS_DLGFRAME) ret |= MWM_DECOR_BORDER;
return ret;
}
--
2.11.0

View File

@@ -1,27 +0,0 @@
From d2f3b7e3a70a64665ad77b7b2a97f3c7ea9425db Mon Sep 17 00:00:00 2001
From: Dmitry Timoshkov <dmitry@baikal.ru>
Date: Fri, 20 Jan 2017 17:08:19 +0800
Subject: winex11.drv: Don't add MWM_DECOR_BORDER to windows without a caption.
XFCE4 always treats such windows as requesting the caption decoration.
---
dlls/winex11.drv/window.c | 3 ---
1 file changed, 3 deletions(-)
diff --git a/dlls/winex11.drv/window.c b/dlls/winex11.drv/window.c
index 0fc36dc3c6d..af641c76eb1 100644
--- a/dlls/winex11.drv/window.c
+++ b/dlls/winex11.drv/window.c
@@ -278,9 +278,6 @@ static unsigned long get_mwm_decorations( struct x11drv_win_data *data,
if (style & WS_MINIMIZEBOX) ret |= MWM_DECOR_MINIMIZE;
if (style & WS_MAXIMIZEBOX) ret |= MWM_DECOR_MAXIMIZE;
}
- if (ex_style & WS_EX_DLGMODALFRAME) ret |= MWM_DECOR_BORDER;
- else if (style & WS_THICKFRAME) ret |= MWM_DECOR_BORDER;
- else if ((style & (WS_DLGFRAME|WS_BORDER)) == WS_DLGFRAME) ret |= MWM_DECOR_BORDER;
return ret;
}
--
2.11.0

View File

@@ -1 +0,0 @@
Fixes: [42117] Avoid double captions observed under some WMs

Some files were not shown because too many files have changed in this diff Show More