You've already forked wine-staging
mirror of
https://gitlab.winehq.org/wine/wine-staging.git
synced 2025-04-13 14:42:51 -07:00
Compare commits
21 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
acb054627a | ||
|
f07f287395 | ||
|
8703ad8375 | ||
|
1f500db5b7 | ||
|
1deec9df95 | ||
|
a8e296715c | ||
|
43d5c1e0f5 | ||
|
41a3c56c50 | ||
|
5be23b8ae8 | ||
|
769ddd9f00 | ||
|
aabde22767 | ||
|
ca3220cbd6 | ||
|
ff6cef5d72 | ||
|
d2b7b686f1 | ||
|
c5c29f9395 | ||
|
08ad410761 | ||
|
e6f9a449cd | ||
|
0ea57a0262 | ||
|
4f75966580 | ||
|
9f9285256f | ||
|
21009111bd |
@@ -94,17 +94,17 @@ proper implementation. In the event that this happens, we add the patches to
|
||||
wine-staging instead, and keep them updated and maintained as well as attempt to
|
||||
clean them up to be upstreamed. We also both write and verify patches which fix
|
||||
various bugs that may not have patches, and in turn allow them run better using
|
||||
WINE. This includes testing on various hardware, games, and applications.
|
||||
WINE. This includes testing on various hardware, games and applications.
|
||||
|
||||
Any expenses for applications, games, or hardware which we do not own comes out
|
||||
of pocket. In order to alleviate these expenses, we are now accepting donations.
|
||||
This in turn allows us to continue to perform testing, provide fixes, and get
|
||||
them upstreamed, ultimately aiming to provide a better experience for all WINE
|
||||
users. All of our work is provided publicly for free and can be found at
|
||||
<https://github.com/wine-staging/wine-staging>. We do not expect to be paid for
|
||||
<https://gitlab.winehq.org/wine/wine-staging>. We do not expect to be paid for
|
||||
any of the work provided, nor will donators receive any special benefits or
|
||||
compensation.
|
||||
|
||||
Donations are recieved through Patreon. Anyone interested may donate here:
|
||||
|
||||
https://www.patreon.com/winestaging
|
||||
https://www.patreon.com/winestaging
|
||||
|
@@ -1,7 +1,7 @@
|
||||
From 6e5861b34f4359129d0ebec199e2106db4b7be43 Mon Sep 17 00:00:00 2001
|
||||
From eba9e414d60a33dfde7e7b978fcdddbaf9bfe5b6 Mon Sep 17 00:00:00 2001
|
||||
From: Zebediah Figura <z.figura12@gmail.com>
|
||||
Date: Wed, 21 Oct 2020 16:03:21 -0500
|
||||
Subject: [PATCH 08/88] winegstreamer: Allow videoconvert to parallelize.
|
||||
Subject: [PATCH] winegstreamer: Allow videoconvert to parallelize.
|
||||
|
||||
Not sure if this should be called a hack. It's not the *best* solution to the problem, but it's not a wrong one either.
|
||||
|
||||
@@ -11,10 +11,10 @@ Signed-off-by: Zebediah Figura <z.figura12@gmail.com>
|
||||
1 file changed, 3 insertions(+)
|
||||
|
||||
diff --git a/dlls/winegstreamer/wg_parser.c b/dlls/winegstreamer/wg_parser.c
|
||||
index 0a6cf927187..5f3b4375b4c 100644
|
||||
index 0573c99858b..5df08dc5fd7 100644
|
||||
--- a/dlls/winegstreamer/wg_parser.c
|
||||
+++ b/dlls/winegstreamer/wg_parser.c
|
||||
@@ -1189,6 +1189,9 @@ static void pad_added_cb(GstElement *element, GstPad *pad, gpointer user)
|
||||
@@ -760,6 +760,9 @@ static void pad_added_cb(GstElement *element, GstPad *pad, gpointer user)
|
||||
if (!(vconv = create_element("videoconvert", "base")))
|
||||
goto out;
|
||||
|
||||
@@ -25,5 +25,5 @@ index 0a6cf927187..5f3b4375b4c 100644
|
||||
if (!(flip = create_element("videoflip", "good")))
|
||||
goto out;
|
||||
--
|
||||
2.34.1
|
||||
2.37.2
|
||||
|
||||
|
@@ -1,8 +1,7 @@
|
||||
From 9986fba2a9fd7f37a9d27a0257c8b20f59c56d8f Mon Sep 17 00:00:00 2001
|
||||
From bd90f10550e2de898517d0a41b94f76f23fc9601 Mon Sep 17 00:00:00 2001
|
||||
From: Derek Lesho <dlesho@codeweavers.com>
|
||||
Date: Fri, 19 Mar 2021 17:01:54 -0400
|
||||
Subject: [PATCH 25/88] winegstreamer: Report streams backwards in media
|
||||
source.
|
||||
Subject: [PATCH] winegstreamer: Report streams backwards in media source.
|
||||
|
||||
Signed-off-by: Derek Lesho <dlesho@codeweavers.com>
|
||||
---
|
||||
@@ -10,10 +9,10 @@ Signed-off-by: Derek Lesho <dlesho@codeweavers.com>
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/dlls/winegstreamer/media_source.c b/dlls/winegstreamer/media_source.c
|
||||
index bccbf888a4a..2ed31666cad 100644
|
||||
index 43beb71838a..d39b01b8578 100644
|
||||
--- a/dlls/winegstreamer/media_source.c
|
||||
+++ b/dlls/winegstreamer/media_source.c
|
||||
@@ -1491,7 +1491,7 @@ static HRESULT media_source_constructor(IMFByteStream *bytestream, struct media_
|
||||
@@ -1480,7 +1480,7 @@ static HRESULT media_source_constructor(IMFByteStream *bytestream, struct media_
|
||||
descriptors = malloc(object->stream_count * sizeof(IMFStreamDescriptor *));
|
||||
for (i = 0; i < object->stream_count; i++)
|
||||
{
|
||||
@@ -23,5 +22,5 @@ index bccbf888a4a..2ed31666cad 100644
|
||||
|
||||
if (FAILED(hr = MFCreatePresentationDescriptor(object->stream_count, descriptors, &object->pres_desc)))
|
||||
--
|
||||
2.34.1
|
||||
2.37.2
|
||||
|
||||
|
@@ -1,7 +1,7 @@
|
||||
From 856636245cd3de1bc91d76146e18fef864ec7065 Mon Sep 17 00:00:00 2001
|
||||
From 1913dfb174c48d60d0b81aba3fb9f03b5cef78c2 Mon Sep 17 00:00:00 2001
|
||||
From: Derek Lesho <dlesho@codeweavers.com>
|
||||
Date: Fri, 4 Dec 2020 16:17:11 -0500
|
||||
Subject: [PATCH 38/88] winegstreamer: In the default configuration, select one
|
||||
Subject: [PATCH] winegstreamer: In the default configuration, select one
|
||||
stream of each major type.
|
||||
|
||||
---
|
||||
@@ -9,10 +9,10 @@ Subject: [PATCH 38/88] winegstreamer: In the default configuration, select one
|
||||
1 file changed, 21 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/dlls/winegstreamer/media_source.c b/dlls/winegstreamer/media_source.c
|
||||
index 2ed31666cad..c97348cc2d6 100644
|
||||
index d39b01b8578..de6a2c2b232 100644
|
||||
--- a/dlls/winegstreamer/media_source.c
|
||||
+++ b/dlls/winegstreamer/media_source.c
|
||||
@@ -1397,6 +1397,7 @@ static const IMFMediaSourceVtbl IMFMediaSource_vtbl =
|
||||
@@ -1386,6 +1386,7 @@ static const IMFMediaSourceVtbl IMFMediaSource_vtbl =
|
||||
|
||||
static HRESULT media_source_constructor(IMFByteStream *bytestream, struct media_source **out_media_source)
|
||||
{
|
||||
@@ -20,7 +20,7 @@ index 2ed31666cad..c97348cc2d6 100644
|
||||
IMFStreamDescriptor **descriptors = NULL;
|
||||
unsigned int stream_count = UINT_MAX;
|
||||
struct media_source *object;
|
||||
@@ -1497,9 +1498,28 @@ static HRESULT media_source_constructor(IMFByteStream *bytestream, struct media_
|
||||
@@ -1486,9 +1487,28 @@ static HRESULT media_source_constructor(IMFByteStream *bytestream, struct media_
|
||||
if (FAILED(hr = MFCreatePresentationDescriptor(object->stream_count, descriptors, &object->pres_desc)))
|
||||
goto fail;
|
||||
|
||||
@@ -51,5 +51,5 @@ index 2ed31666cad..c97348cc2d6 100644
|
||||
}
|
||||
free(descriptors);
|
||||
--
|
||||
2.34.1
|
||||
2.37.2
|
||||
|
||||
|
@@ -1,18 +1,18 @@
|
||||
From 6c81e31b53f5b3f3fd798e3d3fb43f9a2df8fa5b Mon Sep 17 00:00:00 2001
|
||||
From 7649a8e89c0dff9ecba0314234bedb507c6ade87 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?R=C3=A9mi=20Bernon?= <rbernon@codeweavers.com>
|
||||
Date: Wed, 15 Dec 2021 11:51:33 +0100
|
||||
Subject: [PATCH 43/88] winegstreamer: Update offset according to the size of
|
||||
the buffer read.
|
||||
Subject: [PATCH] winegstreamer: Update offset according to the size of the
|
||||
buffer read.
|
||||
|
||||
---
|
||||
dlls/winegstreamer/wg_parser.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/dlls/winegstreamer/wg_parser.c b/dlls/winegstreamer/wg_parser.c
|
||||
index a11fc8c4f68..42c727fbd0b 100644
|
||||
index 5df08dc5fd7..6ec8e1bdbd8 100644
|
||||
--- a/dlls/winegstreamer/wg_parser.c
|
||||
+++ b/dlls/winegstreamer/wg_parser.c
|
||||
@@ -1642,7 +1642,7 @@ static void *push_data(void *arg)
|
||||
@@ -998,7 +998,7 @@ static void *push_data(void *arg)
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -22,5 +22,5 @@ index a11fc8c4f68..42c727fbd0b 100644
|
||||
buffer->duration = buffer->pts = -1;
|
||||
if ((ret = gst_pad_push(parser->my_src, buffer)) < 0)
|
||||
--
|
||||
2.34.1
|
||||
2.37.2
|
||||
|
||||
|
@@ -1,21 +1,21 @@
|
||||
From 3d8fddbac3026e1eed86f718452f833ac2d6b5c6 Mon Sep 17 00:00:00 2001
|
||||
From bdf230e4b3fedad3cf63d612dbc57e68fd33094a Mon Sep 17 00:00:00 2001
|
||||
From: Derek Lesho <dlesho@codeweavers.com>
|
||||
Date: Thu, 18 Mar 2021 15:25:17 -0400
|
||||
Subject: [PATCH 50/88] winegstreamer: Implement MF_SD_LANGUAGE.
|
||||
Subject: [PATCH] winegstreamer: Implement MF_SD_LANGUAGE.
|
||||
|
||||
---
|
||||
dlls/winegstreamer/gst_private.h | 1 +
|
||||
dlls/winegstreamer/main.c | 12 ++++++++++++
|
||||
dlls/winegstreamer/media_source.c | 20 +++++++++++++++++++-
|
||||
dlls/winegstreamer/unixlib.h | 8 ++++++++
|
||||
dlls/winegstreamer/wg_parser.c | 30 ++++++++++++++++++++++++++++++
|
||||
5 files changed, 70 insertions(+), 1 deletion(-)
|
||||
dlls/winegstreamer/wg_parser.c | 31 +++++++++++++++++++++++++++++++
|
||||
5 files changed, 71 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/dlls/winegstreamer/gst_private.h b/dlls/winegstreamer/gst_private.h
|
||||
index 6e7c53782c8..49879fe416d 100644
|
||||
index c33a89afd5b..21aef431039 100644
|
||||
--- a/dlls/winegstreamer/gst_private.h
|
||||
+++ b/dlls/winegstreamer/gst_private.h
|
||||
@@ -94,6 +94,7 @@ void wg_parser_stream_notify_qos(struct wg_parser_stream *stream,
|
||||
@@ -95,6 +95,7 @@ void wg_parser_stream_notify_qos(struct wg_parser_stream *stream,
|
||||
|
||||
/* Returns the duration in 100-nanosecond units. */
|
||||
uint64_t wg_parser_stream_get_duration(struct wg_parser_stream *stream);
|
||||
@@ -24,10 +24,10 @@ index 6e7c53782c8..49879fe416d 100644
|
||||
void wg_parser_stream_seek(struct wg_parser_stream *stream, double rate,
|
||||
uint64_t start_pos, uint64_t stop_pos, DWORD start_flags, DWORD stop_flags);
|
||||
diff --git a/dlls/winegstreamer/main.c b/dlls/winegstreamer/main.c
|
||||
index 316becdbc97..a9a9c72136d 100644
|
||||
index 2efa3bd26ac..2b9f10e7b37 100644
|
||||
--- a/dlls/winegstreamer/main.c
|
||||
+++ b/dlls/winegstreamer/main.c
|
||||
@@ -253,6 +253,18 @@ uint64_t wg_parser_stream_get_duration(struct wg_parser_stream *stream)
|
||||
@@ -271,6 +271,18 @@ uint64_t wg_parser_stream_get_duration(struct wg_parser_stream *stream)
|
||||
return params.duration;
|
||||
}
|
||||
|
||||
@@ -47,10 +47,10 @@ index 316becdbc97..a9a9c72136d 100644
|
||||
uint64_t start_pos, uint64_t stop_pos, DWORD start_flags, DWORD stop_flags)
|
||||
{
|
||||
diff --git a/dlls/winegstreamer/media_source.c b/dlls/winegstreamer/media_source.c
|
||||
index fd6479d9879..11040ac159a 100644
|
||||
index 042c635ae93..7c58dce5e27 100644
|
||||
--- a/dlls/winegstreamer/media_source.c
|
||||
+++ b/dlls/winegstreamer/media_source.c
|
||||
@@ -1492,7 +1492,25 @@ static HRESULT media_source_constructor(IMFByteStream *bytestream, struct media_
|
||||
@@ -1482,7 +1482,25 @@ static HRESULT media_source_constructor(IMFByteStream *bytestream, struct media_
|
||||
descriptors = malloc(object->stream_count * sizeof(IMFStreamDescriptor *));
|
||||
for (i = 0; i < object->stream_count; i++)
|
||||
{
|
||||
@@ -78,10 +78,10 @@ index fd6479d9879..11040ac159a 100644
|
||||
|
||||
if (FAILED(hr = MFCreatePresentationDescriptor(object->stream_count, descriptors, &object->pres_desc)))
|
||||
diff --git a/dlls/winegstreamer/unixlib.h b/dlls/winegstreamer/unixlib.h
|
||||
index 17b5c606014..fdcecfc96d5 100644
|
||||
index 9c53ecbfbc3..0c0fec0e966 100644
|
||||
--- a/dlls/winegstreamer/unixlib.h
|
||||
+++ b/dlls/winegstreamer/unixlib.h
|
||||
@@ -254,6 +254,13 @@ struct wg_parser_stream_get_duration_params
|
||||
@@ -249,6 +249,13 @@ struct wg_parser_stream_get_duration_params
|
||||
UINT64 duration;
|
||||
};
|
||||
|
||||
@@ -95,27 +95,27 @@ index 17b5c606014..fdcecfc96d5 100644
|
||||
struct wg_parser_stream_seek_params
|
||||
{
|
||||
struct wg_parser_stream *stream;
|
||||
@@ -290,6 +297,7 @@ enum unix_funcs
|
||||
@@ -309,6 +316,7 @@ enum unix_funcs
|
||||
unix_wg_parser_stream_notify_qos,
|
||||
|
||||
unix_wg_parser_stream_get_duration,
|
||||
+ unix_wg_parser_stream_get_language,
|
||||
unix_wg_parser_stream_seek,
|
||||
|
||||
unix_wg_parser_stream_drain,
|
||||
unix_wg_transform_create,
|
||||
diff --git a/dlls/winegstreamer/wg_parser.c b/dlls/winegstreamer/wg_parser.c
|
||||
index 06e07b874bf..dc655b275bd 100644
|
||||
index 6ec8e1bdbd8..6fa712dd1fb 100644
|
||||
--- a/dlls/winegstreamer/wg_parser.c
|
||||
+++ b/dlls/winegstreamer/wg_parser.c
|
||||
@@ -110,6 +110,7 @@ struct wg_parser_stream
|
||||
@@ -109,6 +109,7 @@ struct wg_parser_stream
|
||||
bool flushing, eos, enabled, has_caps;
|
||||
|
||||
uint64_t duration;
|
||||
+ gchar *language_code;
|
||||
};
|
||||
|
||||
static enum wg_audio_format wg_audio_format_from_gst(GstAudioFormat format)
|
||||
@@ -871,6 +872,14 @@ static NTSTATUS wg_parser_stream_get_duration(void *args)
|
||||
static NTSTATUS wg_parser_get_stream_count(void *args)
|
||||
@@ -350,6 +351,14 @@ static NTSTATUS wg_parser_stream_get_duration(void *args)
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
@@ -130,7 +130,7 @@ index 06e07b874bf..dc655b275bd 100644
|
||||
static NTSTATUS wg_parser_stream_seek(void *args)
|
||||
{
|
||||
GstSeekType start_type = GST_SEEK_TYPE_SET, stop_type = GST_SEEK_TYPE_SET;
|
||||
@@ -1321,6 +1330,9 @@ static void free_stream(struct wg_parser_stream *stream)
|
||||
@@ -723,6 +732,9 @@ static void free_stream(struct wg_parser_stream *stream)
|
||||
pthread_cond_destroy(&stream->event_cond);
|
||||
pthread_cond_destroy(&stream->event_empty_cond);
|
||||
|
||||
@@ -140,7 +140,7 @@ index 06e07b874bf..dc655b275bd 100644
|
||||
free(stream);
|
||||
}
|
||||
|
||||
@@ -1931,6 +1943,22 @@ static gboolean src_event_cb(GstPad *pad, GstObject *parent, GstEvent *event)
|
||||
@@ -1187,6 +1199,22 @@ static gboolean src_event_cb(GstPad *pad, GstObject *parent, GstEvent *event)
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -160,25 +160,26 @@ index 06e07b874bf..dc655b275bd 100644
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
static HRESULT wg_parser_connect_inner(struct wg_parser *parser)
|
||||
static NTSTATUS wg_parser_connect(void *args)
|
||||
{
|
||||
GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE("wine_src",
|
||||
@@ -2066,6 +2094,7 @@ static NTSTATUS wg_parser_connect(void *args)
|
||||
pthread_cond_wait(&parser->init_cond, &parser->mutex);
|
||||
}
|
||||
}
|
||||
GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE("quartz_src",
|
||||
@@ -1315,6 +1343,8 @@ static NTSTATUS wg_parser_connect(void *args)
|
||||
* attempting to read anything), but we don't want to waste CPU time
|
||||
* trying to decode them. */
|
||||
stream->enabled = true;
|
||||
+
|
||||
+ stream->language_code = query_language(stream->their_src);
|
||||
}
|
||||
|
||||
pthread_mutex_unlock(&parser->mutex);
|
||||
@@ -2561,6 +2590,7 @@ const unixlib_entry_t __wine_unix_call_funcs[] =
|
||||
@@ -1631,6 +1661,7 @@ const unixlib_entry_t __wine_unix_call_funcs[] =
|
||||
X(wg_parser_stream_notify_qos),
|
||||
|
||||
X(wg_parser_stream_get_duration),
|
||||
+ X(wg_parser_stream_get_language),
|
||||
X(wg_parser_stream_seek),
|
||||
|
||||
X(wg_parser_stream_drain),
|
||||
X(wg_transform_create),
|
||||
--
|
||||
2.34.1
|
||||
2.37.2
|
||||
|
||||
|
@@ -1,7 +1,7 @@
|
||||
From 5ebda711a9d8b5e3194464eab3fecf52ed3c8b59 Mon Sep 17 00:00:00 2001
|
||||
From 56ad22a46d27fdc5313aff459f6334bb0051e21a Mon Sep 17 00:00:00 2001
|
||||
From: Nikolay Sivov <nsivov@codeweavers.com>
|
||||
Date: Wed, 12 Jan 2022 22:48:35 +0300
|
||||
Subject: [PATCH 55/88] winegstreamer: Add MFVideoFormat_ARGB32 output for the
|
||||
Subject: [PATCH] winegstreamer: Add MFVideoFormat_ARGB32 output for the
|
||||
source.
|
||||
|
||||
(cherry picked from commit 9812591f0003c5c611faa59ab9b3cb73a85be637)
|
||||
@@ -12,10 +12,10 @@ CW-Bug-Id: #19975
|
||||
1 file changed, 2 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/dlls/winegstreamer/media_source.c b/dlls/winegstreamer/media_source.c
|
||||
index e5f25eed63a..9d5a8b831b9 100644
|
||||
index de6a2c2b232..042c635ae93 100644
|
||||
--- a/dlls/winegstreamer/media_source.c
|
||||
+++ b/dlls/winegstreamer/media_source.c
|
||||
@@ -873,7 +873,7 @@ static HRESULT new_media_stream(struct media_source *source,
|
||||
@@ -855,7 +855,7 @@ static HRESULT new_media_stream(struct media_source *source,
|
||||
static HRESULT media_stream_init_desc(struct media_stream *stream)
|
||||
{
|
||||
IMFMediaTypeHandler *type_handler = NULL;
|
||||
@@ -24,7 +24,7 @@ index e5f25eed63a..9d5a8b831b9 100644
|
||||
struct wg_format format;
|
||||
DWORD type_count = 0;
|
||||
unsigned int i;
|
||||
@@ -892,6 +892,7 @@ static HRESULT media_stream_init_desc(struct media_stream *stream)
|
||||
@@ -874,6 +874,7 @@ static HRESULT media_stream_init_desc(struct media_stream *stream)
|
||||
&MFVideoFormat_YUY2,
|
||||
&MFVideoFormat_IYUV,
|
||||
&MFVideoFormat_I420,
|
||||
@@ -33,5 +33,5 @@ index e5f25eed63a..9d5a8b831b9 100644
|
||||
|
||||
IMFMediaType *base_type = mf_media_type_from_wg_format(&format);
|
||||
--
|
||||
2.34.1
|
||||
2.37.2
|
||||
|
||||
|
@@ -1,37 +0,0 @@
|
||||
From 30e5e0e405af8f99885727687dbcdfbda3e57f08 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?R=C3=A9mi=20Bernon?= <rbernon@codeweavers.com>
|
||||
Date: Tue, 18 Jan 2022 13:33:36 +0100
|
||||
Subject: [PATCH 67/88] winegstreamer: Return S_OK from H264 decoder
|
||||
GetAttributes.
|
||||
|
||||
For: Call of Duty III, Mortal Kombat 11, Shadow Warrior 2,
|
||||
Yakuza 4 Remastered, Hard Reset Redux.
|
||||
|
||||
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=45988
|
||||
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=47084
|
||||
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=49715
|
||||
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=52183
|
||||
CW-Bug-Id: #16839
|
||||
CW-Bug-Id: #18678
|
||||
CW-Bug-Id: #19362
|
||||
---
|
||||
dlls/winegstreamer/h264_decoder.c | 3 ++-
|
||||
1 file changed, 2 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/dlls/winegstreamer/h264_decoder.c b/dlls/winegstreamer/h264_decoder.c
|
||||
index 5db72c55151..f46d6d77f8e 100644
|
||||
--- a/dlls/winegstreamer/h264_decoder.c
|
||||
+++ b/dlls/winegstreamer/h264_decoder.c
|
||||
@@ -120,7 +120,8 @@ static HRESULT WINAPI h264_decoder_GetOutputStreamInfo(IMFTransform *iface, DWOR
|
||||
static HRESULT WINAPI h264_decoder_GetAttributes(IMFTransform *iface, IMFAttributes **attributes)
|
||||
{
|
||||
FIXME("iface %p, attributes %p stub!\n", iface, attributes);
|
||||
- return E_NOTIMPL;
|
||||
+
|
||||
+ return MFCreateAttributes(attributes, 0);
|
||||
}
|
||||
|
||||
static HRESULT WINAPI h264_decoder_GetInputStreamAttributes(IMFTransform *iface, DWORD id,
|
||||
--
|
||||
2.34.1
|
||||
|
File diff suppressed because it is too large
Load Diff
@@ -1,2 +1 @@
|
||||
Fixes: [49692] Multiple applications need a Media Foundation media source implementation
|
||||
Disabled: True
|
||||
|
@@ -1,4 +1,4 @@
|
||||
From 85a401a87c2550aab3b2eb85e518ac43ed2ff533 Mon Sep 17 00:00:00 2001
|
||||
From 6059fc95c799ed70419bb170c99ddb11507e66f9 Mon Sep 17 00:00:00 2001
|
||||
From: Alistair Leslie-Hughes <leslie_alistair@hotmail.com>
|
||||
Date: Tue, 11 Jun 2019 15:27:50 +1000
|
||||
Subject: [PATCH] mshtml: Improve IOleInPlaceActiveObject TranslateAccelerator
|
||||
@@ -9,13 +9,13 @@ Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=37058
|
||||
1 file changed, 22 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/dlls/mshtml/oleobj.c b/dlls/mshtml/oleobj.c
|
||||
index 274db8c22b..ba02e811cc 100644
|
||||
index a9bd8a3d558..444551778e1 100644
|
||||
--- a/dlls/mshtml/oleobj.c
|
||||
+++ b/dlls/mshtml/oleobj.c
|
||||
@@ -1024,8 +1024,28 @@ static HRESULT WINAPI OleInPlaceActiveObject_ContextSensitiveHelp(IOleInPlaceAct
|
||||
static HRESULT WINAPI OleInPlaceActiveObject_TranslateAccelerator(IOleInPlaceActiveObject *iface, LPMSG lpmsg)
|
||||
@@ -1413,8 +1413,28 @@ static HRESULT WINAPI DocObjOleInPlaceActiveObject_ContextSensitiveHelp(IOleInPl
|
||||
static HRESULT WINAPI DocObjOleInPlaceActiveObject_TranslateAccelerator(IOleInPlaceActiveObject *iface, LPMSG lpmsg)
|
||||
{
|
||||
HTMLDocument *This = impl_from_IOleInPlaceActiveObject(iface);
|
||||
HTMLDocumentObj *This = HTMLDocumentObj_from_IOleInPlaceActiveObject(iface);
|
||||
- FIXME("(%p)->(%p)\n", This, lpmsg);
|
||||
- return E_NOTIMPL;
|
||||
+ HRESULT hres = S_FALSE;
|
||||
@@ -42,7 +42,7 @@ index 274db8c22b..ba02e811cc 100644
|
||||
+ return hres;
|
||||
}
|
||||
|
||||
static HRESULT WINAPI OleInPlaceActiveObject_OnFrameWindowActivate(IOleInPlaceActiveObject *iface,
|
||||
static HRESULT WINAPI DocObjOleInPlaceActiveObject_OnFrameWindowActivate(IOleInPlaceActiveObject *iface,
|
||||
--
|
||||
2.17.1
|
||||
2.37.2
|
||||
|
||||
|
@@ -1,4 +1,4 @@
|
||||
From 217794090443a96e712ffe3970e4a70ded2277dc Mon Sep 17 00:00:00 2001
|
||||
From 27019592a4f4aa7134f605093b5d83fe3764dcf5 Mon Sep 17 00:00:00 2001
|
||||
From: Sebastian Lackner <sebastian@fds-team.de>
|
||||
Date: Sat, 5 Aug 2017 03:39:37 +0200
|
||||
Subject: [PATCH] ntdll: Use fast CS functions for threadpool locking.
|
||||
@@ -8,19 +8,19 @@ Subject: [PATCH] ntdll: Use fast CS functions for threadpool locking.
|
||||
1 file changed, 45 insertions(+), 45 deletions(-)
|
||||
|
||||
diff --git a/dlls/ntdll/threadpool.c b/dlls/ntdll/threadpool.c
|
||||
index ca323919d05..581d503b6a4 100644
|
||||
index 421d1ade133..71771dd2987 100644
|
||||
--- a/dlls/ntdll/threadpool.c
|
||||
+++ b/dlls/ntdll/threadpool.c
|
||||
@@ -1053,7 +1053,7 @@ static void CALLBACK timerqueue_thread_proc( void *param )
|
||||
|
||||
@@ -1063,7 +1063,7 @@ static void CALLBACK timerqueue_thread_proc( void *param )
|
||||
TRACE( "starting timer queue thread\n" );
|
||||
set_thread_name(L"wine_threadpool_timerqueue");
|
||||
|
||||
- RtlEnterCriticalSection( &timerqueue.cs );
|
||||
+ enter_critical_section( &timerqueue.cs );
|
||||
for (;;)
|
||||
{
|
||||
NtQuerySystemTime( &now );
|
||||
@@ -1126,7 +1126,7 @@ static void CALLBACK timerqueue_thread_proc( void *param )
|
||||
@@ -1136,7 +1136,7 @@ static void CALLBACK timerqueue_thread_proc( void *param )
|
||||
}
|
||||
|
||||
timerqueue.thread_running = FALSE;
|
||||
@@ -29,7 +29,7 @@ index ca323919d05..581d503b6a4 100644
|
||||
|
||||
TRACE( "terminating timer queue thread\n" );
|
||||
RtlExitUserThread( 0 );
|
||||
@@ -1171,7 +1171,7 @@ static NTSTATUS tp_timerqueue_lock( struct threadpool_object *timer )
|
||||
@@ -1181,7 +1181,7 @@ static NTSTATUS tp_timerqueue_lock( struct threadpool_object *timer )
|
||||
timer->u.timer.period = 0;
|
||||
timer->u.timer.window_length = 0;
|
||||
|
||||
@@ -38,7 +38,7 @@ index ca323919d05..581d503b6a4 100644
|
||||
|
||||
/* Make sure that the timerqueue thread is running. */
|
||||
if (!timerqueue.thread_running)
|
||||
@@ -1192,7 +1192,7 @@ static NTSTATUS tp_timerqueue_lock( struct threadpool_object *timer )
|
||||
@@ -1202,7 +1202,7 @@ static NTSTATUS tp_timerqueue_lock( struct threadpool_object *timer )
|
||||
timerqueue.objcount++;
|
||||
}
|
||||
|
||||
@@ -47,7 +47,7 @@ index ca323919d05..581d503b6a4 100644
|
||||
return status;
|
||||
}
|
||||
|
||||
@@ -1205,7 +1205,7 @@ static void tp_timerqueue_unlock( struct threadpool_object *timer )
|
||||
@@ -1215,7 +1215,7 @@ static void tp_timerqueue_unlock( struct threadpool_object *timer )
|
||||
{
|
||||
assert( timer->type == TP_OBJECT_TYPE_TIMER );
|
||||
|
||||
@@ -56,7 +56,7 @@ index ca323919d05..581d503b6a4 100644
|
||||
if (timer->u.timer.timer_initialized)
|
||||
{
|
||||
/* If timer was pending, remove it. */
|
||||
@@ -1224,7 +1224,7 @@ static void tp_timerqueue_unlock( struct threadpool_object *timer )
|
||||
@@ -1234,7 +1234,7 @@ static void tp_timerqueue_unlock( struct threadpool_object *timer )
|
||||
|
||||
timer->u.timer.timer_initialized = FALSE;
|
||||
}
|
||||
@@ -65,16 +65,16 @@ index ca323919d05..581d503b6a4 100644
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
@@ -1242,7 +1242,7 @@ static void CALLBACK waitqueue_thread_proc( void *param )
|
||||
|
||||
@@ -1253,7 +1253,7 @@ static void CALLBACK waitqueue_thread_proc( void *param )
|
||||
TRACE( "starting wait queue thread\n" );
|
||||
set_thread_name(L"wine_threadpool_waitqueue");
|
||||
|
||||
- RtlEnterCriticalSection( &waitqueue.cs );
|
||||
+ enter_critical_section( &waitqueue.cs );
|
||||
|
||||
for (;;)
|
||||
{
|
||||
@@ -1291,10 +1291,10 @@ static void CALLBACK waitqueue_thread_proc( void *param )
|
||||
@@ -1302,10 +1302,10 @@ static void CALLBACK waitqueue_thread_proc( void *param )
|
||||
/* All wait objects have been destroyed, if no new wait objects are created
|
||||
* within some amount of time, then we can shutdown this thread. */
|
||||
assert( num_handles == 0 );
|
||||
@@ -87,7 +87,7 @@ index ca323919d05..581d503b6a4 100644
|
||||
|
||||
if (status == STATUS_TIMEOUT && !bucket->objcount)
|
||||
break;
|
||||
@@ -1304,7 +1304,7 @@ static void CALLBACK waitqueue_thread_proc( void *param )
|
||||
@@ -1315,7 +1315,7 @@ static void CALLBACK waitqueue_thread_proc( void *param )
|
||||
handles[num_handles] = bucket->update_event;
|
||||
RtlLeaveCriticalSection( &waitqueue.cs );
|
||||
status = NtWaitForMultipleObjects( num_handles + 1, handles, TRUE, bucket->alertable, &timeout );
|
||||
@@ -96,7 +96,7 @@ index ca323919d05..581d503b6a4 100644
|
||||
|
||||
if (status >= STATUS_WAIT_0 && status < STATUS_WAIT_0 + num_handles)
|
||||
{
|
||||
@@ -1388,7 +1388,7 @@ static void CALLBACK waitqueue_thread_proc( void *param )
|
||||
@@ -1399,7 +1399,7 @@ static void CALLBACK waitqueue_thread_proc( void *param )
|
||||
if (!--waitqueue.num_buckets)
|
||||
assert( list_empty( &waitqueue.buckets ) );
|
||||
|
||||
@@ -105,7 +105,7 @@ index ca323919d05..581d503b6a4 100644
|
||||
|
||||
TRACE( "terminating wait queue thread\n" );
|
||||
|
||||
@@ -1418,7 +1418,7 @@ static NTSTATUS tp_waitqueue_lock( struct threadpool_object *wait )
|
||||
@@ -1429,7 +1429,7 @@ static NTSTATUS tp_waitqueue_lock( struct threadpool_object *wait )
|
||||
wait->u.wait.timeout = 0;
|
||||
wait->u.wait.handle = INVALID_HANDLE_VALUE;
|
||||
|
||||
@@ -114,7 +114,7 @@ index ca323919d05..581d503b6a4 100644
|
||||
|
||||
/* Try to assign to existing bucket if possible. */
|
||||
LIST_FOR_EACH_ENTRY( bucket, &waitqueue.buckets, struct waitqueue_bucket, bucket_entry )
|
||||
@@ -1475,7 +1475,7 @@ static NTSTATUS tp_waitqueue_lock( struct threadpool_object *wait )
|
||||
@@ -1486,7 +1486,7 @@ static NTSTATUS tp_waitqueue_lock( struct threadpool_object *wait )
|
||||
}
|
||||
|
||||
out:
|
||||
@@ -123,7 +123,7 @@ index ca323919d05..581d503b6a4 100644
|
||||
return status;
|
||||
}
|
||||
|
||||
@@ -1486,7 +1486,7 @@ static void tp_waitqueue_unlock( struct threadpool_object *wait )
|
||||
@@ -1497,7 +1497,7 @@ static void tp_waitqueue_unlock( struct threadpool_object *wait )
|
||||
{
|
||||
assert( wait->type == TP_OBJECT_TYPE_WAIT );
|
||||
|
||||
@@ -132,7 +132,7 @@ index ca323919d05..581d503b6a4 100644
|
||||
if (wait->u.wait.bucket)
|
||||
{
|
||||
struct waitqueue_bucket *bucket = wait->u.wait.bucket;
|
||||
@@ -1498,7 +1498,7 @@ static void tp_waitqueue_unlock( struct threadpool_object *wait )
|
||||
@@ -1509,7 +1509,7 @@ static void tp_waitqueue_unlock( struct threadpool_object *wait )
|
||||
|
||||
NtSetEvent( bucket->update_event, NULL );
|
||||
}
|
||||
@@ -141,7 +141,7 @@ index ca323919d05..581d503b6a4 100644
|
||||
}
|
||||
|
||||
static void CALLBACK ioqueue_thread_proc( void *param )
|
||||
@@ -1775,7 +1775,7 @@ static NTSTATUS tp_threadpool_lock( struct threadpool **out, TP_CALLBACK_ENVIRON
|
||||
@@ -1787,7 +1787,7 @@ static NTSTATUS tp_threadpool_lock( struct threadpool **out, TP_CALLBACK_ENVIRON
|
||||
pool = default_threadpool;
|
||||
}
|
||||
|
||||
@@ -150,7 +150,7 @@ index ca323919d05..581d503b6a4 100644
|
||||
|
||||
/* Make sure that the threadpool has at least one thread. */
|
||||
if (!pool->num_workers)
|
||||
@@ -1789,7 +1789,7 @@ static NTSTATUS tp_threadpool_lock( struct threadpool **out, TP_CALLBACK_ENVIRON
|
||||
@@ -1801,7 +1801,7 @@ static NTSTATUS tp_threadpool_lock( struct threadpool **out, TP_CALLBACK_ENVIRON
|
||||
pool->objcount++;
|
||||
}
|
||||
|
||||
@@ -159,7 +159,7 @@ index ca323919d05..581d503b6a4 100644
|
||||
|
||||
if (status != STATUS_SUCCESS)
|
||||
return status;
|
||||
@@ -1805,9 +1805,9 @@ static NTSTATUS tp_threadpool_lock( struct threadpool **out, TP_CALLBACK_ENVIRON
|
||||
@@ -1817,9 +1817,9 @@ static NTSTATUS tp_threadpool_lock( struct threadpool **out, TP_CALLBACK_ENVIRON
|
||||
*/
|
||||
static void tp_threadpool_unlock( struct threadpool *pool )
|
||||
{
|
||||
@@ -171,7 +171,7 @@ index ca323919d05..581d503b6a4 100644
|
||||
tp_threadpool_release( pool );
|
||||
}
|
||||
|
||||
@@ -1945,10 +1945,10 @@ static void tp_object_initialize( struct threadpool_object *object, struct threa
|
||||
@@ -1957,10 +1957,10 @@ static void tp_object_initialize( struct threadpool_object *object, struct threa
|
||||
struct threadpool_group *group = object->group;
|
||||
InterlockedIncrement( &group->refcount );
|
||||
|
||||
@@ -184,7 +184,7 @@ index ca323919d05..581d503b6a4 100644
|
||||
}
|
||||
|
||||
if (is_simple_callback)
|
||||
@@ -1975,7 +1975,7 @@ static void tp_object_submit( struct threadpool_object *object, BOOL signaled )
|
||||
@@ -1987,7 +1987,7 @@ static void tp_object_submit( struct threadpool_object *object, BOOL signaled )
|
||||
assert( !object->shutdown );
|
||||
assert( !pool->shutdown );
|
||||
|
||||
@@ -193,7 +193,7 @@ index ca323919d05..581d503b6a4 100644
|
||||
|
||||
/* Start new worker threads if required. */
|
||||
if (pool->num_busy_workers >= pool->num_workers &&
|
||||
@@ -1998,7 +1998,7 @@ static void tp_object_submit( struct threadpool_object *object, BOOL signaled )
|
||||
@@ -2010,7 +2010,7 @@ static void tp_object_submit( struct threadpool_object *object, BOOL signaled )
|
||||
RtlWakeConditionVariable( &pool->update_event );
|
||||
}
|
||||
|
||||
@@ -202,7 +202,7 @@ index ca323919d05..581d503b6a4 100644
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
@@ -2011,7 +2011,7 @@ static void tp_object_cancel( struct threadpool_object *object )
|
||||
@@ -2023,7 +2023,7 @@ static void tp_object_cancel( struct threadpool_object *object )
|
||||
struct threadpool *pool = object->pool;
|
||||
LONG pending_callbacks = 0;
|
||||
|
||||
@@ -211,7 +211,7 @@ index ca323919d05..581d503b6a4 100644
|
||||
if (object->num_pending_callbacks)
|
||||
{
|
||||
pending_callbacks = object->num_pending_callbacks;
|
||||
@@ -2026,7 +2026,7 @@ static void tp_object_cancel( struct threadpool_object *object )
|
||||
@@ -2038,7 +2038,7 @@ static void tp_object_cancel( struct threadpool_object *object )
|
||||
object->u.io.skipped_count += object->u.io.pending_count;
|
||||
object->u.io.pending_count = 0;
|
||||
}
|
||||
@@ -220,7 +220,7 @@ index ca323919d05..581d503b6a4 100644
|
||||
|
||||
while (pending_callbacks--)
|
||||
tp_object_release( object );
|
||||
@@ -2055,7 +2055,7 @@ static void tp_object_wait( struct threadpool_object *object, BOOL group_wait )
|
||||
@@ -2067,7 +2067,7 @@ static void tp_object_wait( struct threadpool_object *object, BOOL group_wait )
|
||||
{
|
||||
struct threadpool *pool = object->pool;
|
||||
|
||||
@@ -229,7 +229,7 @@ index ca323919d05..581d503b6a4 100644
|
||||
while (!object_is_finished( object, group_wait ))
|
||||
{
|
||||
if (group_wait)
|
||||
@@ -2063,7 +2063,7 @@ static void tp_object_wait( struct threadpool_object *object, BOOL group_wait )
|
||||
@@ -2075,7 +2075,7 @@ static void tp_object_wait( struct threadpool_object *object, BOOL group_wait )
|
||||
else
|
||||
RtlSleepConditionVariableCS( &object->finished_event, &pool->cs, NULL );
|
||||
}
|
||||
@@ -238,7 +238,7 @@ index ca323919d05..581d503b6a4 100644
|
||||
}
|
||||
|
||||
static void tp_ioqueue_unlock( struct threadpool_object *io )
|
||||
@@ -2117,13 +2117,13 @@ static BOOL tp_object_release( struct threadpool_object *object )
|
||||
@@ -2129,13 +2129,13 @@ static BOOL tp_object_release( struct threadpool_object *object )
|
||||
{
|
||||
struct threadpool_group *group = object->group;
|
||||
|
||||
@@ -254,16 +254,16 @@ index ca323919d05..581d503b6a4 100644
|
||||
|
||||
tp_group_release( group );
|
||||
}
|
||||
@@ -2324,7 +2324,7 @@ static void CALLBACK threadpool_worker_proc( void *param )
|
||||
|
||||
@@ -2337,7 +2337,7 @@ static void CALLBACK threadpool_worker_proc( void *param )
|
||||
TRACE( "starting worker thread for pool %p\n", pool );
|
||||
set_thread_name(L"wine_threadpool_worker");
|
||||
|
||||
- RtlEnterCriticalSection( &pool->cs );
|
||||
+ enter_critical_section( &pool->cs );
|
||||
for (;;)
|
||||
{
|
||||
while ((ptr = threadpool_get_next_item( pool )))
|
||||
@@ -2364,7 +2364,7 @@ static void CALLBACK threadpool_worker_proc( void *param )
|
||||
@@ -2377,7 +2377,7 @@ static void CALLBACK threadpool_worker_proc( void *param )
|
||||
}
|
||||
}
|
||||
pool->num_workers--;
|
||||
@@ -272,7 +272,7 @@ index ca323919d05..581d503b6a4 100644
|
||||
|
||||
TRACE( "terminating worker thread for pool %p\n", pool );
|
||||
tp_threadpool_release( pool );
|
||||
@@ -2612,7 +2612,7 @@ NTSTATUS WINAPI TpCallbackMayRunLong( TP_CALLBACK_INSTANCE *instance )
|
||||
@@ -2625,7 +2625,7 @@ NTSTATUS WINAPI TpCallbackMayRunLong( TP_CALLBACK_INSTANCE *instance )
|
||||
return STATUS_SUCCESS;
|
||||
|
||||
pool = object->pool;
|
||||
@@ -281,7 +281,7 @@ index ca323919d05..581d503b6a4 100644
|
||||
|
||||
/* Start new worker threads if required. */
|
||||
if (pool->num_busy_workers >= pool->num_workers)
|
||||
@@ -2627,7 +2627,7 @@ NTSTATUS WINAPI TpCallbackMayRunLong( TP_CALLBACK_INSTANCE *instance )
|
||||
@@ -2640,7 +2640,7 @@ NTSTATUS WINAPI TpCallbackMayRunLong( TP_CALLBACK_INSTANCE *instance )
|
||||
}
|
||||
}
|
||||
|
||||
@@ -290,7 +290,7 @@ index ca323919d05..581d503b6a4 100644
|
||||
this->may_run_long = TRUE;
|
||||
return status;
|
||||
}
|
||||
@@ -2708,13 +2708,13 @@ VOID WINAPI TpDisassociateCallback( TP_CALLBACK_INSTANCE *instance )
|
||||
@@ -2721,13 +2721,13 @@ VOID WINAPI TpDisassociateCallback( TP_CALLBACK_INSTANCE *instance )
|
||||
return;
|
||||
|
||||
pool = object->pool;
|
||||
@@ -306,7 +306,7 @@ index ca323919d05..581d503b6a4 100644
|
||||
this->associated = FALSE;
|
||||
}
|
||||
|
||||
@@ -2766,7 +2766,7 @@ VOID WINAPI TpReleaseCleanupGroupMembers( TP_CLEANUP_GROUP *group, BOOL cancel_p
|
||||
@@ -2779,7 +2779,7 @@ VOID WINAPI TpReleaseCleanupGroupMembers( TP_CLEANUP_GROUP *group, BOOL cancel_p
|
||||
|
||||
TRACE( "%p %u %p\n", group, cancel_pending, userdata );
|
||||
|
||||
@@ -315,7 +315,7 @@ index ca323919d05..581d503b6a4 100644
|
||||
|
||||
/* Unset group, increase references, and mark objects for shutdown */
|
||||
LIST_FOR_EACH_ENTRY_SAFE( object, next, &this->members, struct threadpool_object, group_entry )
|
||||
@@ -2792,7 +2792,7 @@ VOID WINAPI TpReleaseCleanupGroupMembers( TP_CLEANUP_GROUP *group, BOOL cancel_p
|
||||
@@ -2805,7 +2805,7 @@ VOID WINAPI TpReleaseCleanupGroupMembers( TP_CLEANUP_GROUP *group, BOOL cancel_p
|
||||
list_init( &members );
|
||||
list_move_tail( &members, &this->members );
|
||||
|
||||
@@ -324,7 +324,7 @@ index ca323919d05..581d503b6a4 100644
|
||||
|
||||
/* Cancel pending callbacks if requested */
|
||||
if (cancel_pending)
|
||||
@@ -2915,10 +2915,10 @@ VOID WINAPI TpSetPoolMaxThreads( TP_POOL *pool, DWORD maximum )
|
||||
@@ -2928,10 +2928,10 @@ VOID WINAPI TpSetPoolMaxThreads( TP_POOL *pool, DWORD maximum )
|
||||
|
||||
TRACE( "%p %u\n", pool, maximum );
|
||||
|
||||
@@ -337,7 +337,7 @@ index ca323919d05..581d503b6a4 100644
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
@@ -2931,7 +2931,7 @@ BOOL WINAPI TpSetPoolMinThreads( TP_POOL *pool, DWORD minimum )
|
||||
@@ -2944,7 +2944,7 @@ BOOL WINAPI TpSetPoolMinThreads( TP_POOL *pool, DWORD minimum )
|
||||
|
||||
TRACE( "%p %u\n", pool, minimum );
|
||||
|
||||
@@ -346,7 +346,7 @@ index ca323919d05..581d503b6a4 100644
|
||||
|
||||
while (this->num_workers < minimum)
|
||||
{
|
||||
@@ -2946,7 +2946,7 @@ BOOL WINAPI TpSetPoolMinThreads( TP_POOL *pool, DWORD minimum )
|
||||
@@ -2959,7 +2959,7 @@ BOOL WINAPI TpSetPoolMinThreads( TP_POOL *pool, DWORD minimum )
|
||||
this->max_workers = max( this->min_workers, this->max_workers );
|
||||
}
|
||||
|
||||
@@ -355,7 +355,7 @@ index ca323919d05..581d503b6a4 100644
|
||||
return !status;
|
||||
}
|
||||
|
||||
@@ -2962,7 +2962,7 @@ VOID WINAPI TpSetTimer( TP_TIMER *timer, LARGE_INTEGER *timeout, LONG period, LO
|
||||
@@ -2975,7 +2975,7 @@ VOID WINAPI TpSetTimer( TP_TIMER *timer, LARGE_INTEGER *timeout, LONG period, LO
|
||||
|
||||
TRACE( "%p %p %u %u\n", timer, timeout, period, window_length );
|
||||
|
||||
@@ -364,7 +364,7 @@ index ca323919d05..581d503b6a4 100644
|
||||
|
||||
assert( this->u.timer.timer_initialized );
|
||||
this->u.timer.timer_set = timeout != NULL;
|
||||
@@ -3022,7 +3022,7 @@ VOID WINAPI TpSetTimer( TP_TIMER *timer, LARGE_INTEGER *timeout, LONG period, LO
|
||||
@@ -3035,7 +3035,7 @@ VOID WINAPI TpSetTimer( TP_TIMER *timer, LARGE_INTEGER *timeout, LONG period, LO
|
||||
this->u.timer.timer_pending = TRUE;
|
||||
}
|
||||
|
||||
@@ -373,7 +373,7 @@ index ca323919d05..581d503b6a4 100644
|
||||
|
||||
if (submit_timer)
|
||||
tp_object_submit( this, FALSE );
|
||||
@@ -3038,7 +3038,7 @@ VOID WINAPI TpSetWait( TP_WAIT *wait, HANDLE handle, LARGE_INTEGER *timeout )
|
||||
@@ -3051,7 +3051,7 @@ VOID WINAPI TpSetWait( TP_WAIT *wait, HANDLE handle, LARGE_INTEGER *timeout )
|
||||
|
||||
TRACE( "%p %p %p\n", wait, handle, timeout );
|
||||
|
||||
@@ -382,7 +382,7 @@ index ca323919d05..581d503b6a4 100644
|
||||
|
||||
assert( this->u.wait.bucket );
|
||||
this->u.wait.handle = handle;
|
||||
@@ -3077,7 +3077,7 @@ VOID WINAPI TpSetWait( TP_WAIT *wait, HANDLE handle, LARGE_INTEGER *timeout )
|
||||
@@ -3090,7 +3090,7 @@ VOID WINAPI TpSetWait( TP_WAIT *wait, HANDLE handle, LARGE_INTEGER *timeout )
|
||||
NtSetEvent( bucket->update_event, NULL );
|
||||
}
|
||||
|
||||
@@ -392,5 +392,5 @@ index ca323919d05..581d503b6a4 100644
|
||||
|
||||
/***********************************************************************
|
||||
--
|
||||
2.30.2
|
||||
2.37.2
|
||||
|
||||
|
@@ -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,18 +1,18 @@
|
||||
From a2e3bc27382f9c0c4894c6e0ab121f075e82db3e Mon Sep 17 00:00:00 2001
|
||||
From 95b71a04c7d437e25aac1a1d327beba6ebfaf608 Mon Sep 17 00:00:00 2001
|
||||
From: "Erich E. Hoover" <erich.e.hoover@gmail.com>
|
||||
Date: Wed, 20 Aug 2014 11:26:48 -0600
|
||||
Subject: [PATCH] ntdll: Perform the Unix-style hidden file check within the
|
||||
unified file info grabbing routine.
|
||||
|
||||
---
|
||||
dlls/ntdll/unix/file.c | 23 +++++++++--------------
|
||||
1 file changed, 9 insertions(+), 14 deletions(-)
|
||||
dlls/ntdll/unix/file.c | 25 ++++++++++---------------
|
||||
1 file changed, 10 insertions(+), 15 deletions(-)
|
||||
|
||||
diff --git a/dlls/ntdll/unix/file.c b/dlls/ntdll/unix/file.c
|
||||
index 73d4cce90ae..b790cde3f90 100644
|
||||
index 9594c70c016..31579caf03b 100644
|
||||
--- a/dlls/ntdll/unix/file.c
|
||||
+++ b/dlls/ntdll/unix/file.c
|
||||
@@ -1328,15 +1328,15 @@ static BOOLEAN get_dir_case_sensitivity( const char *dir )
|
||||
@@ -1311,16 +1311,16 @@ static BOOLEAN get_dir_case_sensitivity( const char *dir )
|
||||
*
|
||||
* Check if the specified file should be hidden based on its name and the show dot files option.
|
||||
*/
|
||||
@@ -27,13 +27,15 @@ index 73d4cce90ae..b790cde3f90 100644
|
||||
- end = p = name->Buffer + name->Length/sizeof(WCHAR);
|
||||
- while (p > name->Buffer && p[-1] == '\\') p--;
|
||||
- while (p > name->Buffer && p[-1] != '\\') p--;
|
||||
- return (p < end && *p == '.');
|
||||
+ end = p = name + strlen( name );
|
||||
+ while (p > name && p[-1] == '\\') p--;
|
||||
+ while (p > name && p[-1] != '\\') p--;
|
||||
return (p < end && *p == '.');
|
||||
+ while (p > name && p[-1] == '/') p--;
|
||||
+ while (p > name && p[-1] != '/') p--;
|
||||
+ return (p < end && p[0] == '.' && p[1] && (p[1] != '.' || p[2]));
|
||||
}
|
||||
|
||||
@@ -1679,6 +1679,10 @@ static int get_file_info( const char *path, struct stat *st, ULONG *attr )
|
||||
|
||||
@@ -1662,6 +1662,10 @@ static int get_file_info( const char *path, struct stat *st, ULONG *attr )
|
||||
free( parent_path );
|
||||
}
|
||||
*attr |= get_file_attributes( st );
|
||||
@@ -44,7 +46,7 @@ index 73d4cce90ae..b790cde3f90 100644
|
||||
len = xattr_get( path, SAMBA_XATTR_DOS_ATTRIB, hexattr, sizeof(hexattr)-1 );
|
||||
if (len == -1) return ret;
|
||||
*attr |= get_file_xattr( hexattr, len );
|
||||
@@ -2186,11 +2190,6 @@ static NTSTATUS get_dir_data_entry( struct dir_data *dir_data, void *info_ptr, I
|
||||
@@ -2228,11 +2232,6 @@ static NTSTATUS get_dir_data_entry( struct dir_data *dir_data, void *info_ptr, I
|
||||
if (class != FileNamesInformation)
|
||||
{
|
||||
if (st.st_dev != dir_data->id.dev) st.st_ino = 0; /* ignore inode if on a different device */
|
||||
@@ -56,7 +58,7 @@ index 73d4cce90ae..b790cde3f90 100644
|
||||
fill_file_info( &st, attributes, info, class );
|
||||
}
|
||||
|
||||
@@ -4106,7 +4105,6 @@ NTSTATUS WINAPI NtQueryFullAttributesFile( const OBJECT_ATTRIBUTES *attr,
|
||||
@@ -4196,7 +4195,6 @@ NTSTATUS WINAPI NtQueryFullAttributesFile( const OBJECT_ATTRIBUTES *attr,
|
||||
info->AllocationSize = std.AllocationSize;
|
||||
info->EndOfFile = std.EndOfFile;
|
||||
info->FileAttributes = basic.FileAttributes;
|
||||
@@ -64,7 +66,7 @@ index 73d4cce90ae..b790cde3f90 100644
|
||||
}
|
||||
free( unix_name );
|
||||
}
|
||||
@@ -4133,10 +4131,7 @@ NTSTATUS WINAPI NtQueryAttributesFile( const OBJECT_ATTRIBUTES *attr, FILE_BASIC
|
||||
@@ -4227,10 +4225,7 @@ NTSTATUS WINAPI NtQueryAttributesFile( const OBJECT_ATTRIBUTES *attr, FILE_BASIC
|
||||
else if (!S_ISREG(st.st_mode) && !S_ISDIR(st.st_mode))
|
||||
status = STATUS_INVALID_INFO_CLASS;
|
||||
else
|
||||
@@ -76,5 +78,5 @@ index 73d4cce90ae..b790cde3f90 100644
|
||||
}
|
||||
else WARN( "%s not found (%x)\n", debugstr_us(attr->ObjectName), status );
|
||||
--
|
||||
2.30.2
|
||||
2.37.2
|
||||
|
||||
|
@@ -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 5a529bea97ee22d51f07f9d3cd77c00ea5292878 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.
|
||||
@@ -7,18 +7,16 @@ Signed-off-by: Erich E. Hoover <erich.e.hoover@gmail.com>
|
||||
---
|
||||
configure.ac | 2 +
|
||||
dlls/ntdll/Makefile.in | 2 +-
|
||||
dlls/ntdll/tests/file.c | 152 ++++++++++++++++++++
|
||||
dlls/ntdll/unix/file.c | 300 ++++++++++++++++++++++++++++++++++++++++
|
||||
dlls/ntdll/tests/file.c | 159 ++++++++++++++++++---
|
||||
dlls/ntdll/unix/file.c | 302 ++++++++++++++++++++++++++++++++++++++++
|
||||
include/Makefile.in | 1 +
|
||||
include/ntifs.h | 42 ++++++
|
||||
6 files changed, 498 insertions(+), 1 deletion(-)
|
||||
create mode 100644 include/ntifs.h
|
||||
5 files changed, 447 insertions(+), 19 deletions(-)
|
||||
|
||||
diff --git a/configure.ac b/configure.ac
|
||||
index 3ea4c2afe0a..d0ec1d837c3 100644
|
||||
index 628cce28815..2adf40c0ef1 100644
|
||||
--- a/configure.ac
|
||||
+++ b/configure.ac
|
||||
@@ -2030,6 +2030,8 @@ AC_CHECK_FUNCS(\
|
||||
@@ -2018,6 +2018,8 @@ AC_CHECK_FUNCS(\
|
||||
prctl \
|
||||
proc_pidinfo \
|
||||
sched_yield \
|
||||
@@ -41,7 +39,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 98d9e6b3b0a..93e50bd6952 100644
|
||||
--- a/dlls/ntdll/tests/file.c
|
||||
+++ b/dlls/ntdll/tests/file.c
|
||||
@@ -38,6 +38,7 @@
|
||||
@@ -52,7 +50,7 @@ index 4b142f241e5..5f6cb223951 100644
|
||||
|
||||
#ifndef IO_COMPLETION_ALL_ACCESS
|
||||
#define IO_COMPLETION_ALL_ACCESS 0x001F0003
|
||||
@@ -5326,6 +5327,156 @@ static void test_mailslot_name(void)
|
||||
@@ -5326,32 +5327,154 @@ static void test_mailslot_name(void)
|
||||
CloseHandle( device );
|
||||
}
|
||||
|
||||
@@ -82,8 +80,12 @@ index 4b142f241e5..5f6cb223951 100644
|
||||
+ return buffer_size;
|
||||
+}
|
||||
+
|
||||
+static void test_reparse_points(void)
|
||||
+{
|
||||
static void test_reparse_points(void)
|
||||
{
|
||||
- OBJECT_ATTRIBUTES attr;
|
||||
- HANDLE handle;
|
||||
- IO_STATUS_BLOCK io;
|
||||
- NTSTATUS status;
|
||||
+ WCHAR path[MAX_PATH], reparse_path[MAX_PATH], target_path[MAX_PATH], volnameW[MAX_PATH];
|
||||
+ static const WCHAR reparseW[] = {'\\','r','e','p','a','r','s','e',0};
|
||||
+ static const WCHAR targetW[] = {'\\','t','a','r','g','e','t',0};
|
||||
@@ -93,7 +95,8 @@ index 4b142f241e5..5f6cb223951 100644
|
||||
+ static const WCHAR dotW[] = {'.',0};
|
||||
+ REPARSE_DATA_BUFFER *buffer = NULL;
|
||||
+ DWORD dwret, dwLen, dwFlags;
|
||||
+ UNICODE_STRING nameW;
|
||||
UNICODE_STRING nameW;
|
||||
- unsigned char reparse_data[1];
|
||||
+ WCHAR *long_path;
|
||||
+ INT buffer_len;
|
||||
+ HANDLE handle;
|
||||
@@ -130,7 +133,9 @@ index 4b142f241e5..5f6cb223951 100644
|
||||
+ lstrcatW(reparse_path, reparseW);
|
||||
+ bret = CreateDirectoryW(reparse_path, NULL);
|
||||
+ ok(bret, "Failed to create junction point directory.\n");
|
||||
+
|
||||
|
||||
- pRtlInitUnicodeString( &nameW, L"\\??\\C:\\" );
|
||||
- InitializeObjectAttributes( &attr, &nameW, 0, NULL, NULL );
|
||||
+ /* Create a destination folder for the junction point to target */
|
||||
+ lstrcpyW(target_path, path);
|
||||
+ for (int i=0; i<1; i++)
|
||||
@@ -142,7 +147,9 @@ index 4b142f241e5..5f6cb223951 100644
|
||||
+ bret = CreateDirectoryW(target_path, NULL);
|
||||
+ ok(bret, "Failed to create junction point target directory.\n");
|
||||
+ pRtlDosPathNameToNtPathName_U(path, &nameW, NULL, NULL);
|
||||
+
|
||||
|
||||
- status = pNtOpenFile( &handle, READ_CONTROL, &attr, &io, 0, 0 );
|
||||
- ok( !status, "open %s failed %#lx\n", wine_dbgstr_w(nameW.Buffer), status );
|
||||
+ /* construct a too long pathname (resulting reparse buffer over 16 kiB limit) */
|
||||
+ long_path = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, 32767);
|
||||
+ lstrcpyW(long_path, nameW.Buffer);
|
||||
@@ -166,7 +173,9 @@ index 4b142f241e5..5f6cb223951 100644
|
||||
+ ok(!bret && GetLastError()==ERROR_INVALID_REPARSE_DATA, "Unexpected error (0x%lx)\n", GetLastError());
|
||||
+ HeapFree(GetProcessHeap(), 0, buffer);
|
||||
+ CloseHandle(handle);
|
||||
+
|
||||
|
||||
- status = pNtFsControlFile( handle, NULL, NULL, NULL, &io, FSCTL_GET_REPARSE_POINT, NULL, 0, NULL, 0 );
|
||||
- ok( status == STATUS_INVALID_USER_BUFFER, "expected %#lx, got %#lx\n", STATUS_INVALID_USER_BUFFER, status );
|
||||
+ /* construct a long pathname to demonstrate correct behavior with very large reparse points */
|
||||
+ pRtlDosPathNameToNtPathName_U(path, &nameW, NULL, NULL);
|
||||
+ lstrcpyW(long_path, nameW.Buffer);
|
||||
@@ -176,11 +185,16 @@ index 4b142f241e5..5f6cb223951 100644
|
||||
+ lstrcatW(long_path, path);
|
||||
+ }
|
||||
+ lstrcatW(long_path, targetW);
|
||||
+
|
||||
|
||||
- status = pNtFsControlFile( handle, NULL, NULL, NULL, &io, FSCTL_GET_REPARSE_POINT, NULL, 0, reparse_data, 0 );
|
||||
- ok( status == STATUS_INVALID_USER_BUFFER, "expected %#lx, got %#lx\n", STATUS_INVALID_USER_BUFFER, status );
|
||||
+ /* use a sane (not obscenely long) target for the rest of testing */
|
||||
+ pRtlFreeUnicodeString(&nameW);
|
||||
+ pRtlDosPathNameToNtPathName_U(target_path, &nameW, NULL, NULL);
|
||||
+
|
||||
|
||||
- /* a volume cannot be a reparse point by definition */
|
||||
- status = pNtFsControlFile( handle, NULL, NULL, NULL, &io, FSCTL_GET_REPARSE_POINT, NULL, 0, reparse_data, 1 );
|
||||
- ok( status == STATUS_NOT_A_REPARSE_POINT, "expected %#lx, got %#lx\n", STATUS_NOT_A_REPARSE_POINT, status );
|
||||
+ /* Create the junction point */
|
||||
+ handle = CreateFileW(reparse_path, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING,
|
||||
+ FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OPEN_REPARSE_POINT, 0);
|
||||
@@ -193,7 +207,8 @@ index 4b142f241e5..5f6cb223951 100644
|
||||
+ bret = DeviceIoControl(handle, FSCTL_SET_REPARSE_POINT, (LPVOID)buffer, buffer_len, NULL, 0, &dwret, 0);
|
||||
+ ok(bret, "Failed to create junction point! (0x%lx)\n", GetLastError());
|
||||
+ CloseHandle(handle);
|
||||
+
|
||||
|
||||
- CloseHandle( handle );
|
||||
+cleanup:
|
||||
+ /* Cleanup */
|
||||
+ pRtlFreeUnicodeString(&nameW);
|
||||
@@ -204,32 +219,31 @@ index 4b142f241e5..5f6cb223951 100644
|
||||
+ bret = RemoveDirectoryW(target_path);
|
||||
+ ok(bret, "Failed to remove temporary target directory!\n");
|
||||
+ RemoveDirectoryW(path);
|
||||
+}
|
||||
+
|
||||
}
|
||||
|
||||
START_TEST(file)
|
||||
{
|
||||
HMODULE hkernel32 = GetModuleHandleA("kernel32.dll");
|
||||
@@ -5398,5 +5549,6 @@ START_TEST(file)
|
||||
@@ -5426,6 +5549,6 @@ START_TEST(file)
|
||||
test_ioctl();
|
||||
test_query_ea();
|
||||
test_flush_buffers_file();
|
||||
+ test_reparse_points();
|
||||
test_mailslot_name();
|
||||
- test_mailslot_name();
|
||||
test_reparse_points();
|
||||
+ test_mailslot_name();
|
||||
}
|
||||
diff --git a/dlls/ntdll/unix/file.c b/dlls/ntdll/unix/file.c
|
||||
index d103e3195b5..3fb4ded846c 100644
|
||||
index 6b73d9dc7e8..52b85cfc6d1 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 +251,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 +264,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;
|
||||
|
||||
@@ -325,7 +339,7 @@ index d103e3195b5..3fb4ded846c 100644
|
||||
+}
|
||||
+
|
||||
+/* create a directory and all the needed parent directories */
|
||||
+static int mkdir_p(const char *path, mode_t mode)
|
||||
+static int mkdir_p( int dirfd, const char *path, mode_t mode )
|
||||
+{
|
||||
+ char path_tmp[PATH_MAX], *p;
|
||||
+
|
||||
@@ -333,12 +347,12 @@ index d103e3195b5..3fb4ded846c 100644
|
||||
+ for (p = path_tmp + 1; *p; p++) {
|
||||
+ if (*p == '/') {
|
||||
+ *p = '\0';
|
||||
+ if (mkdir(path_tmp, mode) != 0 && errno != EEXIST)
|
||||
+ if (mkdirat( dirfd, path_tmp, mode ) != 0 && errno != EEXIST)
|
||||
+ return -1;
|
||||
+ *p = '/';
|
||||
+ }
|
||||
+ }
|
||||
+ if (mkdir(path_tmp, mode) != 0 && errno != EEXIST)
|
||||
+ if (mkdirat( dirfd, path_tmp, mode ) != 0 && errno != EEXIST)
|
||||
+ return -1;
|
||||
+ return 0;
|
||||
+}
|
||||
@@ -346,7 +360,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 +389,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:
|
||||
@@ -3313,6 +3433,181 @@ done:
|
||||
}
|
||||
|
||||
|
||||
@@ -386,13 +400,14 @@ index d103e3195b5..3fb4ded846c 100644
|
||||
+NTSTATUS create_reparse_point(HANDLE handle, REPARSE_DATA_BUFFER *buffer)
|
||||
+{
|
||||
+ int buffer_len = buffer->ReparseDataLength+FIELD_OFFSET(typeof(*buffer), GenericReparseBuffer);
|
||||
+ char target_path[PATH_MAX], link_path[PATH_MAX], link_dir[PATH_MAX], original_dir[PATH_MAX];
|
||||
+ char target_path[PATH_MAX], link_path[PATH_MAX], link_dir[PATH_MAX];
|
||||
+ int encoded_len = (int)ceil(buffer_len*4/3.0) + 1, chunk_len;
|
||||
+ char tmpdir[PATH_MAX], tmplink[PATH_MAX], *d;
|
||||
+ BOOL needs_close, tempdir_created = FALSE;
|
||||
+ char filename_buf[PATH_MAX], *filename;
|
||||
+ char *unix_src = NULL, *encoded = NULL;
|
||||
+ int i = 0, j = 0, depth = 0, fd;
|
||||
+ int link_dir_fd = -1;
|
||||
+ NTSTATUS status;
|
||||
+ struct stat st;
|
||||
+ BOOL is_dir;
|
||||
@@ -469,14 +484,15 @@ index d103e3195b5..3fb4ded846c 100644
|
||||
+ }
|
||||
+
|
||||
+ /* change to the link folder so that we can build any necessary additional data */
|
||||
+ getcwd( original_dir, PATH_MAX );
|
||||
+ strcpy( link_dir, tmpdir );
|
||||
+ link_dir[strlen(link_dir)-16] = 0;
|
||||
+ chdir( link_dir );
|
||||
+ link_dir_fd = open( link_dir, O_RDONLY|O_DIRECTORY );
|
||||
+
|
||||
+ /* If there is any further information in the reparse tag then store it in the hidden folder */
|
||||
+ while(i < encoded_len)
|
||||
+ {
|
||||
+ int fd;
|
||||
+
|
||||
+ j++;
|
||||
+ strcpy( link_path, target_path );
|
||||
+
|
||||
@@ -495,22 +511,21 @@ index d103e3195b5..3fb4ded846c 100644
|
||||
+
|
||||
+ strcpy( link_dir, link_path );
|
||||
+ link_dir[strlen(link_dir)-1] = 0;
|
||||
+ if (mkdir_p( link_dir, 0777))
|
||||
+ if (mkdir_p( link_dir_fd, link_dir, 0777))
|
||||
+ {
|
||||
+ status = errno_to_status( errno );
|
||||
+ goto cleanup;
|
||||
+ }
|
||||
+ if (symlink( target_path, link_path ))
|
||||
+ if (symlinkat( target_path, link_dir_fd, link_path ))
|
||||
+ {
|
||||
+ status = errno_to_status( errno );
|
||||
+ goto cleanup;
|
||||
+ }
|
||||
+ chdir( link_dir );
|
||||
+ fd = openat( link_dir_fd, link_dir, O_RDONLY|O_DIRECTORY );
|
||||
+ close( link_dir_fd );
|
||||
+ link_dir_fd = fd;
|
||||
+ }
|
||||
+
|
||||
+ /* revert to the original directory */
|
||||
+ chdir( original_dir );
|
||||
+
|
||||
+ /* Atomically move the initial link into position */
|
||||
+ if (!renameat2( -1, tmplink, -1, unix_src, RENAME_EXCHANGE ))
|
||||
+ {
|
||||
@@ -543,6 +558,7 @@ index d103e3195b5..3fb4ded846c 100644
|
||||
+ status = STATUS_SUCCESS;
|
||||
+
|
||||
+cleanup:
|
||||
+ if (link_dir_fd != -1) close( link_dir_fd );
|
||||
+ if (tempdir_created) rmdir( tmpdir );
|
||||
+ if (needs_close) close( fd );
|
||||
+ free( unix_src );
|
||||
@@ -555,7 +571,7 @@ index d103e3195b5..3fb4ded846c 100644
|
||||
/******************************************************************************
|
||||
* lookup_unix_name
|
||||
*
|
||||
@@ -6060,6 +6353,13 @@ NTSTATUS WINAPI NtFsControlFile( HANDLE handle, HANDLE event, PIO_APC_ROUTINE ap
|
||||
@@ -6072,6 +6367,13 @@ NTSTATUS WINAPI NtFsControlFile( HANDLE handle, HANDLE event, PIO_APC_ROUTINE ap
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -570,7 +586,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 = \
|
||||
@@ -581,54 +597,6 @@ index 70134a7bcb7..bdddf5426fe 100644
|
||||
ntlsa.h \
|
||||
ntquery.h \
|
||||
ntsecapi.h \
|
||||
diff --git a/include/ntifs.h b/include/ntifs.h
|
||||
new file mode 100644
|
||||
index 00000000000..21d42e17325
|
||||
--- /dev/null
|
||||
+++ b/include/ntifs.h
|
||||
@@ -0,0 +1,42 @@
|
||||
+/*
|
||||
+ * Win32 definitions for Windows NT
|
||||
+ *
|
||||
+ * Copyright 2012 Erich E. Hoover
|
||||
+ *
|
||||
+ * This library is free software; you can redistribute it and/or
|
||||
+ * modify it under the terms of the GNU Lesser General Public
|
||||
+ * License as published by the Free Software Foundation; either
|
||||
+ * version 2.1 of the License, or (at your option) any later version.
|
||||
+ *
|
||||
+ * This library is distributed in the hope that it will be useful,
|
||||
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
+ * Lesser General Public License for more details.
|
||||
+ *
|
||||
+ * You should have received a copy of the GNU Lesser General Public
|
||||
+ * License along with this library; if not, write to the Free Software
|
||||
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
||||
+ */
|
||||
+
|
||||
+#ifndef __WINE_NTIFS_H
|
||||
+#define __WINE_NTIFS_H
|
||||
+
|
||||
+typedef struct _REPARSE_DATA_BUFFER {
|
||||
+ ULONG ReparseTag;
|
||||
+ USHORT ReparseDataLength;
|
||||
+ USHORT Reserved;
|
||||
+ union {
|
||||
+ struct {
|
||||
+ USHORT SubstituteNameOffset;
|
||||
+ USHORT SubstituteNameLength;
|
||||
+ USHORT PrintNameOffset;
|
||||
+ USHORT PrintNameLength;
|
||||
+ WCHAR PathBuffer[1];
|
||||
+ } MountPointReparseBuffer;
|
||||
+ struct {
|
||||
+ UCHAR DataBuffer[1];
|
||||
+ } GenericReparseBuffer;
|
||||
+ };
|
||||
+} REPARSE_DATA_BUFFER, *PREPARSE_DATA_BUFFER;
|
||||
+
|
||||
+#endif /* __WINE_NTIFS_H */
|
||||
--
|
||||
2.35.1
|
||||
2.37.2
|
||||
|
||||
|
@@ -1,4 +1,4 @@
|
||||
From ded223a1f564442c26860d9e708b963710ecea21 Mon Sep 17 00:00:00 2001
|
||||
From 801191c93bc6780ee726727c82c0e0b696e300ef 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: [PATCH] ntdll: Add support for reading reparse points.
|
||||
@@ -6,14 +6,14 @@ Subject: [PATCH] ntdll: Add support for reading reparse points.
|
||||
Signed-off-by: Erich E. Hoover <erich.e.hoover@gmail.com>
|
||||
---
|
||||
dlls/ntdll/tests/file.c | 21 +++-
|
||||
dlls/ntdll/unix/file.c | 209 ++++++++++++++++++++++++++++++++++++++++
|
||||
2 files changed, 228 insertions(+), 2 deletions(-)
|
||||
dlls/ntdll/unix/file.c | 222 ++++++++++++++++++++++++++++++++++++++--
|
||||
2 files changed, 231 insertions(+), 12 deletions(-)
|
||||
|
||||
diff --git a/dlls/ntdll/tests/file.c b/dlls/ntdll/tests/file.c
|
||||
index 5f6cb223951..33e49793319 100644
|
||||
index 17da7552046..b9ec79e37e0 100644
|
||||
--- a/dlls/ntdll/tests/file.c
|
||||
+++ b/dlls/ntdll/tests/file.c
|
||||
@@ -5359,14 +5359,14 @@ static void test_reparse_points(void)
|
||||
@@ -5387,14 +5387,14 @@ static void test_reparse_points(void)
|
||||
static const WCHAR reparseW[] = {'\\','r','e','p','a','r','s','e',0};
|
||||
static const WCHAR targetW[] = {'\\','t','a','r','g','e','t',0};
|
||||
static const WCHAR parentW[] = {'\\','.','.','\\',0};
|
||||
@@ -30,7 +30,7 @@ index 5f6cb223951..33e49793319 100644
|
||||
HANDLE handle;
|
||||
BOOL bret;
|
||||
|
||||
@@ -5463,6 +5463,23 @@ static void test_reparse_points(void)
|
||||
@@ -5491,6 +5491,23 @@ static void test_reparse_points(void)
|
||||
buffer_len = build_reparse_buffer(long_path, &buffer);
|
||||
bret = DeviceIoControl(handle, FSCTL_SET_REPARSE_POINT, (LPVOID)buffer, buffer_len, NULL, 0, &dwret, 0);
|
||||
ok(bret, "Failed to create junction point! (0x%lx)\n", GetLastError());
|
||||
@@ -55,10 +55,10 @@ index 5f6cb223951..33e49793319 100644
|
||||
|
||||
cleanup:
|
||||
diff --git a/dlls/ntdll/unix/file.c b/dlls/ntdll/unix/file.c
|
||||
index 3fb4ded846c..3a1489c35d0 100644
|
||||
index 52b85cfc6d1..0967b3b9392 100644
|
||||
--- a/dlls/ntdll/unix/file.c
|
||||
+++ b/dlls/ntdll/unix/file.c
|
||||
@@ -318,6 +318,84 @@ static UINT encode_base64url( const char *bin, unsigned int len, char *base64 )
|
||||
@@ -315,6 +315,84 @@ static UINT encode_base64url( const char *bin, unsigned int len, char *base64 )
|
||||
return n;
|
||||
}
|
||||
|
||||
@@ -141,9 +141,9 @@ index 3fb4ded846c..3a1489c35d0 100644
|
||||
+}
|
||||
+
|
||||
/* create a directory and all the needed parent directories */
|
||||
static int mkdir_p(const char *path, mode_t mode)
|
||||
static int mkdir_p( int dirfd, const char *path, mode_t mode )
|
||||
{
|
||||
@@ -3606,6 +3684,129 @@ cleanup:
|
||||
@@ -3608,6 +3686,132 @@ cleanup:
|
||||
}
|
||||
|
||||
|
||||
@@ -153,21 +153,22 @@ index 3fb4ded846c..3a1489c35d0 100644
|
||||
+ */
|
||||
+NTSTATUS get_reparse_point(HANDLE handle, REPARSE_DATA_BUFFER *buffer, ULONG *size)
|
||||
+{
|
||||
+ char link_dir[PATH_MAX], original_dir[PATH_MAX], *d;
|
||||
+ char link_dir[PATH_MAX], link_path[PATH_MAX], *d;
|
||||
+ int link_path_len, buffer_len, encoded_len;
|
||||
+ char *unix_src, link_path[PATH_MAX];
|
||||
+ REPARSE_DATA_BUFFER header;
|
||||
+ ULONG out_size = *size;
|
||||
+ char *unix_name = NULL;
|
||||
+ char *encoded = NULL;
|
||||
+ int link_dir_fd = -1;
|
||||
+ NTSTATUS status;
|
||||
+ ssize_t ret;
|
||||
+ int depth;
|
||||
+ char *p;
|
||||
+
|
||||
+ if ((status = server_get_unix_name( handle, &unix_src )))
|
||||
+ if ((status = server_get_unix_name( handle, &unix_name )))
|
||||
+ goto cleanup;
|
||||
+
|
||||
+ ret = readlink( unix_src, link_path, sizeof(link_path) );
|
||||
+ ret = readlink( unix_name, link_path, sizeof(link_path) );
|
||||
+ if (ret < 0)
|
||||
+ {
|
||||
+ status = errno_to_status( errno );
|
||||
@@ -175,7 +176,7 @@ index 3fb4ded846c..3a1489c35d0 100644
|
||||
+ }
|
||||
+ link_path_len = ret;
|
||||
+ link_path[link_path_len] = 0;
|
||||
+ if (strncmp( link_path, ".REPARSE_POINT/", 15) != 0)
|
||||
+ if (strncmp( link_path, ".REPARSE_POINT/", 15 ) != 0)
|
||||
+ {
|
||||
+ status = STATUS_NOT_IMPLEMENTED;
|
||||
+ goto cleanup;
|
||||
@@ -214,8 +215,8 @@ index 3fb4ded846c..3a1489c35d0 100644
|
||||
+ status = STATUS_BUFFER_TOO_SMALL;
|
||||
+ goto cleanup;
|
||||
+ }
|
||||
+ encoded_len = (int)ceil(buffer_len*4/3.0) + 1;
|
||||
+ encoded = realloc( encoded, encoded_len );
|
||||
+ encoded_len = (int)ceil(buffer_len*4/3.0);
|
||||
+ encoded = realloc( encoded, encoded_len + 3 ); /* 3 chars = slash, chunk ID, NUL character */
|
||||
+ if (!encoded)
|
||||
+ {
|
||||
+ status = STATUS_NO_MEMORY;
|
||||
@@ -223,24 +224,25 @@ index 3fb4ded846c..3a1489c35d0 100644
|
||||
+ }
|
||||
+
|
||||
+ /* change to the link folder so that we can build any necessary additional data */
|
||||
+ getcwd( original_dir, PATH_MAX );
|
||||
+ strcpy( link_dir, unix_src );
|
||||
+ strcpy( link_dir, unix_name );
|
||||
+ d = dirname( link_dir);
|
||||
+ if (d != link_dir) strcpy( link_dir, d );
|
||||
+ chdir( link_dir );
|
||||
+ link_dir_fd = open( link_dir, O_RDONLY|O_DIRECTORY );
|
||||
+
|
||||
+ /* Copy the encoded data from the follow on symlinks */
|
||||
+ while(strlen(encoded) < encoded_len-1)
|
||||
+ while(strlen(encoded) < encoded_len)
|
||||
+ {
|
||||
+ int fd;
|
||||
+
|
||||
+ strcpy( link_dir, link_path );
|
||||
+ ret = readlink( link_dir, link_path, sizeof(link_path) );
|
||||
+ ret = readlinkat( link_dir_fd, link_dir, link_path, sizeof(link_path) );
|
||||
+ if (ret < 0)
|
||||
+ {
|
||||
+ status = errno_to_status( errno );
|
||||
+ goto cleanup;
|
||||
+ }
|
||||
+ link_path_len = ret;
|
||||
+ link_path[link_path_len] = 0;
|
||||
+ link_path[link_path_len] = 0; /* readlink does not NUL terminate */
|
||||
+
|
||||
+ p = &link_path[3*depth];
|
||||
+ for (depth=0; p < link_path + link_path_len; p += NAME_MAX+1, depth++)
|
||||
@@ -249,12 +251,11 @@ index 3fb4ded846c..3a1489c35d0 100644
|
||||
+ encoded[strlen(encoded)-1] = 0; /* final slash */
|
||||
+
|
||||
+ link_dir[strlen(link_dir)-1] = 0;
|
||||
+ chdir( link_dir );
|
||||
+ fd = openat( link_dir_fd, link_dir, O_RDONLY|O_DIRECTORY );
|
||||
+ close( link_dir_fd );
|
||||
+ link_dir_fd = fd;
|
||||
+ }
|
||||
+
|
||||
+ /* revert to the original directory */
|
||||
+ chdir( original_dir );
|
||||
+
|
||||
+ /* Decode the reparse buffer from the base64-encoded symlink data */
|
||||
+ *size = decode_base64url( encoded, strlen(encoded), (char*)buffer );
|
||||
+ status = STATUS_SUCCESS;
|
||||
@@ -265,6 +266,8 @@ index 3fb4ded846c..3a1489c35d0 100644
|
||||
+ }
|
||||
+
|
||||
+cleanup:
|
||||
+ if (link_dir_fd != -1) close( link_dir_fd );
|
||||
+ free( unix_name );
|
||||
+ free( encoded );
|
||||
+ return status;
|
||||
+}
|
||||
@@ -273,7 +276,24 @@ index 3fb4ded846c..3a1489c35d0 100644
|
||||
/******************************************************************************
|
||||
* lookup_unix_name
|
||||
*
|
||||
@@ -6353,6 +6554,14 @@ NTSTATUS WINAPI NtFsControlFile( HANDLE handle, HANDLE event, PIO_APC_ROUTINE ap
|
||||
@@ -6335,16 +6539,6 @@ NTSTATUS WINAPI NtFsControlFile( HANDLE handle, HANDLE event, PIO_APC_ROUTINE ap
|
||||
break;
|
||||
}
|
||||
|
||||
- case FSCTL_GET_REPARSE_POINT:
|
||||
- io->Information = 0;
|
||||
- if (out_buffer && out_size)
|
||||
- {
|
||||
- FIXME("FSCTL_GET_REPARSE_POINT semi-stub\n");
|
||||
- status = STATUS_NOT_A_REPARSE_POINT;
|
||||
- }
|
||||
- else status = STATUS_INVALID_USER_BUFFER;
|
||||
- break;
|
||||
-
|
||||
case FSCTL_GET_OBJECT_ID:
|
||||
{
|
||||
FILE_OBJECTID_BUFFER *info = out_buffer;
|
||||
@@ -6367,6 +6561,14 @@ NTSTATUS WINAPI NtFsControlFile( HANDLE handle, HANDLE event, PIO_APC_ROUTINE ap
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -289,5 +309,5 @@ index 3fb4ded846c..3a1489c35d0 100644
|
||||
{
|
||||
REPARSE_DATA_BUFFER *buffer = (REPARSE_DATA_BUFFER *)in_buffer;
|
||||
--
|
||||
2.35.1
|
||||
2.37.2
|
||||
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user