mirror of
https://gitlab.winehq.org/wine/wine-staging.git
synced 2025-01-28 22:04:43 -08:00
ntdll-User_Shared_Data: Replace with new wineserver-based implementation.
This commit is contained in:
parent
169c49055d
commit
4e6a477acd
@ -1,4 +1,4 @@
|
||||
From 43baedbee4f25d88f8af30c216b888f5161e62df Mon Sep 17 00:00:00 2001
|
||||
From f75d03835dd04b2838a2cdcde64346efc26e9972 Mon Sep 17 00:00:00 2001
|
||||
From: Zebediah Figura <z.figura12@gmail.com>
|
||||
Date: Thu, 7 Jun 2018 20:29:21 -0500
|
||||
Subject: [PATCH] ntdll: Create eventfd-based objects for semaphores.
|
||||
@ -16,10 +16,10 @@ This patch break things, of course. That is fine. Its purpose is to prevent a Ma
|
||||
create mode 100644 dlls/ntdll/esync.h
|
||||
|
||||
diff --git a/dlls/ntdll/Makefile.in b/dlls/ntdll/Makefile.in
|
||||
index ed4bb94e4dc..b75e8308ac7 100644
|
||||
index 7971ef98cf0..2f26f0dc958 100644
|
||||
--- a/dlls/ntdll/Makefile.in
|
||||
+++ b/dlls/ntdll/Makefile.in
|
||||
@@ -15,6 +15,7 @@ C_SRCS = \
|
||||
@@ -17,6 +17,7 @@ C_SRCS = \
|
||||
directory.c \
|
||||
env.c \
|
||||
error.c \
|
||||
@ -213,10 +213,10 @@ index 00000000000..1a88170cfc4
|
||||
+ * "server_fd_section" or something similar. */
|
||||
+extern RTL_CRITICAL_SECTION fd_cache_section;
|
||||
diff --git a/dlls/ntdll/ntdll_misc.h b/dlls/ntdll/ntdll_misc.h
|
||||
index 11463146da0..a370256245c 100644
|
||||
index 177d4fd9e44..51c067bb8a0 100644
|
||||
--- a/dlls/ntdll/ntdll_misc.h
|
||||
+++ b/dlls/ntdll/ntdll_misc.h
|
||||
@@ -106,6 +106,7 @@ extern unsigned int server_queue_process_apc( HANDLE process, const apc_call_t *
|
||||
@@ -136,6 +136,7 @@ extern unsigned int server_queue_process_apc( HANDLE process, const apc_call_t *
|
||||
extern int server_remove_fd_from_cache( HANDLE handle ) DECLSPEC_HIDDEN;
|
||||
extern int server_get_unix_fd( HANDLE handle, unsigned int access, int *unix_fd,
|
||||
int *needs_close, enum server_fd_type *type, unsigned int *options ) DECLSPEC_HIDDEN;
|
||||
@ -225,18 +225,18 @@ index 11463146da0..a370256245c 100644
|
||||
extern NTSTATUS alloc_object_attributes( const OBJECT_ATTRIBUTES *attr, struct object_attributes **ret,
|
||||
data_size_t *ret_len ) DECLSPEC_HIDDEN;
|
||||
diff --git a/dlls/ntdll/server.c b/dlls/ntdll/server.c
|
||||
index 43dfe9303bb..46f1cae3f1f 100644
|
||||
index 973804967d1..c240bd1d9f8 100644
|
||||
--- a/dlls/ntdll/server.c
|
||||
+++ b/dlls/ntdll/server.c
|
||||
@@ -81,6 +81,7 @@
|
||||
#include "wine/server.h"
|
||||
@@ -98,6 +98,7 @@
|
||||
#include "wine/debug.h"
|
||||
#include "ntdll_misc.h"
|
||||
#include "ddk/wdm.h"
|
||||
+#include "esync.h"
|
||||
|
||||
WINE_DEFAULT_DEBUG_CHANNEL(server);
|
||||
WINE_DECLARE_DEBUG_CHANNEL(winediag);
|
||||
@@ -120,14 +121,14 @@ sigset_t server_block_set; /* signals to block during server calls */
|
||||
@@ -170,14 +171,14 @@ sigset_t server_block_set; /* signals to block during server calls */
|
||||
static int fd_socket = -1; /* socket to exchange file descriptors with the server */
|
||||
static pid_t server_pid;
|
||||
|
||||
@ -253,7 +253,7 @@ index 43dfe9303bb..46f1cae3f1f 100644
|
||||
|
||||
/* atomically exchange a 64-bit value */
|
||||
static inline LONG64 interlocked_xchg64( LONG64 *dest, LONG64 val )
|
||||
@@ -764,7 +765,7 @@ void CDECL wine_server_send_fd( int fd )
|
||||
@@ -919,7 +920,7 @@ void CDECL wine_server_send_fd( int fd )
|
||||
*
|
||||
* Receive a file descriptor passed from the server.
|
||||
*/
|
||||
@ -263,7 +263,7 @@ index 43dfe9303bb..46f1cae3f1f 100644
|
||||
struct iovec vec;
|
||||
struct msghdr msghdr;
|
||||
diff --git a/dlls/ntdll/sync.c b/dlls/ntdll/sync.c
|
||||
index 8974c7ed907..3939ce1ba78 100644
|
||||
index fbfb8f893ec..74dbde017e8 100644
|
||||
--- a/dlls/ntdll/sync.c
|
||||
+++ b/dlls/ntdll/sync.c
|
||||
@@ -59,7 +59,9 @@
|
||||
@ -276,7 +276,7 @@ index 8974c7ed907..3939ce1ba78 100644
|
||||
|
||||
WINE_DEFAULT_DEBUG_CHANNEL(sync);
|
||||
|
||||
@@ -249,6 +251,9 @@ NTSTATUS WINAPI NtCreateSemaphore( OUT PHANDLE SemaphoreHandle,
|
||||
@@ -259,6 +261,9 @@ NTSTATUS WINAPI NtCreateSemaphore( OUT PHANDLE SemaphoreHandle,
|
||||
if (MaximumCount <= 0 || InitialCount < 0 || InitialCount > MaximumCount)
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
|
||||
@ -287,5 +287,5 @@ index 8974c7ed907..3939ce1ba78 100644
|
||||
|
||||
SERVER_START_REQ( create_semaphore )
|
||||
--
|
||||
2.20.1
|
||||
2.26.2
|
||||
|
||||
|
@ -1,7 +1,7 @@
|
||||
From 7c2a302a95f6be16dbb5f6b3379e57d411a5310a Mon Sep 17 00:00:00 2001
|
||||
From ce12fa75ca18eeea3f0ec53788353d07ec683e95 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Michael=20M=C3=BCller?= <michael@fds-team.de>
|
||||
Date: Thu, 1 Jun 2017 06:04:53 +0200
|
||||
Subject: ntdll: Fix holes in ELF mappings. (v2)
|
||||
Subject: [PATCH] ntdll: Fix holes in ELF mappings. (v2)
|
||||
|
||||
Based on a patch by Andrew Wesie.
|
||||
---
|
||||
@ -10,13 +10,14 @@ Based on a patch by Andrew Wesie.
|
||||
2 files changed, 36 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/dlls/ntdll/virtual.c b/dlls/ntdll/virtual.c
|
||||
index 53db698..f1869be 100644
|
||||
index 6cb47f2cae8..2ba116c4e92 100644
|
||||
--- a/dlls/ntdll/virtual.c
|
||||
+++ b/dlls/ntdll/virtual.c
|
||||
@@ -429,6 +429,16 @@ static inline BOOL is_write_watch_range( const void *addr, size_t size )
|
||||
@@ -485,6 +485,16 @@ static inline BOOL is_write_watch_range( const void *addr, size_t size )
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************
|
||||
+/***********************************************************************
|
||||
+ * is_system_range
|
||||
+ */
|
||||
+static inline BOOL is_system_range( const void *addr, size_t size )
|
||||
@ -26,13 +27,12 @@ index 53db698..f1869be 100644
|
||||
+}
|
||||
+
|
||||
+
|
||||
+/***********************************************************************
|
||||
/***********************************************************************
|
||||
* find_view_range
|
||||
*
|
||||
* Find the first view overlapping at least part of the specified range.
|
||||
@@ -2047,6 +2057,19 @@ NTSTATUS virtual_handle_fault( LPCVOID addr, DWORD err, BOOL on_signal_stack )
|
||||
if (VIRTUAL_GetUnixProt( get_page_vprot( page )) & PROT_READ) ret = STATUS_SUCCESS;
|
||||
else update_shared_data = FALSE;
|
||||
@@ -2386,6 +2396,19 @@ NTSTATUS virtual_handle_fault( LPCVOID addr, DWORD err, BOOL on_signal_stack )
|
||||
/* ignore fault if page is writable now */
|
||||
if (VIRTUAL_GetUnixProt( get_page_vprot( page )) & PROT_WRITE) ret = STATUS_SUCCESS;
|
||||
}
|
||||
+ else if (!err && (VIRTUAL_GetUnixProt( vprot ) & PROT_READ) && is_system_range( page, page_size ))
|
||||
+ {
|
||||
@ -48,13 +48,13 @@ index 53db698..f1869be 100644
|
||||
+ set_page_vprot_bits( page, page_size, 0, VPROT_READ | VPROT_EXEC );
|
||||
+ }
|
||||
server_leave_uninterrupted_section( &csVirtual, &sigset );
|
||||
|
||||
if (update_shared_data)
|
||||
return ret;
|
||||
}
|
||||
diff --git a/dlls/psapi/tests/psapi_main.c b/dlls/psapi/tests/psapi_main.c
|
||||
index e61cf02..6e98754 100644
|
||||
index eb52fc690cf..178f5605a23 100644
|
||||
--- a/dlls/psapi/tests/psapi_main.c
|
||||
+++ b/dlls/psapi/tests/psapi_main.c
|
||||
@@ -196,6 +196,7 @@ todo_wine
|
||||
@@ -195,6 +195,7 @@ todo_wine
|
||||
static void test_GetModuleInformation(void)
|
||||
{
|
||||
HMODULE hMod = GetModuleHandleA(NULL);
|
||||
@ -62,7 +62,7 @@ index e61cf02..6e98754 100644
|
||||
MODULEINFO info;
|
||||
DWORD ret;
|
||||
|
||||
@@ -215,10 +216,21 @@ static void test_GetModuleInformation(void)
|
||||
@@ -214,10 +215,21 @@ static void test_GetModuleInformation(void)
|
||||
GetModuleInformation(hpQV, hMod, &info, sizeof(info)-1);
|
||||
ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "expected error=ERROR_INSUFFICIENT_BUFFER but got %d\n", GetLastError());
|
||||
|
||||
@ -86,5 +86,5 @@ index e61cf02..6e98754 100644
|
||||
|
||||
static BOOL check_with_margin(SIZE_T perf, SIZE_T sysperf, int margin)
|
||||
--
|
||||
2.7.4
|
||||
2.26.2
|
||||
|
||||
|
@ -1,2 +1,2 @@
|
||||
Fixes: [44650] Fix holes in ELF mappings
|
||||
Depends: ntdll-User_Shared_Data
|
||||
Depends: ntdll-WRITECOPY
|
||||
|
@ -1,79 +0,0 @@
|
||||
From cfc04e8d11f8ed0cc7a7a0097c0ae888f1222f92 Mon Sep 17 00:00:00 2001
|
||||
From: Sebastian Lackner <sebastian@fds-team.de>
|
||||
Date: Wed, 26 Nov 2014 10:46:09 +0100
|
||||
Subject: [PATCH] ntdll: Move code to update user shared data into a separate
|
||||
function.
|
||||
|
||||
---
|
||||
dlls/ntdll/ntdll.spec | 3 +++
|
||||
dlls/ntdll/thread.c | 28 +++++++++++++++++++++-------
|
||||
2 files changed, 24 insertions(+), 7 deletions(-)
|
||||
|
||||
diff --git a/dlls/ntdll/ntdll.spec b/dlls/ntdll/ntdll.spec
|
||||
index c50e83b5aa7..97cb16d4c3a 100644
|
||||
--- a/dlls/ntdll/ntdll.spec
|
||||
+++ b/dlls/ntdll/ntdll.spec
|
||||
@@ -1591,3 +1591,6 @@
|
||||
# Filesystem
|
||||
@ cdecl wine_nt_to_unix_file_name(ptr ptr long long)
|
||||
@ cdecl wine_unix_to_nt_file_name(ptr ptr)
|
||||
+
|
||||
+# User shared data
|
||||
+@ cdecl __wine_user_shared_data()
|
||||
diff --git a/dlls/ntdll/thread.c b/dlls/ntdll/thread.c
|
||||
index 78c18bc2d84..cd9cd1b9754 100644
|
||||
--- a/dlls/ntdll/thread.c
|
||||
+++ b/dlls/ntdll/thread.c
|
||||
@@ -275,7 +275,6 @@ TEB *thread_init(void)
|
||||
TEB *teb;
|
||||
void *addr;
|
||||
SIZE_T size;
|
||||
- LARGE_INTEGER now;
|
||||
NTSTATUS status;
|
||||
struct ntdll_thread_data *thread_data;
|
||||
|
||||
@@ -351,7 +350,26 @@ TEB *thread_init(void)
|
||||
init_paths();
|
||||
set_process_name( __wine_main_argc, __wine_main_argv );
|
||||
|
||||
- /* initialize time values in user_shared_data */
|
||||
+ /* initialize user_shared_data */
|
||||
+ __wine_user_shared_data();
|
||||
+ fill_cpu_info();
|
||||
+
|
||||
+ virtual_get_system_info( &sbi );
|
||||
+ user_shared_data->NumberOfPhysicalPages = sbi.MmNumberOfPhysicalPages;
|
||||
+
|
||||
+ return teb;
|
||||
+}
|
||||
+
|
||||
+
|
||||
+
|
||||
+/**************************************************************************
|
||||
+ * __wine_user_shared_data (NTDLL.@)
|
||||
+ *
|
||||
+ * Update user shared data and return the address of the structure.
|
||||
+ */
|
||||
+BYTE* CDECL __wine_user_shared_data(void)
|
||||
+{
|
||||
+ LARGE_INTEGER now;
|
||||
NtQuerySystemTime( &now );
|
||||
user_shared_data->SystemTime.LowPart = now.u.LowPart;
|
||||
user_shared_data->SystemTime.High1Time = user_shared_data->SystemTime.High2Time = now.u.HighPart;
|
||||
@@ -359,12 +377,8 @@ TEB *thread_init(void)
|
||||
user_shared_data->u.TickCount.High2Time = user_shared_data->u.TickCount.High1Time;
|
||||
user_shared_data->TickCountLowDeprecated = user_shared_data->u.TickCount.LowPart;
|
||||
user_shared_data->TickCountMultiplier = 1 << 24;
|
||||
- fill_cpu_info();
|
||||
|
||||
- virtual_get_system_info( &sbi );
|
||||
- user_shared_data->NumberOfPhysicalPages = sbi.MmNumberOfPhysicalPages;
|
||||
-
|
||||
- return teb;
|
||||
+ return (BYTE *)user_shared_data;
|
||||
}
|
||||
|
||||
BOOL read_process_memory_stats(int unix_pid, VM_COUNTERS *pvmi)
|
||||
--
|
||||
2.26.2
|
||||
|
@ -0,0 +1,132 @@
|
||||
From 69d23a66b69e6953035cfe02c4268f4bcfc0fb81 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?R=C3=A9mi=20Bernon?= <rbernon@codeweavers.com>
|
||||
Date: Thu, 30 Apr 2020 18:58:58 +0200
|
||||
Subject: [PATCH] ntdll/tests: Test user_shared_data timestamp updates.
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Signed-off-by: Rémi Bernon <rbernon@codeweavers.com>
|
||||
---
|
||||
dlls/ntdll/tests/time.c | 78 +++++++++++++++++++++++++++++++++++++++++
|
||||
1 file changed, 78 insertions(+)
|
||||
|
||||
diff --git a/dlls/ntdll/tests/time.c b/dlls/ntdll/tests/time.c
|
||||
index 5382a952d8d..fe71d4458c0 100644
|
||||
--- a/dlls/ntdll/tests/time.c
|
||||
+++ b/dlls/ntdll/tests/time.c
|
||||
@@ -18,7 +18,9 @@
|
||||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
||||
*/
|
||||
|
||||
+#define NONAMELESSUNION
|
||||
#include "ntdll_test.h"
|
||||
+#include "ddk/wdm.h"
|
||||
|
||||
#define TICKSPERSEC 10000000
|
||||
#define TICKSPERMSEC 10000
|
||||
@@ -29,6 +31,7 @@ static VOID (WINAPI *pRtlTimeFieldsToTime)( PTIME_FIELDS TimeFields, PLARGE_IN
|
||||
static NTSTATUS (WINAPI *pNtQueryPerformanceCounter)( LARGE_INTEGER *counter, LARGE_INTEGER *frequency );
|
||||
static NTSTATUS (WINAPI *pRtlQueryTimeZoneInformation)( RTL_TIME_ZONE_INFORMATION *);
|
||||
static NTSTATUS (WINAPI *pRtlQueryDynamicTimeZoneInformation)( RTL_DYNAMIC_TIME_ZONE_INFORMATION *);
|
||||
+static BOOL (WINAPI *pRtlQueryUnbiasedInterruptTime)( ULONGLONG *time );
|
||||
|
||||
static const int MonthLengths[2][12] =
|
||||
{
|
||||
@@ -153,6 +156,79 @@ static void test_RtlQueryTimeZoneInformation(void)
|
||||
wine_dbgstr_w(tzinfo.DaylightName));
|
||||
}
|
||||
|
||||
+static ULONGLONG read_ksystem_time(volatile KSYSTEM_TIME *time)
|
||||
+{
|
||||
+ ULONGLONG high, low;
|
||||
+ do
|
||||
+ {
|
||||
+ high = time->High1Time;
|
||||
+ low = time->LowPart;
|
||||
+ }
|
||||
+ while (high != time->High2Time);
|
||||
+ return high << 32 | low;
|
||||
+}
|
||||
+
|
||||
+static void test_user_shared_data_time(void)
|
||||
+{
|
||||
+ KSHARED_USER_DATA *user_shared_data = (void *)0x7ffe0000;
|
||||
+ ULONGLONG t1, t2, t3;
|
||||
+ int i = 0;
|
||||
+
|
||||
+ i = 0;
|
||||
+ do
|
||||
+ {
|
||||
+ t1 = GetTickCount();
|
||||
+ if (user_shared_data->NtMajorVersion <= 5 && user_shared_data->NtMinorVersion <= 1)
|
||||
+ t2 = ((ULONG64)user_shared_data->TickCountLowDeprecated * user_shared_data->TickCountMultiplier) >> 24;
|
||||
+ else
|
||||
+ t2 = (read_ksystem_time(&user_shared_data->u.TickCount) * user_shared_data->TickCountMultiplier) >> 24;
|
||||
+ t3 = GetTickCount();
|
||||
+ } while(t3 < t1 && i++ < 1); /* allow for wrap, but only once */
|
||||
+
|
||||
+ ok(t1 <= t2, "USD TickCount / GetTickCount are out of order: %s %s\n",
|
||||
+ wine_dbgstr_longlong(t1), wine_dbgstr_longlong(t2));
|
||||
+ todo_wine
|
||||
+ ok(t2 <= t3, "USD TickCount / GetTickCount are out of order: %s %s\n",
|
||||
+ wine_dbgstr_longlong(t2), wine_dbgstr_longlong(t3));
|
||||
+
|
||||
+ i = 0;
|
||||
+ do
|
||||
+ {
|
||||
+ LARGE_INTEGER system_time;
|
||||
+ NtQuerySystemTime(&system_time);
|
||||
+ t1 = system_time.QuadPart;
|
||||
+ t2 = read_ksystem_time(&user_shared_data->SystemTime);
|
||||
+ NtQuerySystemTime(&system_time);
|
||||
+ t3 = system_time.QuadPart;
|
||||
+ } while(t3 < t1 && i++ < 1); /* allow for wrap, but only once */
|
||||
+
|
||||
+ todo_wine
|
||||
+ ok(t1 <= t2, "USD SystemTime / NtQuerySystemTime are out of order %s %s\n",
|
||||
+ wine_dbgstr_longlong(t1), wine_dbgstr_longlong(t2));
|
||||
+ ok(t2 <= t3, "USD SystemTime / NtQuerySystemTime are out of order %s %s\n",
|
||||
+ wine_dbgstr_longlong(t2), wine_dbgstr_longlong(t3));
|
||||
+
|
||||
+ if (!pRtlQueryUnbiasedInterruptTime)
|
||||
+ win_skip("skipping RtlQueryUnbiasedInterruptTime tests\n");
|
||||
+ else
|
||||
+ {
|
||||
+ i = 0;
|
||||
+ do
|
||||
+ {
|
||||
+ pRtlQueryUnbiasedInterruptTime(&t1);
|
||||
+ t2 = read_ksystem_time(&user_shared_data->InterruptTime);
|
||||
+ pRtlQueryUnbiasedInterruptTime(&t3);
|
||||
+ } while(t3 < t1 && i++ < 1); /* allow for wrap, but only once */
|
||||
+
|
||||
+ todo_wine
|
||||
+ ok(t1 <= t2, "USD InterruptTime / RtlQueryUnbiasedInterruptTime are out of order %s %s\n",
|
||||
+ wine_dbgstr_longlong(t1), wine_dbgstr_longlong(t2));
|
||||
+ ok(t2 <= t3 || broken(t2 == t3 + 82410089070) /* w864 has some weird offset on testbot */,
|
||||
+ "USD InterruptTime / RtlQueryUnbiasedInterruptTime are out of order %s %s\n",
|
||||
+ wine_dbgstr_longlong(t2), wine_dbgstr_longlong(t3));
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
START_TEST(time)
|
||||
{
|
||||
HMODULE mod = GetModuleHandleA("ntdll.dll");
|
||||
@@ -163,6 +239,7 @@ START_TEST(time)
|
||||
(void *)GetProcAddress(mod, "RtlQueryTimeZoneInformation");
|
||||
pRtlQueryDynamicTimeZoneInformation =
|
||||
(void *)GetProcAddress(mod, "RtlQueryDynamicTimeZoneInformation");
|
||||
+ pRtlQueryUnbiasedInterruptTime = (void *)GetProcAddress(mod, "RtlQueryUnbiasedInterruptTime");
|
||||
|
||||
if (pRtlTimeToTimeFields && pRtlTimeFieldsToTime)
|
||||
test_pRtlTimeToTimeFields();
|
||||
@@ -170,4 +247,5 @@ START_TEST(time)
|
||||
win_skip("Required time conversion functions are not available\n");
|
||||
test_NtQueryPerformanceCounter();
|
||||
test_RtlQueryTimeZoneInformation();
|
||||
+ test_user_shared_data_time();
|
||||
}
|
||||
--
|
||||
2.26.2
|
||||
|
@ -1,76 +0,0 @@
|
||||
From 9e1ef78fd1ba5fbdd660d2d9ee735f811c65cf9a Mon Sep 17 00:00:00 2001
|
||||
From: Sebastian Lackner <sebastian@fds-team.de>
|
||||
Date: Fri, 19 Jun 2015 15:57:14 +0200
|
||||
Subject: [PATCH] ntoskrnl: Update USER_SHARED_DATA before accessing memory.
|
||||
|
||||
---
|
||||
dlls/ntoskrnl.exe/instr.c | 23 +++++------------------
|
||||
1 file changed, 5 insertions(+), 18 deletions(-)
|
||||
|
||||
diff --git a/dlls/ntoskrnl.exe/instr.c b/dlls/ntoskrnl.exe/instr.c
|
||||
index d5d197de35..68112506db 100644
|
||||
--- a/dlls/ntoskrnl.exe/instr.c
|
||||
+++ b/dlls/ntoskrnl.exe/instr.c
|
||||
@@ -484,8 +484,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(int);
|
||||
#define SIB_INDEX( sib, rex ) (((sib) >> 3) & 7) | (((rex) & REX_X) ? 8 : 0)
|
||||
#define SIB_BASE( sib, rex ) (((sib) & 7) | (((rex) & REX_B) ? 8 : 0))
|
||||
|
||||
-/* keep in sync with dlls/ntdll/thread.c:thread_init */
|
||||
-static const BYTE *wine_user_shared_data = (BYTE *)0x7ffe0000;
|
||||
+extern BYTE* CDECL __wine_user_shared_data(void);
|
||||
static const BYTE *user_shared_data = (BYTE *)0xfffff78000000000;
|
||||
|
||||
static inline DWORD64 *get_int_reg( CONTEXT *context, int index )
|
||||
@@ -595,15 +594,6 @@ static void fake_syscall_function(void)
|
||||
}
|
||||
|
||||
|
||||
-static void update_shared_data(void)
|
||||
-{
|
||||
- struct _KUSER_SHARED_DATA *shared_data = (struct _KUSER_SHARED_DATA *)wine_user_shared_data;
|
||||
-
|
||||
- shared_data->u.TickCountQuad = GetTickCount64();
|
||||
- shared_data->u.TickCount.High2Time = shared_data->u.TickCount.High1Time;
|
||||
-}
|
||||
-
|
||||
-
|
||||
/***********************************************************************
|
||||
* emulate_instruction
|
||||
*
|
||||
@@ -804,8 +794,7 @@ static DWORD emulate_instruction( EXCEPTION_RECORD *rec, CONTEXT *context )
|
||||
if (offset <= sizeof(KSHARED_USER_DATA) - data_size)
|
||||
{
|
||||
ULONGLONG temp = 0;
|
||||
- update_shared_data();
|
||||
- memcpy( &temp, wine_user_shared_data + offset, data_size );
|
||||
+ memcpy( &temp, __wine_user_shared_data() + offset, data_size );
|
||||
store_reg_word( context, instr[2], (BYTE *)&temp, long_op, rex );
|
||||
context->Rip += prefixlen + len + 2;
|
||||
return ExceptionContinueExecution;
|
||||
@@ -825,11 +814,10 @@ static DWORD emulate_instruction( EXCEPTION_RECORD *rec, CONTEXT *context )
|
||||
|
||||
if (offset <= sizeof(KSHARED_USER_DATA) - data_size)
|
||||
{
|
||||
- update_shared_data();
|
||||
switch (*instr)
|
||||
{
|
||||
- case 0x8a: store_reg_byte( context, instr[1], wine_user_shared_data + offset, rex ); break;
|
||||
- case 0x8b: store_reg_word( context, instr[1], wine_user_shared_data + offset, long_op, rex ); break;
|
||||
+ case 0x8a: store_reg_byte( context, instr[1], __wine_user_shared_data() + offset, rex ); break;
|
||||
+ case 0x8b: store_reg_word( context, instr[1], __wine_user_shared_data() + offset, long_op, rex ); break;
|
||||
}
|
||||
context->Rip += prefixlen + len + 1;
|
||||
return ExceptionContinueExecution;
|
||||
@@ -847,8 +835,7 @@ static DWORD emulate_instruction( EXCEPTION_RECORD *rec, CONTEXT *context )
|
||||
|
||||
if (offset <= sizeof(KSHARED_USER_DATA) - data_size)
|
||||
{
|
||||
- update_shared_data();
|
||||
- memcpy( &context->Rax, wine_user_shared_data + offset, data_size );
|
||||
+ memcpy( &context->Rax, __wine_user_shared_data() + offset, data_size );
|
||||
context->Rip += prefixlen + len + 1;
|
||||
return ExceptionContinueExecution;
|
||||
}
|
||||
--
|
||||
2.20.1
|
||||
|
@ -0,0 +1,349 @@
|
||||
From f87e42d852d66331469af5bc18f153f91f4c23b7 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?R=C3=A9mi=20Bernon?= <rbernon@codeweavers.com>
|
||||
Date: Thu, 30 Apr 2020 18:58:59 +0200
|
||||
Subject: [PATCH] server: Add USD support with timestamp updates.
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
The USD page is created when the first process (wineboot.exe) completes
|
||||
its creation, using its provided user_shared_data for initialization.
|
||||
|
||||
The server maps the page write-only and the clients map it read-only,
|
||||
then the server updates the timestamps every 16 ms.
|
||||
|
||||
The tests todo_wine cannot be completely removed as the read may have
|
||||
missed a server timestamp update whereas the time functions are still
|
||||
directly calling native clocks to get their values.
|
||||
|
||||
It may then be possible to implement time using USD but that would
|
||||
reduce the clocks accuracy down to the server update frequency.
|
||||
|
||||
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=29168
|
||||
Signed-off-by: Rémi Bernon <rbernon@codeweavers.com>
|
||||
---
|
||||
dlls/ntdll/ntdll_misc.h | 1 +
|
||||
dlls/ntdll/server.c | 25 ++++++++++++--
|
||||
dlls/ntdll/tests/time.c | 9 +++--
|
||||
dlls/ntdll/thread.c | 2 ++
|
||||
dlls/ntoskrnl.exe/instr.c | 12 -------
|
||||
server/file.h | 2 ++
|
||||
server/mapping.c | 69 +++++++++++++++++++++++++++++++++++++++
|
||||
server/process.c | 8 +++++
|
||||
server/protocol.def | 1 +
|
||||
9 files changed, 112 insertions(+), 17 deletions(-)
|
||||
|
||||
diff --git a/dlls/ntdll/ntdll_misc.h b/dlls/ntdll/ntdll_misc.h
|
||||
index 76e8ec284e8..0d2ef09c87b 100644
|
||||
--- a/dlls/ntdll/ntdll_misc.h
|
||||
+++ b/dlls/ntdll/ntdll_misc.h
|
||||
@@ -221,6 +221,7 @@ extern void virtual_set_large_address_space(void) DECLSPEC_HIDDEN;
|
||||
extern void virtual_fill_image_information( const pe_image_info_t *pe_info,
|
||||
SECTION_IMAGE_INFORMATION *info ) DECLSPEC_HIDDEN;
|
||||
extern struct _KUSER_SHARED_DATA *user_shared_data DECLSPEC_HIDDEN;
|
||||
+extern size_t user_shared_data_size DECLSPEC_HIDDEN;
|
||||
|
||||
/* completion */
|
||||
extern NTSTATUS NTDLL_AddCompletion( HANDLE hFile, ULONG_PTR CompletionValue,
|
||||
diff --git a/dlls/ntdll/server.c b/dlls/ntdll/server.c
|
||||
index 3832a80f1e2..1a9780e95ba 100644
|
||||
--- a/dlls/ntdll/server.c
|
||||
+++ b/dlls/ntdll/server.c
|
||||
@@ -91,6 +91,7 @@
|
||||
#include "wine/server.h"
|
||||
#include "wine/debug.h"
|
||||
#include "ntdll_misc.h"
|
||||
+#include "ddk/wdm.h"
|
||||
|
||||
WINE_DEFAULT_DEBUG_CHANNEL(server);
|
||||
|
||||
@@ -1862,8 +1863,15 @@ void server_init_process_done(void)
|
||||
PEB *peb = NtCurrentTeb()->Peb;
|
||||
IMAGE_NT_HEADERS *nt = RtlImageNtHeader( peb->ImageBaseAddress );
|
||||
void *entry = (char *)peb->ImageBaseAddress + nt->OptionalHeader.AddressOfEntryPoint;
|
||||
+ obj_handle_t usd_handle;
|
||||
NTSTATUS status;
|
||||
- int suspend;
|
||||
+ int suspend, usd_fd = -1;
|
||||
+ sigset_t old_set;
|
||||
+ SIZE_T size = user_shared_data_size;
|
||||
+ void *addr = user_shared_data;
|
||||
+ ULONG old_prot;
|
||||
+
|
||||
+ NtProtectVirtualMemory( NtCurrentProcess(), &addr, &size, PAGE_READONLY, &old_prot );
|
||||
|
||||
#ifdef __APPLE__
|
||||
send_server_task_port();
|
||||
@@ -1878,6 +1886,7 @@ void server_init_process_done(void)
|
||||
signal_init_process();
|
||||
|
||||
/* Signal the parent process to continue */
|
||||
+ pthread_sigmask( SIG_BLOCK, &server_block_set, &old_set );
|
||||
SERVER_START_REQ( init_process_done )
|
||||
{
|
||||
req->module = wine_server_client_ptr( peb->ImageBaseAddress );
|
||||
@@ -1886,10 +1895,22 @@ void server_init_process_done(void)
|
||||
#endif
|
||||
req->entry = wine_server_client_ptr( entry );
|
||||
req->gui = (nt->OptionalHeader.Subsystem != IMAGE_SUBSYSTEM_WINDOWS_CUI);
|
||||
- status = wine_server_call( req );
|
||||
+ wine_server_add_data( req, user_shared_data, sizeof(*user_shared_data) );
|
||||
+ status = server_call_unlocked( req );
|
||||
suspend = reply->suspend;
|
||||
}
|
||||
SERVER_END_REQ;
|
||||
+ if (!status) usd_fd = receive_fd( &usd_handle );
|
||||
+ pthread_sigmask( SIG_SETMASK, &old_set, NULL );
|
||||
+
|
||||
+ if (usd_fd != -1)
|
||||
+ {
|
||||
+ munmap( user_shared_data, user_shared_data_size );
|
||||
+ if (user_shared_data != mmap( user_shared_data, user_shared_data_size,
|
||||
+ PROT_READ, MAP_SHARED | MAP_FIXED, usd_fd, 0 ))
|
||||
+ fatal_error( "failed to remap the process user shared data\n" );
|
||||
+ close( usd_fd );
|
||||
+ }
|
||||
|
||||
assert( !status );
|
||||
signal_start_process( entry, suspend );
|
||||
diff --git a/dlls/ntdll/tests/time.c b/dlls/ntdll/tests/time.c
|
||||
index fe71d4458c0..7f81c20f21e 100644
|
||||
--- a/dlls/ntdll/tests/time.c
|
||||
+++ b/dlls/ntdll/tests/time.c
|
||||
@@ -185,9 +185,10 @@ static void test_user_shared_data_time(void)
|
||||
t3 = GetTickCount();
|
||||
} while(t3 < t1 && i++ < 1); /* allow for wrap, but only once */
|
||||
|
||||
+ /* FIXME: not always in order, but should be close */
|
||||
+ todo_wine_if(t1 > t2 && t1 - t2 < 50)
|
||||
ok(t1 <= t2, "USD TickCount / GetTickCount are out of order: %s %s\n",
|
||||
wine_dbgstr_longlong(t1), wine_dbgstr_longlong(t2));
|
||||
- todo_wine
|
||||
ok(t2 <= t3, "USD TickCount / GetTickCount are out of order: %s %s\n",
|
||||
wine_dbgstr_longlong(t2), wine_dbgstr_longlong(t3));
|
||||
|
||||
@@ -202,7 +203,8 @@ static void test_user_shared_data_time(void)
|
||||
t3 = system_time.QuadPart;
|
||||
} while(t3 < t1 && i++ < 1); /* allow for wrap, but only once */
|
||||
|
||||
- todo_wine
|
||||
+ /* FIXME: not always in order, but should be close */
|
||||
+ todo_wine_if(t1 > t2 && t1 - t2 < 50 * TICKSPERMSEC)
|
||||
ok(t1 <= t2, "USD SystemTime / NtQuerySystemTime are out of order %s %s\n",
|
||||
wine_dbgstr_longlong(t1), wine_dbgstr_longlong(t2));
|
||||
ok(t2 <= t3, "USD SystemTime / NtQuerySystemTime are out of order %s %s\n",
|
||||
@@ -220,7 +222,8 @@ static void test_user_shared_data_time(void)
|
||||
pRtlQueryUnbiasedInterruptTime(&t3);
|
||||
} while(t3 < t1 && i++ < 1); /* allow for wrap, but only once */
|
||||
|
||||
- todo_wine
|
||||
+ /* FIXME: not always in order, but should be close */
|
||||
+ todo_wine_if(t1 > t2 && t1 - t2 < 50 * TICKSPERMSEC)
|
||||
ok(t1 <= t2, "USD InterruptTime / RtlQueryUnbiasedInterruptTime are out of order %s %s\n",
|
||||
wine_dbgstr_longlong(t1), wine_dbgstr_longlong(t2));
|
||||
ok(t2 <= t3 || broken(t2 == t3 + 82410089070) /* w864 has some weird offset on testbot */,
|
||||
diff --git a/dlls/ntdll/thread.c b/dlls/ntdll/thread.c
|
||||
index d116c7bd571..f4da99db760 100644
|
||||
--- a/dlls/ntdll/thread.c
|
||||
+++ b/dlls/ntdll/thread.c
|
||||
@@ -56,6 +56,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(thread);
|
||||
#endif
|
||||
|
||||
struct _KUSER_SHARED_DATA *user_shared_data = NULL;
|
||||
+size_t user_shared_data_size = 0;
|
||||
static const WCHAR default_windirW[] = {'C',':','\\','w','i','n','d','o','w','s',0};
|
||||
|
||||
void (WINAPI *kernel32_start_process)(LPTHREAD_START_ROUTINE,void*) = NULL;
|
||||
@@ -244,6 +245,7 @@ TEB *thread_init(void)
|
||||
exit(1);
|
||||
}
|
||||
user_shared_data = addr;
|
||||
+ user_shared_data_size = size;
|
||||
memcpy( user_shared_data->NtSystemRoot, default_windirW, sizeof(default_windirW) );
|
||||
|
||||
/* allocate and initialize the PEB and initial TEB */
|
||||
diff --git a/dlls/ntoskrnl.exe/instr.c b/dlls/ntoskrnl.exe/instr.c
|
||||
index 77803f07d72..0973b3a80a0 100644
|
||||
--- a/dlls/ntoskrnl.exe/instr.c
|
||||
+++ b/dlls/ntoskrnl.exe/instr.c
|
||||
@@ -593,15 +593,6 @@ static void fake_syscall_function(void)
|
||||
}
|
||||
|
||||
|
||||
-static void update_shared_data(void)
|
||||
-{
|
||||
- struct _KUSER_SHARED_DATA *shared_data = (struct _KUSER_SHARED_DATA *)wine_user_shared_data;
|
||||
-
|
||||
- shared_data->u.TickCountQuad = GetTickCount64();
|
||||
- shared_data->u.TickCount.High2Time = shared_data->u.TickCount.High1Time;
|
||||
-}
|
||||
-
|
||||
-
|
||||
/***********************************************************************
|
||||
* emulate_instruction
|
||||
*
|
||||
@@ -802,7 +793,6 @@ static DWORD emulate_instruction( EXCEPTION_RECORD *rec, CONTEXT *context )
|
||||
if (offset <= sizeof(KSHARED_USER_DATA) - data_size)
|
||||
{
|
||||
ULONGLONG temp = 0;
|
||||
- update_shared_data();
|
||||
memcpy( &temp, wine_user_shared_data + offset, data_size );
|
||||
store_reg_word( context, instr[2], (BYTE *)&temp, long_op, rex );
|
||||
context->Rip += prefixlen + len + 2;
|
||||
@@ -823,7 +813,6 @@ static DWORD emulate_instruction( EXCEPTION_RECORD *rec, CONTEXT *context )
|
||||
|
||||
if (offset <= sizeof(KSHARED_USER_DATA) - data_size)
|
||||
{
|
||||
- update_shared_data();
|
||||
switch (*instr)
|
||||
{
|
||||
case 0x8a: store_reg_byte( context, instr[1], wine_user_shared_data + offset, rex ); break;
|
||||
@@ -845,7 +834,6 @@ static DWORD emulate_instruction( EXCEPTION_RECORD *rec, CONTEXT *context )
|
||||
|
||||
if (offset <= sizeof(KSHARED_USER_DATA) - data_size)
|
||||
{
|
||||
- update_shared_data();
|
||||
memcpy( &context->Rax, wine_user_shared_data + offset, data_size );
|
||||
context->Rip += prefixlen + len + 1;
|
||||
return ExceptionContinueExecution;
|
||||
diff --git a/server/file.h b/server/file.h
|
||||
index 7395814dadd..d577aaed3cf 100644
|
||||
--- a/server/file.h
|
||||
+++ b/server/file.h
|
||||
@@ -173,6 +173,8 @@ extern struct file *get_mapping_file( struct process *process, client_ptr_t base
|
||||
extern void free_mapped_views( struct process *process );
|
||||
extern int get_page_size(void);
|
||||
|
||||
+int get_user_shared_data_fd( const void *usd_init, data_size_t usd_size );
|
||||
+
|
||||
/* device functions */
|
||||
|
||||
extern struct object *create_named_pipe_device( struct object *root, const struct unicode_str *name );
|
||||
diff --git a/server/mapping.c b/server/mapping.c
|
||||
index 6990a1913d7..d73d8de9c28 100644
|
||||
--- a/server/mapping.c
|
||||
+++ b/server/mapping.c
|
||||
@@ -35,6 +35,7 @@
|
||||
#define WIN32_NO_STATUS
|
||||
#include "windef.h"
|
||||
#include "winternl.h"
|
||||
+#include "ddk/wdm.h"
|
||||
|
||||
#include "file.h"
|
||||
#include "handle.h"
|
||||
@@ -943,6 +944,74 @@ int get_page_size(void)
|
||||
return page_mask + 1;
|
||||
}
|
||||
|
||||
+static int kusd_fd;
|
||||
+static KSHARED_USER_DATA *kusd;
|
||||
+static const timeout_t kusd_timeout = 16 * -TICKS_PER_SEC / 1000;
|
||||
+
|
||||
+static void kusd_set_current_time( void *private )
|
||||
+{
|
||||
+ ULONG system_time_high = current_time >> 32;
|
||||
+ ULONG system_time_low = current_time & 0xffffffff;
|
||||
+ ULONG interrupt_time_high = monotonic_time >> 32;
|
||||
+ ULONG interrupt_time_low = monotonic_time & 0xffffffff;
|
||||
+ ULONG tick_count_high = (monotonic_time * 1000 / TICKS_PER_SEC) >> 32;
|
||||
+ ULONG tick_count_low = (monotonic_time * 1000 / TICKS_PER_SEC) & 0xffffffff;
|
||||
+ KSHARED_USER_DATA *ptr = kusd;
|
||||
+
|
||||
+ add_timeout_user( kusd_timeout, kusd_set_current_time, NULL );
|
||||
+
|
||||
+#if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 7)))
|
||||
+ __atomic_store_n(&ptr->SystemTime.High2Time, system_time_high, __ATOMIC_SEQ_CST);
|
||||
+ __atomic_store_n(&ptr->SystemTime.LowPart, system_time_low, __ATOMIC_SEQ_CST);
|
||||
+ __atomic_store_n(&ptr->SystemTime.High1Time, system_time_high, __ATOMIC_SEQ_CST);
|
||||
+
|
||||
+ __atomic_store_n(&ptr->InterruptTime.High2Time, interrupt_time_high, __ATOMIC_SEQ_CST);
|
||||
+ __atomic_store_n(&ptr->InterruptTime.LowPart, interrupt_time_low, __ATOMIC_SEQ_CST);
|
||||
+ __atomic_store_n(&ptr->InterruptTime.High1Time, interrupt_time_high, __ATOMIC_SEQ_CST);
|
||||
+
|
||||
+ __atomic_store_n(&ptr->TickCount.High2Time, tick_count_high, __ATOMIC_SEQ_CST);
|
||||
+ __atomic_store_n(&ptr->TickCount.LowPart, tick_count_low, __ATOMIC_SEQ_CST);
|
||||
+ __atomic_store_n(&ptr->TickCount.High1Time, tick_count_high, __ATOMIC_SEQ_CST);
|
||||
+ __atomic_store_n(&ptr->TickCountLowDeprecated, tick_count_low, __ATOMIC_SEQ_CST);
|
||||
+#else
|
||||
+ ptr->SystemTime.High2Time = system_time_high;
|
||||
+ ptr->SystemTime.LowPart = system_time_low;
|
||||
+ ptr->SystemTime.High1Time = system_time_high;
|
||||
+
|
||||
+ ptr->InterruptTime.High2Time = interrupt_time_high;
|
||||
+ ptr->InterruptTime.LowPart = interrupt_time_low;
|
||||
+ ptr->InterruptTime.High1Time = interrupt_time_high;
|
||||
+
|
||||
+ ptr->TickCount.High2Time = tick_count_high;
|
||||
+ ptr->TickCount.LowPart = tick_count_low;
|
||||
+ ptr->TickCount.High1Time = tick_count_high;
|
||||
+ ptr->TickCountLowDeprecated = tick_count_low;
|
||||
+#endif
|
||||
+}
|
||||
+
|
||||
+int get_user_shared_data_fd( const void *usd_init, data_size_t usd_size )
|
||||
+{
|
||||
+ /* keep it the same as user_shared_data_size in ntdll */
|
||||
+ size_t size = 0x10000;
|
||||
+
|
||||
+ if (sizeof(*kusd) != usd_size) return -1;
|
||||
+ if (kusd) return kusd_fd;
|
||||
+
|
||||
+ if ((kusd_fd = create_temp_file( size )) == -1)
|
||||
+ return -1;
|
||||
+
|
||||
+ if ((kusd = mmap( NULL, size, PROT_WRITE, MAP_SHARED, kusd_fd, 0 )) == MAP_FAILED)
|
||||
+ {
|
||||
+ close( kusd_fd );
|
||||
+ return -1;
|
||||
+ }
|
||||
+
|
||||
+ memcpy( kusd, usd_init, usd_size );
|
||||
+
|
||||
+ kusd_set_current_time( NULL );
|
||||
+ return kusd_fd;
|
||||
+}
|
||||
+
|
||||
/* create a file mapping */
|
||||
DECL_HANDLER(create_mapping)
|
||||
{
|
||||
diff --git a/server/process.c b/server/process.c
|
||||
index 211207ed03b..123dd9b28de 100644
|
||||
--- a/server/process.c
|
||||
+++ b/server/process.c
|
||||
@@ -1361,6 +1361,7 @@ DECL_HANDLER(init_process_done)
|
||||
{
|
||||
struct process_dll *dll;
|
||||
struct process *process = current->process;
|
||||
+ int usd_fd;
|
||||
|
||||
if (is_process_init_done(process))
|
||||
{
|
||||
@@ -1372,6 +1373,13 @@ DECL_HANDLER(init_process_done)
|
||||
set_error( STATUS_DLL_NOT_FOUND );
|
||||
return;
|
||||
}
|
||||
+ if ((usd_fd = get_user_shared_data_fd( get_req_data(), get_req_data_size() )) == -1)
|
||||
+ {
|
||||
+ set_error( STATUS_NO_MEMORY );
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ send_client_fd( process, usd_fd, -1 );
|
||||
|
||||
/* main exe is the first in the dll list */
|
||||
list_remove( &dll->entry );
|
||||
diff --git a/server/protocol.def b/server/protocol.def
|
||||
index 06a29b153ea..b1fe198ad04 100644
|
||||
--- a/server/protocol.def
|
||||
+++ b/server/protocol.def
|
||||
@@ -854,6 +854,7 @@ struct rawinput_device
|
||||
mod_handle_t module; /* main module base address */
|
||||
client_ptr_t ldt_copy; /* address of LDT copy (in thread address space) */
|
||||
client_ptr_t entry; /* process entry point */
|
||||
+ VARARG(usd,bytes); /* USD initialization data */
|
||||
@REPLY
|
||||
int suspend; /* is process suspended? */
|
||||
@END
|
||||
--
|
||||
2.26.2
|
||||
|
@ -1,223 +0,0 @@
|
||||
From c6b63b60eabacaff48103e6bde62866190c559f1 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Michael=20M=C3=BCller?= <michael@fds-team.de>
|
||||
Date: Fri, 5 May 2017 05:40:50 +0200
|
||||
Subject: [PATCH] ntdll: Create thread to update user_shared_data time values
|
||||
when necessary.
|
||||
|
||||
---
|
||||
dlls/ntdll/loader.c | 31 ++++++++++++++++++
|
||||
dlls/ntdll/ntdll_misc.h | 3 ++
|
||||
dlls/ntdll/thread.c | 70 ++++++++++++++++++++++++++++++++++++-----
|
||||
dlls/ntdll/virtual.c | 17 ++++++++++
|
||||
4 files changed, 113 insertions(+), 8 deletions(-)
|
||||
|
||||
diff --git a/dlls/ntdll/loader.c b/dlls/ntdll/loader.c
|
||||
index 1cf82f421a5..ff99791cefe 100644
|
||||
--- a/dlls/ntdll/loader.c
|
||||
+++ b/dlls/ntdll/loader.c
|
||||
@@ -4047,6 +4047,36 @@ PIMAGE_NT_HEADERS WINAPI RtlImageNtHeader(HMODULE hModule)
|
||||
}
|
||||
|
||||
|
||||
+/***********************************************************************
|
||||
+ * user_shared_data_init
|
||||
+ *
|
||||
+ * Initializes a user shared
|
||||
+ */
|
||||
+static void user_shared_data_init(void)
|
||||
+{
|
||||
+ void *addr = user_shared_data_external;
|
||||
+ SIZE_T data_size = page_size;
|
||||
+ ULONG old_prot;
|
||||
+
|
||||
+ /* initialize time fields */
|
||||
+ __wine_user_shared_data();
|
||||
+
|
||||
+ /* invalidate high times to prevent race conditions */
|
||||
+ user_shared_data->SystemTime.High2Time = 0;
|
||||
+ user_shared_data->SystemTime.High1Time = -1;
|
||||
+
|
||||
+ user_shared_data->InterruptTime.High2Time = 0;
|
||||
+ user_shared_data->InterruptTime.High1Time = -1;
|
||||
+
|
||||
+ user_shared_data->u.TickCount.High2Time = 0;
|
||||
+ user_shared_data->u.TickCount.High1Time = -1;
|
||||
+
|
||||
+ /* copy to correct address and make it non accessible */
|
||||
+ memcpy(user_shared_data_external, user_shared_data, sizeof(*user_shared_data));
|
||||
+ NtProtectVirtualMemory( NtCurrentProcess(), &addr, &data_size, PAGE_NOACCESS, &old_prot );
|
||||
+}
|
||||
+
|
||||
+
|
||||
/******************************************************************
|
||||
* LdrInitializeThunk (NTDLL.@)
|
||||
*
|
||||
@@ -4694,6 +4724,7 @@ void __wine_process_init(void)
|
||||
NtTerminateProcess( GetCurrentProcess(), status );
|
||||
}
|
||||
|
||||
+ user_shared_data_init();
|
||||
hidden_exports_init( wm->ldr.FullDllName.Buffer );
|
||||
|
||||
virtual_set_large_address_space();
|
||||
diff --git a/dlls/ntdll/ntdll_misc.h b/dlls/ntdll/ntdll_misc.h
|
||||
index 7aa678c79d6..1c1d6c67f28 100644
|
||||
--- a/dlls/ntdll/ntdll_misc.h
|
||||
+++ b/dlls/ntdll/ntdll_misc.h
|
||||
@@ -224,6 +224,9 @@ extern void virtual_set_large_address_space(void) DECLSPEC_HIDDEN;
|
||||
extern void virtual_fill_image_information( const pe_image_info_t *pe_info,
|
||||
SECTION_IMAGE_INFORMATION *info ) DECLSPEC_HIDDEN;
|
||||
extern struct _KUSER_SHARED_DATA *user_shared_data DECLSPEC_HIDDEN;
|
||||
+extern struct _KUSER_SHARED_DATA *user_shared_data_external DECLSPEC_HIDDEN;
|
||||
+extern void create_user_shared_data_thread(void) DECLSPEC_HIDDEN;
|
||||
+extern BYTE* CDECL __wine_user_shared_data(void);
|
||||
|
||||
/* completion */
|
||||
extern NTSTATUS NTDLL_AddCompletion( HANDLE hFile, ULONG_PTR CompletionValue,
|
||||
diff --git a/dlls/ntdll/thread.c b/dlls/ntdll/thread.c
|
||||
index 85a03013240..89174717374 100644
|
||||
--- a/dlls/ntdll/thread.c
|
||||
+++ b/dlls/ntdll/thread.c
|
||||
@@ -47,6 +47,7 @@
|
||||
#include "wine/library.h"
|
||||
#include "wine/server.h"
|
||||
#include "wine/debug.h"
|
||||
+#include "winbase.h"
|
||||
#include "ntdll_misc.h"
|
||||
#include "ddk/wdm.h"
|
||||
#include "wine/exception.h"
|
||||
@@ -57,7 +58,9 @@ WINE_DEFAULT_DEBUG_CHANNEL(thread);
|
||||
#define PTHREAD_STACK_MIN 16384
|
||||
#endif
|
||||
|
||||
-struct _KUSER_SHARED_DATA *user_shared_data = NULL;
|
||||
+static struct _KUSER_SHARED_DATA user_shared_data_internal;
|
||||
+struct _KUSER_SHARED_DATA *user_shared_data_external;
|
||||
+struct _KUSER_SHARED_DATA *user_shared_data = &user_shared_data_internal;
|
||||
static const WCHAR default_windirW[] = {'C',':','\\','w','i','n','d','o','w','s',0};
|
||||
|
||||
void (WINAPI *kernel32_start_process)(LPTHREAD_START_ROUTINE,void*) = NULL;
|
||||
@@ -291,7 +294,7 @@ TEB *thread_init(void)
|
||||
MESSAGE( "wine: failed to map the shared user data: %08x\n", status );
|
||||
exit(1);
|
||||
}
|
||||
- user_shared_data = addr;
|
||||
+ user_shared_data_external = addr;
|
||||
memcpy( user_shared_data->NtSystemRoot, default_windirW, sizeof(default_windirW) );
|
||||
|
||||
/* allocate and initialize the PEB and initial TEB */
|
||||
@@ -356,18 +359,69 @@ TEB *thread_init(void)
|
||||
*/
|
||||
BYTE* CDECL __wine_user_shared_data(void)
|
||||
{
|
||||
- LARGE_INTEGER now;
|
||||
+ static int spinlock;
|
||||
+ ULARGE_INTEGER interrupt;
|
||||
+ LARGE_INTEGER now;
|
||||
+
|
||||
+ while (interlocked_cmpxchg( &spinlock, 1, 0 ) != 0);
|
||||
+
|
||||
NtQuerySystemTime( &now );
|
||||
- user_shared_data->SystemTime.LowPart = now.u.LowPart;
|
||||
- user_shared_data->SystemTime.High1Time = user_shared_data->SystemTime.High2Time = now.u.HighPart;
|
||||
- user_shared_data->u.TickCountQuad = (now.QuadPart - server_start_time) / 10000;
|
||||
- user_shared_data->u.TickCount.High2Time = user_shared_data->u.TickCount.High1Time;
|
||||
- user_shared_data->TickCountLowDeprecated = user_shared_data->u.TickCount.LowPart;
|
||||
+ user_shared_data->SystemTime.High2Time = now.u.HighPart;
|
||||
+ user_shared_data->SystemTime.LowPart = now.u.LowPart;
|
||||
+ user_shared_data->SystemTime.High1Time = now.u.HighPart;
|
||||
+
|
||||
+ RtlQueryUnbiasedInterruptTime( &interrupt.QuadPart );
|
||||
+ user_shared_data->InterruptTime.High2Time = interrupt.HighPart;
|
||||
+ user_shared_data->InterruptTime.LowPart = interrupt.LowPart;
|
||||
+ user_shared_data->InterruptTime.High1Time = interrupt.HighPart;
|
||||
+
|
||||
+ interrupt.QuadPart /= 10000;
|
||||
+ user_shared_data->u.TickCount.High2Time = interrupt.HighPart;
|
||||
+ user_shared_data->u.TickCount.LowPart = interrupt.LowPart;
|
||||
+ user_shared_data->u.TickCount.High1Time = interrupt.HighPart;
|
||||
+ user_shared_data->TickCountLowDeprecated = interrupt.LowPart;
|
||||
user_shared_data->TickCountMultiplier = 1 << 24;
|
||||
|
||||
+ spinlock = 0;
|
||||
return (BYTE *)user_shared_data;
|
||||
}
|
||||
|
||||
+static void *user_shared_data_thread(void *arg)
|
||||
+{
|
||||
+ struct timeval tv;
|
||||
+
|
||||
+ while (TRUE)
|
||||
+ {
|
||||
+ __wine_user_shared_data();
|
||||
+
|
||||
+ tv.tv_sec = 0;
|
||||
+ tv.tv_usec = 15600;
|
||||
+ select(0, NULL, NULL, NULL, &tv);
|
||||
+ }
|
||||
+ return NULL;
|
||||
+}
|
||||
+
|
||||
+
|
||||
+void create_user_shared_data_thread(void)
|
||||
+{
|
||||
+ static int thread_created;
|
||||
+ pthread_attr_t attr;
|
||||
+ pthread_t thread;
|
||||
+
|
||||
+ if (interlocked_cmpxchg(&thread_created, 1, 0) != 0)
|
||||
+ return;
|
||||
+
|
||||
+ TRACE("Creating user shared data update thread.\n");
|
||||
+
|
||||
+ user_shared_data = user_shared_data_external;
|
||||
+ __wine_user_shared_data();
|
||||
+
|
||||
+ pthread_attr_init(&attr);
|
||||
+ pthread_attr_setstacksize(&attr, 0x10000);
|
||||
+ pthread_create(&thread, &attr, user_shared_data_thread, NULL);
|
||||
+ pthread_attr_destroy(&attr);
|
||||
+}
|
||||
+
|
||||
BOOL read_process_memory_stats(int unix_pid, VM_COUNTERS *pvmi)
|
||||
{
|
||||
BOOL ret = FALSE;
|
||||
diff --git a/dlls/ntdll/virtual.c b/dlls/ntdll/virtual.c
|
||||
index 7700385eb7b..865344d91d2 100644
|
||||
--- a/dlls/ntdll/virtual.c
|
||||
+++ b/dlls/ntdll/virtual.c
|
||||
@@ -2318,6 +2318,7 @@ NTSTATUS virtual_handle_fault( LPCVOID addr, DWORD err, BOOL on_signal_stack )
|
||||
{
|
||||
NTSTATUS ret = STATUS_ACCESS_VIOLATION;
|
||||
void *page = ROUND_ADDR( addr, page_mask );
|
||||
+ BOOL update_shared_data = FALSE;
|
||||
sigset_t sigset;
|
||||
BYTE vprot;
|
||||
|
||||
@@ -2343,7 +2344,23 @@ NTSTATUS virtual_handle_fault( LPCVOID addr, DWORD err, BOOL on_signal_stack )
|
||||
ret = STATUS_SUCCESS;
|
||||
}
|
||||
}
|
||||
+ else if (!err && page == user_shared_data_external)
|
||||
+ {
|
||||
+ if (!(vprot & VPROT_READ))
|
||||
+ {
|
||||
+ set_page_vprot_bits( page, page_size, VPROT_READ | VPROT_WRITE, 0 );
|
||||
+ mprotect_range( page, page_size, 0, 0 );
|
||||
+ update_shared_data = TRUE;
|
||||
+ }
|
||||
+ /* ignore fault if page is readable now */
|
||||
+ if (VIRTUAL_GetUnixProt( get_page_vprot( page )) & PROT_READ) ret = STATUS_SUCCESS;
|
||||
+ else update_shared_data = FALSE;
|
||||
+ }
|
||||
server_leave_uninterrupted_section( &csVirtual, &sigset );
|
||||
+
|
||||
+ if (update_shared_data)
|
||||
+ create_user_shared_data_thread();
|
||||
+
|
||||
return ret;
|
||||
}
|
||||
|
||||
--
|
||||
2.26.2
|
||||
|
@ -1,77 +0,0 @@
|
||||
From 6a1a8685b7ee9fa485a796963d9b2a3430067b14 Mon Sep 17 00:00:00 2001
|
||||
From: Andrew Wesie <awesie@gmail.com>
|
||||
Date: Tue, 2 May 2017 21:19:03 -0500
|
||||
Subject: ntdll/tests: Test updating TickCount in user_shared_data.
|
||||
|
||||
---
|
||||
dlls/ntdll/tests/time.c | 28 ++++++++++++++++++++++++++++
|
||||
1 file changed, 28 insertions(+)
|
||||
|
||||
diff --git a/dlls/ntdll/tests/time.c b/dlls/ntdll/tests/time.c
|
||||
index b684bc1980d..f90ac6ff91c 100644
|
||||
--- a/dlls/ntdll/tests/time.c
|
||||
+++ b/dlls/ntdll/tests/time.c
|
||||
@@ -18,7 +18,9 @@
|
||||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
||||
*/
|
||||
|
||||
+#define NONAMELESSUNION
|
||||
#include "ntdll_test.h"
|
||||
+#include "ddk/wdm.h"
|
||||
|
||||
#define TICKSPERSEC 10000000
|
||||
#define TICKSPERMSEC 10000
|
||||
@@ -29,6 +29,7 @@ static VOID (WINAPI *pRtlTimeFieldsToTime)( PTIME_FIELDS TimeFields, PLARGE_IN
|
||||
static NTSTATUS (WINAPI *pNtQueryPerformanceCounter)( LARGE_INTEGER *counter, LARGE_INTEGER *frequency );
|
||||
static NTSTATUS (WINAPI *pRtlQueryTimeZoneInformation)( RTL_TIME_ZONE_INFORMATION *);
|
||||
static NTSTATUS (WINAPI *pRtlQueryDynamicTimeZoneInformation)( RTL_DYNAMIC_TIME_ZONE_INFORMATION *);
|
||||
+static ULONG (WINAPI *pNtGetTickCount)(void);
|
||||
|
||||
static const int MonthLengths[2][12] =
|
||||
{
|
||||
@@ -153,12 +155,36 @@ static void test_RtlQueryTimeZoneInforma
|
||||
wine_dbgstr_w(tzinfo.DaylightName));
|
||||
}
|
||||
|
||||
+static void test_NtGetTickCount(void)
|
||||
+{
|
||||
+#ifndef _WIN64
|
||||
+ KSHARED_USER_DATA *user_shared_data = (void *)0x7ffe0000;
|
||||
+ LONG diff;
|
||||
+ int i;
|
||||
+
|
||||
+ if (!pNtGetTickCount)
|
||||
+ {
|
||||
+ win_skip("NtGetTickCount is not available\n");
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ for (i = 0; i < 5; ++i)
|
||||
+ {
|
||||
+ diff = (user_shared_data->u.TickCountQuad * user_shared_data->TickCountMultiplier) >> 24;
|
||||
+ diff = pNtGetTickCount() - diff;
|
||||
+ ok(diff < 32, "NtGetTickCount - TickCountQuad too high, expected < 32 got %d\n", diff);
|
||||
+ Sleep(50);
|
||||
+ }
|
||||
+#endif
|
||||
+}
|
||||
+
|
||||
START_TEST(time)
|
||||
{
|
||||
HMODULE mod = GetModuleHandleA("ntdll.dll");
|
||||
pRtlTimeToTimeFields = (void *)GetProcAddress(mod,"RtlTimeToTimeFields");
|
||||
pRtlTimeFieldsToTime = (void *)GetProcAddress(mod,"RtlTimeFieldsToTime");
|
||||
pNtQueryPerformanceCounter = (void *)GetProcAddress(mod, "NtQueryPerformanceCounter");
|
||||
+ pNtGetTickCount = (void *)GetProcAddress(mod,"NtGetTickCount");
|
||||
pRtlQueryTimeZoneInformation =
|
||||
(void *)GetProcAddress(mod, "RtlQueryTimeZoneInformation");
|
||||
pRtlQueryDynamicTimeZoneInformation =
|
||||
@@ -169,5 +195,6 @@ START_TEST(time)
|
||||
else
|
||||
win_skip("Required time conversion functions are not available\n");
|
||||
test_NtQueryPerformanceCounter();
|
||||
+ test_NtGetTickCount();
|
||||
test_RtlQueryTimeZoneInformation();
|
||||
}
|
||||
--
|
||||
2.12.2
|
@ -1,2 +1 @@
|
||||
Fixes: [29168] Update user shared data at realtime
|
||||
Depends: ntdll-Hide_Wine_Exports
|
||||
|
@ -1,4 +1,4 @@
|
||||
From 53d03a31463a98450b44f1d99c86195b78044691 Mon Sep 17 00:00:00 2001
|
||||
From b304bfba257073741c03dbcb719f55d2788c18a3 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Michael=20M=C3=BCller?= <michael@fds-team.de>
|
||||
Date: Sat, 4 Oct 2014 03:22:09 +0200
|
||||
Subject: [PATCH] ntdll: Properly handle PAGE_WRITECOPY protection. (try 5)
|
||||
@ -9,10 +9,10 @@ For now, only enable it when a special environment variable is set.
|
||||
1 file changed, 39 insertions(+), 7 deletions(-)
|
||||
|
||||
diff --git a/dlls/ntdll/virtual.c b/dlls/ntdll/virtual.c
|
||||
index aa1107f136f..fa39a67b9ca 100644
|
||||
index 7700385eb7b..aec6c18da87 100644
|
||||
--- a/dlls/ntdll/virtual.c
|
||||
+++ b/dlls/ntdll/virtual.c
|
||||
@@ -323,6 +323,21 @@ static const char *VIRTUAL_GetProtStr( BYTE prot )
|
||||
@@ -321,6 +321,21 @@ static const char *VIRTUAL_GetProtStr( BYTE prot )
|
||||
return buffer;
|
||||
}
|
||||
|
||||
@ -34,7 +34,7 @@ index aa1107f136f..fa39a67b9ca 100644
|
||||
|
||||
/***********************************************************************
|
||||
* VIRTUAL_GetUnixProt
|
||||
@@ -336,8 +351,19 @@ static int VIRTUAL_GetUnixProt( BYTE vprot )
|
||||
@@ -334,8 +349,19 @@ static int VIRTUAL_GetUnixProt( BYTE vprot )
|
||||
{
|
||||
if (vprot & VPROT_READ) prot |= PROT_READ;
|
||||
if (vprot & VPROT_WRITE) prot |= PROT_WRITE | PROT_READ;
|
||||
@ -55,7 +55,7 @@ index aa1107f136f..fa39a67b9ca 100644
|
||||
if (vprot & VPROT_WRITEWATCH) prot &= ~PROT_WRITE;
|
||||
}
|
||||
if (!prot) prot = PROT_NONE;
|
||||
@@ -1073,7 +1099,7 @@ static void update_write_watches( void *base, size_t size, size_t accessed_size
|
||||
@@ -1080,7 +1106,7 @@ static void update_write_watches( void *base, size_t size, size_t accessed_size
|
||||
{
|
||||
TRACE( "updating watch %p-%p-%p\n", base, (char *)base + accessed_size, (char *)base + size );
|
||||
/* clear write watch flag on accessed pages */
|
||||
@ -64,7 +64,7 @@ index aa1107f136f..fa39a67b9ca 100644
|
||||
/* restore page protections on the entire range */
|
||||
mprotect_range( base, size, 0, 0 );
|
||||
}
|
||||
@@ -2291,12 +2317,13 @@ NTSTATUS virtual_handle_fault( LPCVOID addr, DWORD err, BOOL on_signal_stack )
|
||||
@@ -2336,12 +2362,13 @@ NTSTATUS virtual_handle_fault( LPCVOID addr, DWORD err, BOOL on_signal_stack )
|
||||
set_page_vprot_bits( page, page_size, 0, VPROT_WRITEWATCH );
|
||||
mprotect_range( page, page_size, 0, 0 );
|
||||
}
|
||||
@ -80,9 +80,9 @@ index aa1107f136f..fa39a67b9ca 100644
|
||||
+ /* ignore fault if page is writable now */
|
||||
+ if (VIRTUAL_GetUnixProt( get_page_vprot( page )) & PROT_WRITE) ret = STATUS_SUCCESS;
|
||||
}
|
||||
else if (!err && page == user_shared_data_external)
|
||||
{
|
||||
@@ -2347,11 +2374,16 @@ static NTSTATUS check_write_access( void *base, size_t size, BOOL *has_write_wat
|
||||
server_leave_uninterrupted_section( &csVirtual, &sigset );
|
||||
return ret;
|
||||
@@ -2363,11 +2390,16 @@ static NTSTATUS check_write_access( void *base, size_t size, BOOL *has_write_wat
|
||||
{
|
||||
BYTE vprot = get_page_vprot( addr + i );
|
||||
if (vprot & VPROT_WRITEWATCH) *has_write_watch = TRUE;
|
||||
@ -101,5 +101,5 @@ index aa1107f136f..fa39a67b9ca 100644
|
||||
}
|
||||
|
||||
--
|
||||
2.25.4
|
||||
2.26.2
|
||||
|
||||
|
@ -1,5 +1,4 @@
|
||||
Fixes: [29384] Multiple applications expect correct handling of WRITECOPY memory protection (Voobly fails to launch Age of Empires II, MSYS2)
|
||||
Depends: ntdll-User_Shared_Data
|
||||
|
||||
# Causes regressions?
|
||||
# https://bugs.wine-staging.com/show_bug.cgi?id=207
|
||||
|
@ -1679,13 +1679,6 @@ if test "$enable_nvcuvid_CUDA_Video_Support" -eq 1; then
|
||||
enable_nvapi_Stub_DLL=1
|
||||
fi
|
||||
|
||||
if test "$enable_ntdll_WRITECOPY" -eq 1; then
|
||||
if test "$enable_ntdll_User_Shared_Data" -gt 1; then
|
||||
abort "Patchset ntdll-User_Shared_Data disabled, but ntdll-WRITECOPY depends on that."
|
||||
fi
|
||||
enable_ntdll_User_Shared_Data=1
|
||||
fi
|
||||
|
||||
if test "$enable_ntdll_Syscall_Emulation" -eq 1; then
|
||||
if test "$enable_winebuild_Fake_Dlls" -gt 1; then
|
||||
abort "Patchset winebuild-Fake_Dlls disabled, but ntdll-Syscall_Emulation depends on that."
|
||||
@ -1721,6 +1714,17 @@ if test "$enable_ntdll_NtContinue" -eq 1; then
|
||||
enable_winebuild_Fake_Dlls=1
|
||||
fi
|
||||
|
||||
if test "$enable_ntdll_Hide_Wine_Exports" -eq 1; then
|
||||
if test "$enable_advapi32_Token_Integrity_Level" -gt 1; then
|
||||
abort "Patchset advapi32-Token_Integrity_Level disabled, but ntdll-Hide_Wine_Exports depends on that."
|
||||
fi
|
||||
if test "$enable_ntdll_ThreadTime" -gt 1; then
|
||||
abort "Patchset ntdll-ThreadTime disabled, but ntdll-Hide_Wine_Exports depends on that."
|
||||
fi
|
||||
enable_advapi32_Token_Integrity_Level=1
|
||||
enable_ntdll_ThreadTime=1
|
||||
fi
|
||||
|
||||
if test "$enable_ntdll_DOS_Attributes" -eq 1; then
|
||||
if test "$enable_ntdll_Junction_Points" -gt 1; then
|
||||
abort "Patchset ntdll-Junction_Points disabled, but ntdll-DOS_Attributes depends on that."
|
||||
@ -1729,10 +1733,10 @@ if test "$enable_ntdll_DOS_Attributes" -eq 1; then
|
||||
fi
|
||||
|
||||
if test "$enable_ntdll_Builtin_Prot" -eq 1; then
|
||||
if test "$enable_ntdll_User_Shared_Data" -gt 1; then
|
||||
abort "Patchset ntdll-User_Shared_Data disabled, but ntdll-Builtin_Prot depends on that."
|
||||
if test "$enable_ntdll_WRITECOPY" -gt 1; then
|
||||
abort "Patchset ntdll-WRITECOPY disabled, but ntdll-Builtin_Prot depends on that."
|
||||
fi
|
||||
enable_ntdll_User_Shared_Data=1
|
||||
enable_ntdll_WRITECOPY=1
|
||||
fi
|
||||
|
||||
if test "$enable_ntdll_ApiSetMap" -eq 1; then
|
||||
@ -1817,6 +1821,9 @@ if test "$enable_server_Shared_Memory" -eq 1; then
|
||||
if test "$enable_ntdll_Threading" -gt 1; then
|
||||
abort "Patchset ntdll-Threading disabled, but server-Shared_Memory depends on that."
|
||||
fi
|
||||
if test "$enable_ntdll_User_Shared_Data" -gt 1; then
|
||||
abort "Patchset ntdll-User_Shared_Data disabled, but server-Shared_Memory depends on that."
|
||||
fi
|
||||
if test "$enable_ntdll_ext4_case_folder" -gt 1; then
|
||||
abort "Patchset ntdll-ext4-case-folder disabled, but server-Shared_Memory depends on that."
|
||||
fi
|
||||
@ -1833,6 +1840,7 @@ if test "$enable_server_Shared_Memory" -eq 1; then
|
||||
abort "Patchset user32-rawinput-nolegacy disabled, but server-Shared_Memory depends on that."
|
||||
fi
|
||||
enable_ntdll_Threading=1
|
||||
enable_ntdll_User_Shared_Data=1
|
||||
enable_ntdll_ext4_case_folder=1
|
||||
enable_server_Key_State=1
|
||||
enable_server_PeekMessage=1
|
||||
@ -1883,24 +1891,6 @@ if test "$enable_winebuild_Fake_Dlls" -eq 1; then
|
||||
enable_ntdll_User_Shared_Data=1
|
||||
fi
|
||||
|
||||
if test "$enable_ntdll_User_Shared_Data" -eq 1; then
|
||||
if test "$enable_ntdll_Hide_Wine_Exports" -gt 1; then
|
||||
abort "Patchset ntdll-Hide_Wine_Exports disabled, but ntdll-User_Shared_Data depends on that."
|
||||
fi
|
||||
enable_ntdll_Hide_Wine_Exports=1
|
||||
fi
|
||||
|
||||
if test "$enable_ntdll_Hide_Wine_Exports" -eq 1; then
|
||||
if test "$enable_advapi32_Token_Integrity_Level" -gt 1; then
|
||||
abort "Patchset advapi32-Token_Integrity_Level disabled, but ntdll-Hide_Wine_Exports depends on that."
|
||||
fi
|
||||
if test "$enable_ntdll_ThreadTime" -gt 1; then
|
||||
abort "Patchset ntdll-ThreadTime disabled, but ntdll-Hide_Wine_Exports depends on that."
|
||||
fi
|
||||
enable_advapi32_Token_Integrity_Level=1
|
||||
enable_ntdll_ThreadTime=1
|
||||
fi
|
||||
|
||||
if test "$enable_dxdiagn_GetChildContainer_Leaf_Nodes" -eq 1; then
|
||||
if test "$enable_dxdiagn_Enumerate_DirectSound" -gt 1; then
|
||||
abort "Patchset dxdiagn-Enumerate_DirectSound disabled, but dxdiagn-GetChildContainer_Leaf_Nodes depends on that."
|
||||
@ -3258,80 +3248,28 @@ if test "$enable_ntdll_Junction_Points" -eq 1; then
|
||||
) >> "$patchlist"
|
||||
fi
|
||||
|
||||
# Patchset ntdll-ThreadTime
|
||||
# |
|
||||
# | This patchset fixes the following Wine bugs:
|
||||
# | * [#20230] Return correct values for GetThreadTimes function
|
||||
# |
|
||||
# | Modified files:
|
||||
# | * dlls/ntdll/nt.c, dlls/ntdll/ntdll_misc.h, dlls/ntdll/process.c, dlls/ntdll/thread.c, server/protocol.def,
|
||||
# | server/snapshot.c, server/thread.c, server/thread.h
|
||||
# |
|
||||
if test "$enable_ntdll_ThreadTime" -eq 1; then
|
||||
patch_apply ntdll-ThreadTime/0001-ntdll-Return-correct-values-in-GetThreadTimes-for-al.patch
|
||||
patch_apply ntdll-ThreadTime/0002-ntdll-Set-correct-thread-creation-time-for-SystemPro.patch
|
||||
patch_apply ntdll-ThreadTime/0003-ntdll-Fill-process-kernel-and-user-time.patch
|
||||
patch_apply ntdll-ThreadTime/0004-ntdll-Set-process-start-time.patch
|
||||
patch_apply ntdll-ThreadTime/0005-ntdll-Fill-out-thread-times-in-process-enumeration.patch
|
||||
patch_apply ntdll-ThreadTime/0006-ntdll-Fill-process-virtual-memory-counters-in-NtQuer.patch
|
||||
(
|
||||
printf '%s\n' '+ { "Sebastian Lackner", "ntdll: Return correct values in GetThreadTimes() for all threads.", 1 },';
|
||||
printf '%s\n' '+ { "Michael Müller", "ntdll: Set correct thread creation time for SystemProcessInformation in NtQuerySystemInformation.", 1 },';
|
||||
printf '%s\n' '+ { "Michael Müller", "ntdll: Fill process kernel and user time.", 1 },';
|
||||
printf '%s\n' '+ { "Michael Müller", "ntdll: Set process start time.", 1 },';
|
||||
printf '%s\n' '+ { "Michael Müller", "ntdll: Fill out thread times in process enumeration.", 1 },';
|
||||
printf '%s\n' '+ { "Michael Müller", "ntdll: Fill process virtual memory counters in NtQuerySystemInformation.", 1 },';
|
||||
) >> "$patchlist"
|
||||
fi
|
||||
|
||||
# Patchset ntdll-Hide_Wine_Exports
|
||||
# |
|
||||
# | This patchset has the following (direct or indirect) dependencies:
|
||||
# | * Staging, advapi32-CreateRestrictedToken, advapi32-Token_Integrity_Level, ntdll-ThreadTime
|
||||
# |
|
||||
# | This patchset fixes the following Wine bugs:
|
||||
# | * [#38656] Add support for hiding wine version information from applications
|
||||
# |
|
||||
# | Modified files:
|
||||
# | * dlls/ntdll/loader.c, dlls/ntdll/ntdll_misc.h
|
||||
# |
|
||||
if test "$enable_ntdll_Hide_Wine_Exports" -eq 1; then
|
||||
patch_apply ntdll-Hide_Wine_Exports/0001-ntdll-Add-support-for-hiding-wine-version-informatio.patch
|
||||
(
|
||||
printf '%s\n' '+ { "Sebastian Lackner", "ntdll: Add support for hiding wine version information from applications.", 1 },';
|
||||
) >> "$patchlist"
|
||||
fi
|
||||
|
||||
# Patchset ntdll-User_Shared_Data
|
||||
# |
|
||||
# | This patchset has the following (direct or indirect) dependencies:
|
||||
# | * Staging, advapi32-CreateRestrictedToken, advapi32-Token_Integrity_Level, ntdll-ThreadTime, ntdll-Hide_Wine_Exports
|
||||
# |
|
||||
# | This patchset fixes the following Wine bugs:
|
||||
# | * [#29168] Update user shared data at realtime
|
||||
# |
|
||||
# | Modified files:
|
||||
# | * dlls/ntdll/loader.c, dlls/ntdll/ntdll.spec, dlls/ntdll/ntdll_misc.h, dlls/ntdll/tests/time.c, dlls/ntdll/thread.c,
|
||||
# | dlls/ntdll/virtual.c, dlls/ntoskrnl.exe/instr.c
|
||||
# | * dlls/ntdll/ntdll_misc.h, dlls/ntdll/server.c, dlls/ntdll/tests/time.c, dlls/ntdll/thread.c, dlls/ntoskrnl.exe/instr.c,
|
||||
# | server/file.h, server/mapping.c, server/process.c, server/protocol.def
|
||||
# |
|
||||
if test "$enable_ntdll_User_Shared_Data" -eq 1; then
|
||||
patch_apply ntdll-User_Shared_Data/0001-ntdll-Move-code-to-update-user-shared-data-into-a-se.patch
|
||||
patch_apply ntdll-User_Shared_Data/0002-ntoskrnl-Update-USER_SHARED_DATA-before-accessing-me.patch
|
||||
patch_apply ntdll-User_Shared_Data/0003-ntdll-Create-thread-to-update-user_shared_data-time-.patch
|
||||
patch_apply ntdll-User_Shared_Data/0004-ntdll-tests-Test-updating-TickCount-in-user_shared_d.patch
|
||||
patch_apply ntdll-User_Shared_Data/0001-ntdll-tests-Test-user_shared_data-timestamp-updates.patch
|
||||
patch_apply ntdll-User_Shared_Data/0002-server-Add-USD-support-with-timestamp-updates.patch
|
||||
(
|
||||
printf '%s\n' '+ { "Sebastian Lackner", "ntdll: Move code to update user shared data into a separate function.", 1 },';
|
||||
printf '%s\n' '+ { "Sebastian Lackner", "ntoskrnl: Update USER_SHARED_DATA before accessing memory.", 1 },';
|
||||
printf '%s\n' '+ { "Michael Müller", "ntdll: Create thread to update user_shared_data time values when necessary.", 1 },';
|
||||
printf '%s\n' '+ { "Andrew Wesie", "ntdll/tests: Test updating TickCount in user_shared_data.", 1 },';
|
||||
printf '%s\n' '+ { "Rémi Bernon", "ntdll/tests: Test user_shared_data timestamp updates.", 1 },';
|
||||
printf '%s\n' '+ { "Rémi Bernon", "server: Add USD support with timestamp updates.", 1 },';
|
||||
) >> "$patchlist"
|
||||
fi
|
||||
|
||||
# Patchset winebuild-Fake_Dlls
|
||||
# |
|
||||
# | This patchset has the following (direct or indirect) dependencies:
|
||||
# | * Staging, advapi32-CreateRestrictedToken, advapi32-Token_Integrity_Level, ntdll-ThreadTime, ntdll-Hide_Wine_Exports,
|
||||
# | ntdll-User_Shared_Data
|
||||
# | * ntdll-User_Shared_Data
|
||||
# |
|
||||
# | This patchset fixes the following Wine bugs:
|
||||
# | * [#21232] Chromium-based browser engines (Chrome, Opera, Comodo Dragon, SRWare Iron) crash on startup unless '--no-
|
||||
@ -3382,8 +3320,7 @@ fi
|
||||
# Patchset ntdll-RtlCreateUserThread
|
||||
# |
|
||||
# | This patchset has the following (direct or indirect) dependencies:
|
||||
# | * Staging, advapi32-CreateRestrictedToken, advapi32-Token_Integrity_Level, ntdll-ThreadTime, ntdll-Hide_Wine_Exports,
|
||||
# | ntdll-User_Shared_Data, winebuild-Fake_Dlls
|
||||
# | * ntdll-User_Shared_Data, winebuild-Fake_Dlls
|
||||
# |
|
||||
# | This patchset fixes the following Wine bugs:
|
||||
# | * [#45571] League of Legends 8.12+ fails to start a game (anticheat engine, hooking of NtCreateThread/Ex)
|
||||
@ -3410,6 +3347,32 @@ if test "$enable_ntdll_SystemRoot_Symlink" -eq 1; then
|
||||
) >> "$patchlist"
|
||||
fi
|
||||
|
||||
# Patchset ntdll-ThreadTime
|
||||
# |
|
||||
# | This patchset fixes the following Wine bugs:
|
||||
# | * [#20230] Return correct values for GetThreadTimes function
|
||||
# |
|
||||
# | Modified files:
|
||||
# | * dlls/ntdll/nt.c, dlls/ntdll/ntdll_misc.h, dlls/ntdll/process.c, dlls/ntdll/thread.c, server/protocol.def,
|
||||
# | server/snapshot.c, server/thread.c, server/thread.h
|
||||
# |
|
||||
if test "$enable_ntdll_ThreadTime" -eq 1; then
|
||||
patch_apply ntdll-ThreadTime/0001-ntdll-Return-correct-values-in-GetThreadTimes-for-al.patch
|
||||
patch_apply ntdll-ThreadTime/0002-ntdll-Set-correct-thread-creation-time-for-SystemPro.patch
|
||||
patch_apply ntdll-ThreadTime/0003-ntdll-Fill-process-kernel-and-user-time.patch
|
||||
patch_apply ntdll-ThreadTime/0004-ntdll-Set-process-start-time.patch
|
||||
patch_apply ntdll-ThreadTime/0005-ntdll-Fill-out-thread-times-in-process-enumeration.patch
|
||||
patch_apply ntdll-ThreadTime/0006-ntdll-Fill-process-virtual-memory-counters-in-NtQuer.patch
|
||||
(
|
||||
printf '%s\n' '+ { "Sebastian Lackner", "ntdll: Return correct values in GetThreadTimes() for all threads.", 1 },';
|
||||
printf '%s\n' '+ { "Michael Müller", "ntdll: Set correct thread creation time for SystemProcessInformation in NtQuerySystemInformation.", 1 },';
|
||||
printf '%s\n' '+ { "Michael Müller", "ntdll: Fill process kernel and user time.", 1 },';
|
||||
printf '%s\n' '+ { "Michael Müller", "ntdll: Set process start time.", 1 },';
|
||||
printf '%s\n' '+ { "Michael Müller", "ntdll: Fill out thread times in process enumeration.", 1 },';
|
||||
printf '%s\n' '+ { "Michael Müller", "ntdll: Fill process virtual memory counters in NtQuerySystemInformation.", 1 },';
|
||||
) >> "$patchlist"
|
||||
fi
|
||||
|
||||
# Patchset server-Realtime_Priority
|
||||
# |
|
||||
# | This patchset has the following (direct or indirect) dependencies:
|
||||
@ -3605,8 +3568,8 @@ fi
|
||||
# Patchset server-Shared_Memory
|
||||
# |
|
||||
# | This patchset has the following (direct or indirect) dependencies:
|
||||
# | * ntdll-Threading, ntdll-ext4-case-folder, server-Key_State, server-PeekMessage, server-Signal_Thread, loader-
|
||||
# | KeyboardLayouts, winex11.drv-mouse-coorrds, user32-rawinput-mouse, user32-rawinput-nolegacy
|
||||
# | * ntdll-Threading, ntdll-User_Shared_Data, ntdll-ext4-case-folder, server-Key_State, server-PeekMessage, server-
|
||||
# | Signal_Thread, loader-KeyboardLayouts, winex11.drv-mouse-coorrds, user32-rawinput-mouse, user32-rawinput-nolegacy
|
||||
# |
|
||||
# | Modified files:
|
||||
# | * dlls/ntdll/ntdll_misc.h, dlls/ntdll/server.c, dlls/ntdll/thread.c, dlls/ntdll/virtual.c, dlls/user32/focus.c,
|
||||
@ -3657,10 +3620,10 @@ fi
|
||||
# |
|
||||
# | This patchset has the following (direct or indirect) dependencies:
|
||||
# | * Staging, advapi32-CreateRestrictedToken, advapi32-Token_Integrity_Level, kernel32-K32GetPerformanceInfo, ntdll-
|
||||
# | Junction_Points, ntdll-ThreadTime, ntdll-Hide_Wine_Exports, ntdll-User_Shared_Data, winebuild-Fake_Dlls, ntdll-
|
||||
# | RtlCreateUserThread, ntdll-SystemRoot_Symlink, server-Realtime_Priority, ntdll-Threading, ntdll-ext4-case-folder,
|
||||
# | server-Key_State, server-PeekMessage, server-Signal_Thread, loader-KeyboardLayouts, winex11.drv-mouse-coorrds, user32
|
||||
# | -rawinput-mouse, user32-rawinput-nolegacy, server-Shared_Memory, ws2_32-WSACleanup
|
||||
# | Junction_Points, ntdll-User_Shared_Data, winebuild-Fake_Dlls, ntdll-RtlCreateUserThread, ntdll-SystemRoot_Symlink,
|
||||
# | ntdll-ThreadTime, server-Realtime_Priority, ntdll-Threading, ntdll-ext4-case-folder, server-Key_State, server-
|
||||
# | PeekMessage, server-Signal_Thread, loader-KeyboardLayouts, winex11.drv-mouse-coorrds, user32-rawinput-mouse, user32
|
||||
# | -rawinput-nolegacy, server-Shared_Memory, ws2_32-WSACleanup
|
||||
# |
|
||||
# | This patchset fixes the following Wine bugs:
|
||||
# | * [#36692] Many multi-threaded applications have poor performance due to heavy use of synchronization primitives
|
||||
@ -4407,11 +4370,47 @@ if test "$enable_ntdll_ApiSetMap" -eq 1; then
|
||||
) >> "$patchlist"
|
||||
fi
|
||||
|
||||
# Patchset ntdll-WRITECOPY
|
||||
# |
|
||||
# | This patchset fixes the following Wine bugs:
|
||||
# | * [#29384] Multiple applications expect correct handling of WRITECOPY memory protection (Voobly fails to launch Age of
|
||||
# | Empires II, MSYS2)
|
||||
# |
|
||||
# | Modified files:
|
||||
# | * dlls/advapi32/crypt.c, dlls/advapi32/tests/security.c, dlls/kernel32/tests/virtual.c, dlls/ntdll/ntdll_misc.h,
|
||||
# | dlls/ntdll/server.c, dlls/ntdll/signal_arm.c, dlls/ntdll/signal_arm64.c, dlls/ntdll/signal_i386.c,
|
||||
# | dlls/ntdll/signal_powerpc.c, dlls/ntdll/signal_x86_64.c, dlls/ntdll/thread.c, dlls/ntdll/virtual.c,
|
||||
# | dlls/psapi/tests/psapi_main.c
|
||||
# |
|
||||
if test "$enable_ntdll_WRITECOPY" -eq 1; then
|
||||
patch_apply ntdll-WRITECOPY/0001-ntdll-Trigger-write-watches-before-passing-userdata-.patch
|
||||
patch_apply ntdll-WRITECOPY/0002-advapi-Trigger-write-watches-before-passing-userdata.patch
|
||||
patch_apply ntdll-WRITECOPY/0003-ntdll-Setup-a-temporary-signal-handler-during-proces.patch
|
||||
patch_apply ntdll-WRITECOPY/0004-ntdll-Properly-handle-PAGE_WRITECOPY-protection.-try.patch
|
||||
patch_apply ntdll-WRITECOPY/0005-ntdll-Track-if-a-WRITECOPY-page-has-been-modified.patch
|
||||
patch_apply ntdll-WRITECOPY/0006-ntdll-Support-WRITECOPY-on-x64.patch
|
||||
patch_apply ntdll-WRITECOPY/0007-ntdll-Always-enable-WRITECOPY-support.patch
|
||||
patch_apply ntdll-WRITECOPY/0008-ntdll-Report-unmodified-WRITECOPY-pages-as-shared.patch
|
||||
patch_apply ntdll-WRITECOPY/0009-ntdll-Fallback-to-copy-pages-for-WRITECOPY.patch
|
||||
patch_apply ntdll-WRITECOPY/0010-kernel32-tests-psapi-tests-Update-tests.patch
|
||||
(
|
||||
printf '%s\n' '+ { "Sebastian Lackner", "ntdll: Trigger write watches before passing userdata pointer to wait_reply.", 1 },';
|
||||
printf '%s\n' '+ { "Sebastian Lackner", "advapi: Trigger write watches before passing userdata pointer to read syscall.", 1 },';
|
||||
printf '%s\n' '+ { "Michael Müller", "ntdll: Setup a temporary signal handler during process startup to handle page faults.", 2 },';
|
||||
printf '%s\n' '+ { "Michael Müller", "ntdll: Properly handle PAGE_WRITECOPY protection.", 5 },';
|
||||
printf '%s\n' '+ { "Andrew Wesie", "ntdll: Track if a WRITECOPY page has been modified.", 1 },';
|
||||
printf '%s\n' '+ { "Andrew Wesie", "ntdll: Support WRITECOPY on x64.", 1 },';
|
||||
printf '%s\n' '+ { "Andrew Wesie", "ntdll: Always enable WRITECOPY support.", 1 },';
|
||||
printf '%s\n' '+ { "Andrew Wesie", "ntdll: Report unmodified WRITECOPY pages as shared.", 1 },';
|
||||
printf '%s\n' '+ { "Andrew Wesie", "ntdll: Fallback to copy pages for WRITECOPY.", 1 },';
|
||||
printf '%s\n' '+ { "Andrew Wesie", "kernel32/tests, psapi/tests: Update tests.", 1 },';
|
||||
) >> "$patchlist"
|
||||
fi
|
||||
|
||||
# Patchset ntdll-Builtin_Prot
|
||||
# |
|
||||
# | This patchset has the following (direct or indirect) dependencies:
|
||||
# | * Staging, advapi32-CreateRestrictedToken, advapi32-Token_Integrity_Level, ntdll-ThreadTime, ntdll-Hide_Wine_Exports,
|
||||
# | ntdll-User_Shared_Data
|
||||
# | * ntdll-WRITECOPY
|
||||
# |
|
||||
# | This patchset fixes the following Wine bugs:
|
||||
# | * [#44650] Fix holes in ELF mappings
|
||||
@ -4633,6 +4632,24 @@ if test "$enable_ntdll_Heap_Improvements" -eq 1; then
|
||||
) >> "$patchlist"
|
||||
fi
|
||||
|
||||
# Patchset ntdll-Hide_Wine_Exports
|
||||
# |
|
||||
# | This patchset has the following (direct or indirect) dependencies:
|
||||
# | * Staging, advapi32-CreateRestrictedToken, advapi32-Token_Integrity_Level, ntdll-ThreadTime
|
||||
# |
|
||||
# | This patchset fixes the following Wine bugs:
|
||||
# | * [#38656] Add support for hiding wine version information from applications
|
||||
# |
|
||||
# | Modified files:
|
||||
# | * dlls/ntdll/loader.c, dlls/ntdll/ntdll_misc.h
|
||||
# |
|
||||
if test "$enable_ntdll_Hide_Wine_Exports" -eq 1; then
|
||||
patch_apply ntdll-Hide_Wine_Exports/0001-ntdll-Add-support-for-hiding-wine-version-informatio.patch
|
||||
(
|
||||
printf '%s\n' '+ { "Sebastian Lackner", "ntdll: Add support for hiding wine version information from applications.", 1 },';
|
||||
) >> "$patchlist"
|
||||
fi
|
||||
|
||||
# Patchset ntdll-Interrupt-0x2e
|
||||
# |
|
||||
# | This patchset fixes the following Wine bugs:
|
||||
@ -4678,8 +4695,7 @@ fi
|
||||
# Patchset ntdll-NtContinue
|
||||
# |
|
||||
# | This patchset has the following (direct or indirect) dependencies:
|
||||
# | * Staging, advapi32-CreateRestrictedToken, advapi32-Token_Integrity_Level, ntdll-ThreadTime, ntdll-Hide_Wine_Exports,
|
||||
# | ntdll-User_Shared_Data, winebuild-Fake_Dlls
|
||||
# | * ntdll-User_Shared_Data, winebuild-Fake_Dlls
|
||||
# |
|
||||
# | This patchset fixes the following Wine bugs:
|
||||
# | * [#31910] Add stub for NtContinue
|
||||
@ -4882,8 +4898,7 @@ fi
|
||||
# Patchset ntdll-Syscall_Emulation
|
||||
# |
|
||||
# | This patchset has the following (direct or indirect) dependencies:
|
||||
# | * Staging, advapi32-CreateRestrictedToken, advapi32-Token_Integrity_Level, ntdll-ThreadTime, ntdll-Hide_Wine_Exports,
|
||||
# | ntdll-User_Shared_Data, winebuild-Fake_Dlls
|
||||
# | * ntdll-User_Shared_Data, winebuild-Fake_Dlls
|
||||
# |
|
||||
# | This patchset fixes the following Wine bugs:
|
||||
# | * [#48291] Detroit: Become Human crashes on launch
|
||||
@ -4966,47 +4981,6 @@ if test "$enable_ntdll_ThreadHideFromDebugger" -eq 1; then
|
||||
) >> "$patchlist"
|
||||
fi
|
||||
|
||||
# Patchset ntdll-WRITECOPY
|
||||
# |
|
||||
# | This patchset has the following (direct or indirect) dependencies:
|
||||
# | * Staging, advapi32-CreateRestrictedToken, advapi32-Token_Integrity_Level, ntdll-ThreadTime, ntdll-Hide_Wine_Exports,
|
||||
# | ntdll-User_Shared_Data
|
||||
# |
|
||||
# | This patchset fixes the following Wine bugs:
|
||||
# | * [#29384] Multiple applications expect correct handling of WRITECOPY memory protection (Voobly fails to launch Age of
|
||||
# | Empires II, MSYS2)
|
||||
# |
|
||||
# | Modified files:
|
||||
# | * dlls/advapi32/crypt.c, dlls/advapi32/tests/security.c, dlls/kernel32/tests/virtual.c, dlls/ntdll/ntdll_misc.h,
|
||||
# | dlls/ntdll/server.c, dlls/ntdll/signal_arm.c, dlls/ntdll/signal_arm64.c, dlls/ntdll/signal_i386.c,
|
||||
# | dlls/ntdll/signal_powerpc.c, dlls/ntdll/signal_x86_64.c, dlls/ntdll/thread.c, dlls/ntdll/virtual.c,
|
||||
# | dlls/psapi/tests/psapi_main.c
|
||||
# |
|
||||
if test "$enable_ntdll_WRITECOPY" -eq 1; then
|
||||
patch_apply ntdll-WRITECOPY/0001-ntdll-Trigger-write-watches-before-passing-userdata-.patch
|
||||
patch_apply ntdll-WRITECOPY/0002-advapi-Trigger-write-watches-before-passing-userdata.patch
|
||||
patch_apply ntdll-WRITECOPY/0003-ntdll-Setup-a-temporary-signal-handler-during-proces.patch
|
||||
patch_apply ntdll-WRITECOPY/0004-ntdll-Properly-handle-PAGE_WRITECOPY-protection.-try.patch
|
||||
patch_apply ntdll-WRITECOPY/0005-ntdll-Track-if-a-WRITECOPY-page-has-been-modified.patch
|
||||
patch_apply ntdll-WRITECOPY/0006-ntdll-Support-WRITECOPY-on-x64.patch
|
||||
patch_apply ntdll-WRITECOPY/0007-ntdll-Always-enable-WRITECOPY-support.patch
|
||||
patch_apply ntdll-WRITECOPY/0008-ntdll-Report-unmodified-WRITECOPY-pages-as-shared.patch
|
||||
patch_apply ntdll-WRITECOPY/0009-ntdll-Fallback-to-copy-pages-for-WRITECOPY.patch
|
||||
patch_apply ntdll-WRITECOPY/0010-kernel32-tests-psapi-tests-Update-tests.patch
|
||||
(
|
||||
printf '%s\n' '+ { "Sebastian Lackner", "ntdll: Trigger write watches before passing userdata pointer to wait_reply.", 1 },';
|
||||
printf '%s\n' '+ { "Sebastian Lackner", "advapi: Trigger write watches before passing userdata pointer to read syscall.", 1 },';
|
||||
printf '%s\n' '+ { "Michael Müller", "ntdll: Setup a temporary signal handler during process startup to handle page faults.", 2 },';
|
||||
printf '%s\n' '+ { "Michael Müller", "ntdll: Properly handle PAGE_WRITECOPY protection.", 5 },';
|
||||
printf '%s\n' '+ { "Andrew Wesie", "ntdll: Track if a WRITECOPY page has been modified.", 1 },';
|
||||
printf '%s\n' '+ { "Andrew Wesie", "ntdll: Support WRITECOPY on x64.", 1 },';
|
||||
printf '%s\n' '+ { "Andrew Wesie", "ntdll: Always enable WRITECOPY support.", 1 },';
|
||||
printf '%s\n' '+ { "Andrew Wesie", "ntdll: Report unmodified WRITECOPY pages as shared.", 1 },';
|
||||
printf '%s\n' '+ { "Andrew Wesie", "ntdll: Fallback to copy pages for WRITECOPY.", 1 },';
|
||||
printf '%s\n' '+ { "Andrew Wesie", "kernel32/tests, psapi/tests: Update tests.", 1 },';
|
||||
) >> "$patchlist"
|
||||
fi
|
||||
|
||||
# Patchset ntdll-Zero_mod_name
|
||||
# |
|
||||
# | Modified files:
|
||||
@ -5334,10 +5308,10 @@ fi
|
||||
# |
|
||||
# | This patchset has the following (direct or indirect) dependencies:
|
||||
# | * Staging, advapi32-CreateRestrictedToken, advapi32-Token_Integrity_Level, kernel32-K32GetPerformanceInfo, ntdll-
|
||||
# | Junction_Points, ntdll-ThreadTime, ntdll-Hide_Wine_Exports, ntdll-User_Shared_Data, winebuild-Fake_Dlls, ntdll-
|
||||
# | RtlCreateUserThread, ntdll-SystemRoot_Symlink, server-Realtime_Priority, ntdll-Threading, ntdll-ext4-case-folder,
|
||||
# | server-Key_State, server-PeekMessage, server-Signal_Thread, loader-KeyboardLayouts, winex11.drv-mouse-coorrds, user32
|
||||
# | -rawinput-mouse, user32-rawinput-nolegacy, server-Shared_Memory, ws2_32-WSACleanup, eventfd_synchronization
|
||||
# | Junction_Points, ntdll-User_Shared_Data, winebuild-Fake_Dlls, ntdll-RtlCreateUserThread, ntdll-SystemRoot_Symlink,
|
||||
# | ntdll-ThreadTime, server-Realtime_Priority, ntdll-Threading, ntdll-ext4-case-folder, server-Key_State, server-
|
||||
# | PeekMessage, server-Signal_Thread, loader-KeyboardLayouts, winex11.drv-mouse-coorrds, user32-rawinput-mouse, user32
|
||||
# | -rawinput-nolegacy, server-Shared_Memory, ws2_32-WSACleanup, eventfd_synchronization
|
||||
# |
|
||||
# | This patchset fixes the following Wine bugs:
|
||||
# | * [#46967] GOG Galaxy doesn't run in virtual desktop.
|
||||
@ -5425,8 +5399,9 @@ fi
|
||||
# Patchset server-Object_Types
|
||||
# |
|
||||
# | This patchset has the following (direct or indirect) dependencies:
|
||||
# | * ntdll-Threading, ntdll-ext4-case-folder, server-Key_State, server-PeekMessage, server-Signal_Thread, loader-
|
||||
# | KeyboardLayouts, winex11.drv-mouse-coorrds, user32-rawinput-mouse, user32-rawinput-nolegacy, server-Shared_Memory
|
||||
# | * ntdll-Threading, ntdll-User_Shared_Data, ntdll-ext4-case-folder, server-Key_State, server-PeekMessage, server-
|
||||
# | Signal_Thread, loader-KeyboardLayouts, winex11.drv-mouse-coorrds, user32-rawinput-mouse, user32-rawinput-nolegacy,
|
||||
# | server-Shared_Memory
|
||||
# |
|
||||
# | This patchset fixes the following Wine bugs:
|
||||
# | * [#44629] Process Hacker can't enumerate handles
|
||||
@ -7111,11 +7086,10 @@ fi
|
||||
# |
|
||||
# | This patchset has the following (direct or indirect) dependencies:
|
||||
# | * Staging, advapi32-CreateRestrictedToken, advapi32-Token_Integrity_Level, kernel32-K32GetPerformanceInfo, ntdll-
|
||||
# | Junction_Points, ntdll-ThreadTime, ntdll-Hide_Wine_Exports, ntdll-User_Shared_Data, winebuild-Fake_Dlls, ntdll-
|
||||
# | RtlCreateUserThread, ntdll-SystemRoot_Symlink, server-Realtime_Priority, ntdll-Threading, ntdll-ext4-case-folder,
|
||||
# | server-Key_State, server-PeekMessage, server-Signal_Thread, loader-KeyboardLayouts, winex11.drv-mouse-coorrds, user32
|
||||
# | -rawinput-mouse, user32-rawinput-nolegacy, server-Shared_Memory, ws2_32-WSACleanup, eventfd_synchronization, server-
|
||||
# | Desktop_Refcount
|
||||
# | Junction_Points, ntdll-User_Shared_Data, winebuild-Fake_Dlls, ntdll-RtlCreateUserThread, ntdll-SystemRoot_Symlink,
|
||||
# | ntdll-ThreadTime, server-Realtime_Priority, ntdll-Threading, ntdll-ext4-case-folder, server-Key_State, server-
|
||||
# | PeekMessage, server-Signal_Thread, loader-KeyboardLayouts, winex11.drv-mouse-coorrds, user32-rawinput-mouse, user32
|
||||
# | -rawinput-nolegacy, server-Shared_Memory, ws2_32-WSACleanup, eventfd_synchronization, server-Desktop_Refcount
|
||||
# |
|
||||
# | Modified files:
|
||||
# | * dlls/ws2_32/socket.c, dlls/ws2_32/tests/sock.c, include/winsock.h, server/protocol.def, server/sock.c
|
||||
|
@ -1,4 +1,4 @@
|
||||
From 882a6197012149fb44b3751dc24e3d2a222dd46b Mon Sep 17 00:00:00 2001
|
||||
From 3225fc5b602f25a2d17ee68b732ec2a59fb29c0f Mon Sep 17 00:00:00 2001
|
||||
From: Sebastian Lackner <sebastian@fds-team.de>
|
||||
Date: Thu, 19 Mar 2015 02:55:36 +0100
|
||||
Subject: [PATCH] ntdll: Only enable wineserver shared memory communication
|
||||
@ -9,18 +9,18 @@ Subject: [PATCH] ntdll: Only enable wineserver shared memory communication
|
||||
1 file changed, 22 insertions(+)
|
||||
|
||||
diff --git a/dlls/ntdll/server.c b/dlls/ntdll/server.c
|
||||
index e138f7c212d..68910fde50c 100644
|
||||
index 749e753ae5a..c3f9d11c760 100644
|
||||
--- a/dlls/ntdll/server.c
|
||||
+++ b/dlls/ntdll/server.c
|
||||
@@ -92,6 +92,7 @@
|
||||
#include "ntdll_misc.h"
|
||||
@@ -100,6 +100,7 @@
|
||||
#include "ddk/wdm.h"
|
||||
|
||||
WINE_DEFAULT_DEBUG_CHANNEL(server);
|
||||
+WINE_DECLARE_DEBUG_CHANNEL(winediag);
|
||||
|
||||
/* just in case... */
|
||||
#undef EXT2_IOC_GETFLAGS
|
||||
@@ -1162,6 +1163,21 @@ static int server_get_shared_memory_fd( HANDLE thread, int *unix_fd )
|
||||
@@ -1177,6 +1178,21 @@ static int server_get_shared_memory_fd( HANDLE thread, int *unix_fd )
|
||||
return ret;
|
||||
}
|
||||
|
||||
@ -42,7 +42,7 @@ index e138f7c212d..68910fde50c 100644
|
||||
|
||||
/***********************************************************************
|
||||
* server_get_shared_memory
|
||||
@@ -1174,6 +1190,9 @@ void *server_get_shared_memory( HANDLE thread )
|
||||
@@ -1189,6 +1205,9 @@ void *server_get_shared_memory( HANDLE thread )
|
||||
void *mem = NULL;
|
||||
int fd = -1;
|
||||
|
||||
@ -52,7 +52,7 @@ index e138f7c212d..68910fde50c 100644
|
||||
/* The global memory block is only requested once. No locking is
|
||||
* required because this function is called very early during the
|
||||
* process initialization for the first time. */
|
||||
@@ -1188,7 +1207,10 @@ void *server_get_shared_memory( HANDLE thread )
|
||||
@@ -1203,7 +1222,10 @@ void *server_get_shared_memory( HANDLE thread )
|
||||
}
|
||||
|
||||
if (!thread)
|
||||
|
@ -7,3 +7,4 @@ Depends: server-PeekMessage
|
||||
Depends: server-Signal_Thread
|
||||
Depends: user32-rawinput-nolegacy
|
||||
Depends: ntdll-ext4-case-folder
|
||||
Depends: ntdll-User_Shared_Data
|
||||
|
@ -1,4 +1,4 @@
|
||||
From 6037ccdc09121a1602089e7dcf50d7739a69114f Mon Sep 17 00:00:00 2001
|
||||
From 61a744694dc9eafb8b92fbb826335bd4468f20f8 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Michael=20M=C3=BCller?= <michael@fds-team.de>
|
||||
Date: Thu, 7 Sep 2017 00:38:09 +0200
|
||||
Subject: [PATCH] tools/winebuild: Add syscall thunks for 64 bit.
|
||||
@ -6,11 +6,11 @@ Subject: [PATCH] tools/winebuild: Add syscall thunks for 64 bit.
|
||||
---
|
||||
dlls/kernel32/tests/loader.c | 7 +-
|
||||
dlls/ntdll/signal_x86_64.c | 2 +
|
||||
dlls/ntdll/thread.c | 10 ++
|
||||
dlls/ntdll/thread.c | 6 +
|
||||
libs/wine/loader.c | 4 +
|
||||
tools/winebuild/parser.c | 2 +-
|
||||
tools/winebuild/spec32.c | 285 ++++++++++++++++++++++++++++++++++-
|
||||
6 files changed, 302 insertions(+), 8 deletions(-)
|
||||
6 files changed, 298 insertions(+), 8 deletions(-)
|
||||
|
||||
diff --git a/dlls/kernel32/tests/loader.c b/dlls/kernel32/tests/loader.c
|
||||
index 5373dc4efe1..67d04876bd6 100644
|
||||
@ -60,11 +60,11 @@ index 31af1e98d3f..324a92b41a9 100644
|
||||
}
|
||||
|
||||
diff --git a/dlls/ntdll/thread.c b/dlls/ntdll/thread.c
|
||||
index 1650c17295a..0acc4d88524 100644
|
||||
index f4da99db760..03229a98bb8 100644
|
||||
--- a/dlls/ntdll/thread.c
|
||||
+++ b/dlls/ntdll/thread.c
|
||||
@@ -63,6 +63,8 @@ struct _KUSER_SHARED_DATA *user_shared_data_external;
|
||||
struct _KUSER_SHARED_DATA *user_shared_data = &user_shared_data_internal;
|
||||
@@ -59,6 +59,8 @@ struct _KUSER_SHARED_DATA *user_shared_data = NULL;
|
||||
size_t user_shared_data_size = 0;
|
||||
static const WCHAR default_windirW[] = {'C',':','\\','w','i','n','d','o','w','s',0};
|
||||
|
||||
+extern void DECLSPEC_NORETURN __wine_syscall_dispatcher( void );
|
||||
@ -72,17 +72,13 @@ index 1650c17295a..0acc4d88524 100644
|
||||
void (WINAPI *kernel32_start_process)(LPTHREAD_START_ROUTINE,void*) = NULL;
|
||||
|
||||
/* info passed to a starting thread */
|
||||
@@ -327,6 +329,14 @@ TEB *thread_init(void)
|
||||
@@ -275,6 +277,10 @@ TEB *thread_init(void)
|
||||
InitializeListHead( &ldr.InInitializationOrderModuleList );
|
||||
*(ULONG_PTR *)peb->Reserved = get_image_addr();
|
||||
|
||||
+#if defined(__APPLE__) && defined(__x86_64__)
|
||||
+ *((DWORD*)((char*)user_shared_data_external + 0x1000)) = __wine_syscall_dispatcher;
|
||||
+#endif
|
||||
+ /* Pretend we don't support the SYSCALL instruction on x86-64. Needed for
|
||||
+ * Chromium; see output_syscall_thunks_x64() in winebuild. */
|
||||
+ user_shared_data->SystemCallPad[0] = 1;
|
||||
+ user_shared_data_external->SystemCallPad[0] = 1;
|
||||
+
|
||||
/*
|
||||
* Starting with Vista, the first user to log on has session id 1.
|
||||
|
Loading…
x
Reference in New Issue
Block a user