diff --git a/patches/ntdll-Hide_Wine_Exports/0001-ntdll-Add-support-for-hiding-wine-version-informatio.patch b/patches/ntdll-Hide_Wine_Exports/0001-ntdll-Add-support-for-hiding-wine-version-informatio.patch index 91aec80f..bf2a2240 100644 --- a/patches/ntdll-Hide_Wine_Exports/0001-ntdll-Add-support-for-hiding-wine-version-informatio.patch +++ b/patches/ntdll-Hide_Wine_Exports/0001-ntdll-Add-support-for-hiding-wine-version-informatio.patch @@ -1,4 +1,4 @@ -From 463baa9359f163b4e152f681a3703e602347ab04 Mon Sep 17 00:00:00 2001 +From dceb199f694af989df0655f7846a40ae29c67ea0 Mon Sep 17 00:00:00 2001 From: Sebastian Lackner Date: Sat, 30 May 2015 02:23:15 +0200 Subject: [PATCH] ntdll: Add support for hiding wine version information from @@ -10,10 +10,10 @@ Subject: [PATCH] ntdll: Add support for hiding wine version information from 2 files changed, 104 insertions(+), 1 deletion(-) diff --git a/dlls/ntdll/loader.c b/dlls/ntdll/loader.c -index 71efed5fa32..ec9ddc73e9c 100644 +index c471755139f..e36764d9a3e 100644 --- a/dlls/ntdll/loader.c +++ b/dlls/ntdll/loader.c -@@ -77,6 +77,7 @@ const WCHAR system_dir[] = {'C',':','\\','w','i','n','d','o','w','s','\\', +@@ -71,6 +71,7 @@ const WCHAR system_dir[] = {'C',':','\\','w','i','n','d','o','w','s','\\', const WCHAR syswow64_dir[] = {'C',':','\\','w','i','n','d','o','w','s','\\', 's','y','s','w','o','w','6','4','\\',0}; @@ -21,7 +21,7 @@ index 71efed5fa32..ec9ddc73e9c 100644 /* system search path */ static const WCHAR system_path[] = {'C',':','\\','w','i','n','d','o','w','s','\\','s','y','s','t','e','m','3','2',';', -@@ -85,6 +86,9 @@ static const WCHAR system_path[] = +@@ -79,6 +80,9 @@ static const WCHAR system_path[] = static const WCHAR dotW[] = {'.',0}; @@ -31,7 +31,7 @@ index 71efed5fa32..ec9ddc73e9c 100644 static BOOL imports_fixup_done = FALSE; /* set once the imports have been fixed up, before attaching them */ static BOOL process_detaching = FALSE; /* set on process detach to avoid deadlocks with thread detach */ static int free_lib_count; /* recursion depth of LdrUnloadDll calls */ -@@ -101,6 +105,8 @@ struct dll_dir_entry +@@ -95,6 +99,8 @@ struct dll_dir_entry static struct list dll_dir_list = LIST_INIT( dll_dir_list ); /* extra dirs from LdrAddDllDirectory */ @@ -40,7 +40,7 @@ index 71efed5fa32..ec9ddc73e9c 100644 struct ldr_notification { struct list entry; -@@ -1810,6 +1816,96 @@ NTSTATUS WINAPI LdrUnlockLoaderLock( ULONG flags, ULONG_PTR magic ) +@@ -1709,6 +1715,96 @@ NTSTATUS WINAPI LdrUnlockLoaderLock( ULONG flags, ULONG_PTR magic ) } @@ -137,7 +137,7 @@ index 71efed5fa32..ec9ddc73e9c 100644 /****************************************************************** * LdrGetProcedureAddress (NTDLL.@) */ -@@ -1830,7 +1926,7 @@ NTSTATUS WINAPI LdrGetProcedureAddress(HMODULE module, const ANSI_STRING *name, +@@ -1729,7 +1825,7 @@ NTSTATUS WINAPI LdrGetProcedureAddress(HMODULE module, const ANSI_STRING *name, LPCWSTR load_path = NtCurrentTeb()->Peb->ProcessParameters->DllPath.Buffer; void *proc = name ? find_named_export( module, exports, exp_size, name->Buffer, -1, load_path ) : find_ordinal_export( module, exports, exp_size, ord - exports->Base, load_path ); @@ -146,7 +146,7 @@ index 71efed5fa32..ec9ddc73e9c 100644 { *address = proc; ret = STATUS_SUCCESS; -@@ -4491,6 +4587,8 @@ void __wine_process_init(void) +@@ -4061,6 +4157,8 @@ void __wine_process_init(void) NtTerminateProcess( GetCurrentProcess(), status ); } @@ -156,10 +156,10 @@ index 71efed5fa32..ec9ddc73e9c 100644 /* elevate process if necessary */ diff --git a/dlls/ntdll/ntdll_misc.h b/dlls/ntdll/ntdll_misc.h -index dbd9a826429..b4666d82c8b 100644 +index 1afda71c3ad..d489b850963 100644 --- a/dlls/ntdll/ntdll_misc.h +++ b/dlls/ntdll/ntdll_misc.h -@@ -283,6 +283,11 @@ void WINAPI LdrInitializeThunk(CONTEXT*,void**,ULONG_PTR,ULONG_PTR); +@@ -153,6 +153,11 @@ void WINAPI LdrInitializeThunk(CONTEXT*,void**,ULONG_PTR,ULONG_PTR); #define InterlockedCompareExchange64(dest,xchg,cmp) RtlInterlockedCompareExchange64(dest,xchg,cmp) #endif @@ -168,9 +168,9 @@ index dbd9a826429..b4666d82c8b 100644 +extern const char * CDECL NTDLL_wine_get_build_id(void); +extern void CDECL NTDLL_wine_get_host_version( const char **sysname, const char **release ); + - /* process / thread time */ - extern BOOL read_process_time(int unix_pid, int unix_tid, unsigned long clk_tck, - LARGE_INTEGER *kernel, LARGE_INTEGER *user) DECLSPEC_HIDDEN; + /* string functions */ + void * __cdecl NTDLL_memchr( const void *ptr, int c, size_t n ); + char * __cdecl NTDLL_strcat( char *dst, const char *src ); -- -2.26.2 +2.27.0 diff --git a/patches/ntdll-Hide_Wine_Exports/definition b/patches/ntdll-Hide_Wine_Exports/definition index 0b58aa38..52e3041b 100644 --- a/patches/ntdll-Hide_Wine_Exports/definition +++ b/patches/ntdll-Hide_Wine_Exports/definition @@ -1,5 +1,3 @@ Fixes: [38656] Add support for hiding wine version information from applications Depends: ntdll-ThreadTime Depends: advapi32-Token_Integrity_Level -# Re-enable me when ntdll-ThreadTime gets re-enabled! -Disabled: true diff --git a/patches/ntdll-ThreadTime/0001-ntdll-Return-correct-values-in-GetThreadTimes-for-al.patch b/patches/ntdll-ThreadTime/0001-ntdll-Return-correct-values-in-GetThreadTimes-for-al.patch deleted file mode 100644 index 58a46b34..00000000 --- a/patches/ntdll-ThreadTime/0001-ntdll-Return-correct-values-in-GetThreadTimes-for-al.patch +++ /dev/null @@ -1,163 +0,0 @@ -From 4b31157383a5e422660c17d47fd4cda511a991a4 Mon Sep 17 00:00:00 2001 -From: Sebastian Lackner -Date: Fri, 7 Nov 2014 03:26:18 +0100 -Subject: [PATCH] ntdll: Return correct values in GetThreadTimes() for all - threads. - -Based on a patch by Ray Hinchliffe . ---- - dlls/ntdll/thread.c | 82 ++++++++++++++++++++++++++++++++++++++++++----------- - server/protocol.def | 2 ++ - server/thread.c | 2 ++ - 3 files changed, 69 insertions(+), 17 deletions(-) - -diff --git a/dlls/ntdll/thread.c b/dlls/ntdll/thread.c -index c999d4b..1491ebb 100644 ---- a/dlls/ntdll/thread.c -+++ b/dlls/ntdll/thread.c -@@ -23,6 +23,8 @@ - - #include - #include -+#include -+#include - #include - #include - #ifdef HAVE_SYS_MMAN_H -@@ -1017,7 +1019,10 @@ NTSTATUS WINAPI NtQueryInformationThread( HANDLE handle, THREADINFOCLASS class, - case ThreadTimes: - { - KERNEL_USER_TIMES kusrt; -+ int unix_pid, unix_tid; - -+ /* We need to do a server call to get the creation time, exit time, PID and TID */ -+ /* This works on any thread */ - SERVER_START_REQ( get_thread_times ) - { - req->handle = wine_server_obj_handle( handle ); -@@ -1026,36 +1031,79 @@ NTSTATUS WINAPI NtQueryInformationThread( HANDLE handle, THREADINFOCLASS class, - { - kusrt.CreateTime.QuadPart = reply->creation_time; - kusrt.ExitTime.QuadPart = reply->exit_time; -+ unix_pid = reply->unix_pid; -+ unix_tid = reply->unix_tid; - } - } - SERVER_END_REQ; - if (status == STATUS_SUCCESS) - { -- /* We call times(2) for kernel time or user time */ -- /* We can only (portably) do this for the current thread */ -- if (handle == GetCurrentThread()) -+ unsigned long clk_tck = sysconf(_SC_CLK_TCK); -+ BOOL filled_times = FALSE; -+ -+#ifdef __linux__ -+ /* only /proc provides exact values for a specific thread */ -+ if (unix_pid != -1 && unix_tid != -1) - { -- struct tms time_buf; -- long clocks_per_sec = sysconf(_SC_CLK_TCK); -+ unsigned long usr, sys; -+ char buf[512], *pos; -+ FILE *fp; -+ int i; -+ -+ /* based on https://github.com/torvalds/linux/blob/master/fs/proc/array.c */ -+ sprintf( buf, "/proc/%u/task/%u/stat", unix_pid, unix_tid ); -+ if ((fp = fopen( buf, "r" ))) -+ { -+ pos = fgets( buf, sizeof(buf), fp ); -+ fclose( fp ); -+ -+ /* format of first chunk is "%d (%s) %c" - we have to skip to the last ')' -+ * to avoid misinterpreting the string. */ -+ if (pos) pos = strrchr( pos, ')' ); -+ if (pos) pos = strchr( pos + 1, ' ' ); -+ if (pos) pos++; -+ -+ /* skip over the following fields: state, ppid, pgid, sid, tty_nr, tty_pgrp, -+ * task->flags, min_flt, cmin_flt, maj_flt, cmaj_flt */ -+ for (i = 0; (i < 11) && pos; i++) -+ { -+ pos = strchr( pos + 1, ' ' ); -+ if (pos) pos++; -+ } -+ -+ /* the next two values are user and system time */ -+ if (pos && (sscanf( pos, "%lu %lu", &usr, &sys ) == 2)) -+ { -+ kusrt.KernelTime.QuadPart = (ULONGLONG)sys * 10000000 / clk_tck; -+ kusrt.UserTime.QuadPart = (ULONGLONG)usr * 10000000 / clk_tck; -+ filled_times = TRUE; -+ } -+ } -+ } -+#endif - -+ /* get values for current process instead */ -+ if (!filled_times && handle == GetCurrentThread()) -+ { -+ struct tms time_buf; - times(&time_buf); -- kusrt.KernelTime.QuadPart = (ULONGLONG)time_buf.tms_stime * 10000000 / clocks_per_sec; -- kusrt.UserTime.QuadPart = (ULONGLONG)time_buf.tms_utime * 10000000 / clocks_per_sec; -+ -+ kusrt.KernelTime.QuadPart = (ULONGLONG)time_buf.tms_stime * 10000000 / clk_tck; -+ kusrt.UserTime.QuadPart = (ULONGLONG)time_buf.tms_utime * 10000000 / clk_tck; -+ filled_times = TRUE; - } -- else -+ -+ /* unable to determine exact values, fill with zero */ -+ if (!filled_times) - { -- static BOOL reported = FALSE; -+ static int once; -+ if (!once++) -+ FIXME("Cannot get kerneltime or usertime of other threads\n"); - - kusrt.KernelTime.QuadPart = 0; -- kusrt.UserTime.QuadPart = 0; -- if (reported) -- TRACE("Cannot get kerneltime or usertime of other threads\n"); -- else -- { -- FIXME("Cannot get kerneltime or usertime of other threads\n"); -- reported = TRUE; -- } -+ kusrt.UserTime.QuadPart = 0; - } -+ - if (data) memcpy( data, &kusrt, min( length, sizeof(kusrt) )); - if (ret_len) *ret_len = min( length, sizeof(kusrt) ); - } -diff --git a/server/protocol.def b/server/protocol.def -index 3bed47a..031b490 100644 ---- a/server/protocol.def -+++ b/server/protocol.def -@@ -908,6 +908,8 @@ struct rawinput_device - @REPLY - timeout_t creation_time; /* thread creation time */ - timeout_t exit_time; /* thread exit time */ -+ int unix_pid; /* thread native pid */ -+ int unix_tid; /* thread native pid */ - @END - - -diff --git a/server/thread.c b/server/thread.c -index 2cf5054..46fc9a7 100644 ---- a/server/thread.c -+++ b/server/thread.c -@@ -1413,6 +1413,8 @@ DECL_HANDLER(get_thread_times) - { - reply->creation_time = thread->creation_time; - reply->exit_time = thread->exit_time; -+ reply->unix_pid = thread->unix_pid; -+ reply->unix_tid = thread->unix_tid; - - release_object( thread ); - } --- -1.9.1 - diff --git a/patches/ntdll-ThreadTime/0002-ntdll-Set-correct-thread-creation-time-for-SystemPro.patch b/patches/ntdll-ThreadTime/0002-ntdll-Set-correct-thread-creation-time-for-SystemPro.patch index f72185ec..08061e17 100644 --- a/patches/ntdll-ThreadTime/0002-ntdll-Set-correct-thread-creation-time-for-SystemPro.patch +++ b/patches/ntdll-ThreadTime/0002-ntdll-Set-correct-thread-creation-time-for-SystemPro.patch @@ -1,46 +1,46 @@ -From e6832d1b0f923e7589424ade7571cc67dc768c4d Mon Sep 17 00:00:00 2001 +From be1561c5ef6fcc9ef06f998bc06ea245bd187915 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20M=C3=BCller?= Date: Thu, 9 Mar 2017 00:00:46 +0100 -Subject: ntdll: Set correct thread creation time for SystemProcessInformation - in NtQuerySystemInformation. +Subject: [PATCH] ntdll: Set correct thread creation time for + SystemProcessInformation in NtQuerySystemInformation. --- - dlls/ntdll/nt.c | 2 +- - server/protocol.def | 1 + - server/snapshot.c | 11 ++++++----- - server/thread.h | 1 + - 4 files changed, 9 insertions(+), 6 deletions(-) + dlls/ntdll/unix/system.c | 2 +- + server/protocol.def | 1 + + server/snapshot.c | 13 +++++++------ + server/thread.h | 1 + + 4 files changed, 10 insertions(+), 7 deletions(-) -diff --git a/dlls/ntdll/nt.c b/dlls/ntdll/nt.c -index 86beb031e9c..fc8e3b1eb4e 100644 ---- a/dlls/ntdll/nt.c -+++ b/dlls/ntdll/nt.c -@@ -2012,7 +2012,7 @@ NTSTATUS WINAPI NtQuerySystemInformation( +diff --git a/dlls/ntdll/unix/system.c b/dlls/ntdll/unix/system.c +index 7045bc1550b..f137ccf97a7 100644 +--- a/dlls/ntdll/unix/system.c ++++ b/dlls/ntdll/unix/system.c +@@ -2184,7 +2184,7 @@ NTSTATUS WINAPI NtQuerySystemInformation( SYSTEM_INFORMATION_CLASS class, + { + memset(&spi->ti[i], 0, sizeof(spi->ti)); - memset(&spi->ti[i], 0, sizeof(spi->ti)); - -- spi->ti[i].CreateTime.QuadPart = 0xdeadbeef; -+ spi->ti[i].CreateTime.QuadPart = reply->creation_time; - spi->ti[i].ClientId.UniqueProcess = UlongToHandle(reply->pid); - spi->ti[i].ClientId.UniqueThread = UlongToHandle(reply->tid); - spi->ti[i].dwCurrentPriority = reply->base_pri + reply->delta_pri; +- spi->ti[i].CreateTime.QuadPart = 0xdeadbeef; ++ spi->ti[i].CreateTime.QuadPart = reply->creation_time; + spi->ti[i].ClientId.UniqueProcess = UlongToHandle(pid); + spi->ti[i].ClientId.UniqueThread = UlongToHandle(tid); + spi->ti[i].dwCurrentPriority = base_pri + delta_pri; diff --git a/server/protocol.def b/server/protocol.def -index 60865a6ffc2..15adc51462f 100644 +index 38079f23daf..89a0332691c 100644 --- a/server/protocol.def +++ b/server/protocol.def -@@ -1783,6 +1783,7 @@ enum char_info_mode +@@ -1911,6 +1911,7 @@ enum char_info_mode int count; /* thread usage count */ process_id_t pid; /* process id */ thread_id_t tid; /* thread id */ + timeout_t creation_time; /* thread creation time */ int base_pri; /* base priority */ int delta_pri; /* delta priority */ - @END + int unix_tid; /* thread native pid */ diff --git a/server/snapshot.c b/server/snapshot.c -index e35588a136c..858fca898a7 100644 +index bdceaef5302..fe25e07e02a 100644 --- a/server/snapshot.c +++ b/server/snapshot.c -@@ -144,11 +144,12 @@ static int snapshot_next_thread( struct snapshot *snapshot, struct next_thread_r +@@ -145,12 +145,13 @@ static int snapshot_next_thread( struct snapshot *snapshot, struct next_thread_r return 0; } ptr = &snapshot->threads[snapshot->thread_pos++]; @@ -49,20 +49,22 @@ index e35588a136c..858fca898a7 100644 - reply->tid = get_thread_id( ptr->thread ); - reply->base_pri = ptr->priority; - reply->delta_pri = 0; /* FIXME */ +- reply->unix_tid = ptr->thread->unix_tid; + reply->count = ptr->count; + reply->pid = get_process_id( ptr->thread->process ); + reply->tid = get_thread_id( ptr->thread ); + reply->creation_time = get_thread_creation_time( ptr->thread ); + reply->base_pri = ptr->priority; + reply->delta_pri = 0; /* FIXME */ ++ reply->unix_tid = ptr->thread->unix_tid; return 1; } diff --git a/server/thread.h b/server/thread.h -index 282199149e6..2098c76a472 100644 +index 5d12d24dd89..43b17534693 100644 --- a/server/thread.h +++ b/server/thread.h -@@ -145,5 +145,6 @@ static inline void clear_error(void) { set_error(0); } +@@ -150,5 +150,6 @@ static inline void clear_error(void) { set_error(0); } static inline void set_win32_error( unsigned int err ) { set_error( 0xc0010000 | err ); } static inline thread_id_t get_thread_id( struct thread *thread ) { return thread->id; } @@ -70,5 +72,5 @@ index 282199149e6..2098c76a472 100644 #endif /* __WINE_SERVER_THREAD_H */ -- -2.11.0 +2.27.0 diff --git a/patches/ntdll-ThreadTime/0003-ntdll-Fill-process-kernel-and-user-time.patch b/patches/ntdll-ThreadTime/0003-ntdll-Fill-process-kernel-and-user-time.patch deleted file mode 100644 index 529f621e..00000000 --- a/patches/ntdll-ThreadTime/0003-ntdll-Fill-process-kernel-and-user-time.patch +++ /dev/null @@ -1,162 +0,0 @@ -From 2fb8a13c53a38377e8c64d202f91c2b5997669d7 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Michael=20M=C3=BCller?= -Date: Thu, 9 Mar 2017 16:27:23 +0100 -Subject: [PATCH] ntdll: Fill process kernel and user time. - ---- - dlls/ntdll/nt.c | 6 ++- - dlls/ntdll/ntdll_misc.h | 4 ++ - dlls/ntdll/thread.c | 84 +++++++++++++++++++++++------------------ - 3 files changed, 57 insertions(+), 37 deletions(-) - -diff --git a/dlls/ntdll/nt.c b/dlls/ntdll/nt.c -index 6f17225b983..bdd169fb335 100644 ---- a/dlls/ntdll/nt.c -+++ b/dlls/ntdll/nt.c -@@ -2646,6 +2646,7 @@ NTSTATUS WINAPI NtQuerySystemInformation( - { - SYSTEM_PROCESS_INFORMATION* spi = SystemInformation; - SYSTEM_PROCESS_INFORMATION* last = NULL; -+ unsigned long clk_tck = sysconf(_SC_CLK_TCK); - HANDLE hSnap = 0; - WCHAR procname[1024]; - WCHAR* exename; -@@ -2683,7 +2684,7 @@ NTSTATUS WINAPI NtQuerySystemInformation( - - if (Length >= len + procstructlen) - { -- /* ftCreationTime, ftUserTime, ftKernelTime; -+ /* ftCreationTime; - * vmCounters, ioCounters - */ - -@@ -2701,6 +2702,9 @@ NTSTATUS WINAPI NtQuerySystemInformation( - - /* spi->ti will be set later on */ - -+ if (reply->unix_pid != -1) -+ read_process_time(reply->unix_pid, -1, clk_tck, -+ &spi->KernelTime, &spi->UserTime); - } - len += procstructlen; - } -diff --git a/dlls/ntdll/ntdll_misc.h b/dlls/ntdll/ntdll_misc.h -index 27e7141bc65..f30cfa2e36b 100644 ---- a/dlls/ntdll/ntdll_misc.h -+++ b/dlls/ntdll/ntdll_misc.h -@@ -301,6 +301,10 @@ void WINAPI LdrInitializeThunk(CONTEXT*,void**,ULONG_PTR,ULONG_PTR); - #define InterlockedCompareExchange64(dest,xchg,cmp) RtlInterlockedCompareExchange64(dest,xchg,cmp) - #endif - -+/* process / thread time */ -+extern BOOL read_process_time(int unix_pid, int unix_tid, unsigned long clk_tck, -+ LARGE_INTEGER *kernel, LARGE_INTEGER *user) DECLSPEC_HIDDEN; -+ - /* string functions */ - int __cdecl NTDLL_tolower( int c ); - int __cdecl _stricmp( LPCSTR str1, LPCSTR str2 ); -diff --git a/dlls/ntdll/thread.c b/dlls/ntdll/thread.c -index de355c51fdd..18f4f5533e2 100644 ---- a/dlls/ntdll/thread.c -+++ b/dlls/ntdll/thread.c -@@ -154,6 +154,53 @@ static ULONG_PTR get_image_addr(void) - #endif - - -+ -+BOOL read_process_time(int unix_pid, int unix_tid, unsigned long clk_tck, -+ LARGE_INTEGER *kernel, LARGE_INTEGER *user) -+{ -+#ifdef __linux__ -+ unsigned long usr, sys; -+ char buf[512], *pos; -+ FILE *fp; -+ int i; -+ -+ /* based on https://github.com/torvalds/linux/blob/master/fs/proc/array.c */ -+ if (unix_tid != -1) -+ sprintf( buf, "/proc/%u/task/%u/stat", unix_pid, unix_tid ); -+ else -+ sprintf( buf, "/proc/%u/stat", unix_pid ); -+ if ((fp = fopen( buf, "r" ))) -+ { -+ pos = fgets( buf, sizeof(buf), fp ); -+ fclose( fp ); -+ -+ /* format of first chunk is "%d (%s) %c" - we have to skip to the last ')' -+ * to avoid misinterpreting the string. */ -+ if (pos) pos = strrchr( pos, ')' ); -+ if (pos) pos = strchr( pos + 1, ' ' ); -+ if (pos) pos++; -+ -+ /* skip over the following fields: state, ppid, pgid, sid, tty_nr, tty_pgrp, -+ * task->flags, min_flt, cmin_flt, maj_flt, cmaj_flt */ -+ for (i = 0; (i < 11) && pos; i++) -+ { -+ pos = strchr( pos + 1, ' ' ); -+ if (pos) pos++; -+ } -+ -+ /* the next two values are user and system time */ -+ if (pos && (sscanf( pos, "%lu %lu", &usr, &sys ) == 2)) -+ { -+ kernel->QuadPart = (ULONGLONG)sys * 10000000 / clk_tck; -+ user->QuadPart = (ULONGLONG)usr * 10000000 / clk_tck; -+ return TRUE; -+ } -+ } -+#endif -+ return FALSE; -+} -+ -+ - /*********************************************************************** - * __wine_dbg_get_channel_flags (NTDLL.@) - * -@@ -988,42 +1035,7 @@ NTSTATUS WINAPI NtQueryInformationThread( HANDLE handle, THREADINFOCLASS class, - #ifdef __linux__ - /* only /proc provides exact values for a specific thread */ - if (unix_pid != -1 && unix_tid != -1) -- { -- unsigned long usr, sys; -- char buf[512], *pos; -- FILE *fp; -- int i; -- -- /* based on https://github.com/torvalds/linux/blob/master/fs/proc/array.c */ -- sprintf( buf, "/proc/%u/task/%u/stat", unix_pid, unix_tid ); -- if ((fp = fopen( buf, "r" ))) -- { -- pos = fgets( buf, sizeof(buf), fp ); -- fclose( fp ); -- -- /* format of first chunk is "%d (%s) %c" - we have to skip to the last ')' -- * to avoid misinterpreting the string. */ -- if (pos) pos = strrchr( pos, ')' ); -- if (pos) pos = strchr( pos + 1, ' ' ); -- if (pos) pos++; -- -- /* skip over the following fields: state, ppid, pgid, sid, tty_nr, tty_pgrp, -- * task->flags, min_flt, cmin_flt, maj_flt, cmaj_flt */ -- for (i = 0; (i < 11) && pos; i++) -- { -- pos = strchr( pos + 1, ' ' ); -- if (pos) pos++; -- } -- -- /* the next two values are user and system time */ -- if (pos && (sscanf( pos, "%lu %lu", &usr, &sys ) == 2)) -- { -- kusrt.KernelTime.QuadPart = (ULONGLONG)sys * 10000000 / clk_tck; -- kusrt.UserTime.QuadPart = (ULONGLONG)usr * 10000000 / clk_tck; -- filled_times = TRUE; -- } -- } -- } -+ filled_times = read_process_time(unix_pid, unix_tid, clk_tck, &kusrt.KernelTime, &kusrt.UserTime); - #endif - - /* get values for current process instead */ --- -2.26.2 - diff --git a/patches/ntdll-ThreadTime/0004-ntdll-Set-process-start-time.patch b/patches/ntdll-ThreadTime/0004-ntdll-Set-process-start-time.patch index e905d254..10bdb13e 100644 --- a/patches/ntdll-ThreadTime/0004-ntdll-Set-process-start-time.patch +++ b/patches/ntdll-ThreadTime/0004-ntdll-Set-process-start-time.patch @@ -1,31 +1,31 @@ -From e048ad0cd3879fb8f752af7e2eeda770864f9982 Mon Sep 17 00:00:00 2001 +From 72c4b3f95ad4c8a8ed31ad61c3678cf7d534fba9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20M=C3=BCller?= Date: Thu, 9 Mar 2017 16:32:59 +0100 -Subject: ntdll: Set process start time. +Subject: [PATCH] ntdll: Set process start time. --- - dlls/ntdll/nt.c | 1 + - server/protocol.def | 1 + - server/snapshot.c | 15 ++++++++------- + dlls/ntdll/unix/system.c | 1 + + server/protocol.def | 1 + + server/snapshot.c | 15 ++++++++------- 3 files changed, 10 insertions(+), 7 deletions(-) -diff --git a/dlls/ntdll/nt.c b/dlls/ntdll/nt.c -index 03cfd032bc..45572cb393 100644 ---- a/dlls/ntdll/nt.c -+++ b/dlls/ntdll/nt.c -@@ -2058,6 +2058,7 @@ NTSTATUS WINAPI NtQuerySystemInformation( - spi->UniqueProcessId = UlongToHandle(reply->pid); - spi->ParentProcessId = UlongToHandle(reply->ppid); - spi->HandleCount = reply->handles; -+ spi->CreationTime.QuadPart = reply->start_time; +diff --git a/dlls/ntdll/unix/system.c b/dlls/ntdll/unix/system.c +index f137ccf97a7..94915bd9e47 100644 +--- a/dlls/ntdll/unix/system.c ++++ b/dlls/ntdll/unix/system.c +@@ -2137,6 +2137,7 @@ NTSTATUS WINAPI NtQuerySystemInformation( SYSTEM_INFORMATION_CLASS class, + spi->UniqueProcessId = UlongToHandle(reply->pid); + spi->ParentProcessId = UlongToHandle(reply->ppid); + spi->HandleCount = reply->handles; ++ spi->CreationTime.QuadPart = reply->start_time; - /* spi->ti will be set later on */ + /* spi->ti will be set later on */ diff --git a/server/protocol.def b/server/protocol.def -index 320e34384a..1347defe70 100644 +index 89a0332691c..b29e014958e 100644 --- a/server/protocol.def +++ b/server/protocol.def -@@ -1808,6 +1808,7 @@ enum char_info_mode +@@ -1899,6 +1899,7 @@ enum char_info_mode int priority; /* process priority */ int handles; /* number of handles */ int unix_pid; /* Unix pid */ @@ -34,7 +34,7 @@ index 320e34384a..1347defe70 100644 @END diff --git a/server/snapshot.c b/server/snapshot.c -index f2903d522e..e509e0aca9 100644 +index fe25e07e02a..b6b790e21bd 100644 --- a/server/snapshot.c +++ b/server/snapshot.c @@ -114,13 +114,14 @@ static int snapshot_next_process( struct snapshot *snapshot, struct next_process @@ -60,5 +60,5 @@ index f2903d522e..e509e0aca9 100644 { data_size_t len = min( exe_module->namelen, get_reply_max_size() ); -- -2.11.0 +2.27.0 diff --git a/patches/ntdll-ThreadTime/0005-ntdll-Fill-out-thread-times-in-process-enumeration.patch b/patches/ntdll-ThreadTime/0005-ntdll-Fill-out-thread-times-in-process-enumeration.patch deleted file mode 100644 index 0c317b37..00000000 --- a/patches/ntdll-ThreadTime/0005-ntdll-Fill-out-thread-times-in-process-enumeration.patch +++ /dev/null @@ -1,82 +0,0 @@ -From 6c3b7e0065c239b488bb224c1c67ff971562fdca Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Michael=20M=C3=BCller?= -Date: Thu, 9 Mar 2017 21:14:13 +0100 -Subject: ntdll: Fill out thread times in process enumeration. - ---- - dlls/ntdll/nt.c | 6 ++++++ - server/protocol.def | 1 + - server/snapshot.c | 1 + - server/thread.h | 1 + - 4 files changed, 9 insertions(+) - -diff --git a/dlls/ntdll/nt.c b/dlls/ntdll/nt.c -index 8c54e7edfb..8b84cd865b 100644 ---- a/dlls/ntdll/nt.c -+++ b/dlls/ntdll/nt.c -@@ -1928,6 +1928,7 @@ NTSTATUS WINAPI NtQuerySystemInformation( - WCHAR* exename; - DWORD wlen = 0; - DWORD procstructlen = 0; -+ int unix_pid = -1; - - SERVER_START_REQ( create_snapshot ) - { -@@ -1982,6 +1983,7 @@ NTSTATUS WINAPI NtQuerySystemInformation( - if (reply->unix_pid != -1) - read_process_time(reply->unix_pid, -1, clk_tck, - &spi->KernelTime, &spi->UserTime); -+ unix_pid = reply->unix_pid; - } - len += procstructlen; - } -@@ -2022,6 +2024,10 @@ NTSTATUS WINAPI NtQuerySystemInformation( - spi->ti[i].ClientId.UniqueThread = UlongToHandle(reply->tid); - spi->ti[i].dwCurrentPriority = reply->base_pri + reply->delta_pri; - spi->ti[i].dwBasePriority = reply->base_pri; -+ -+ if (unix_pid != -1 && reply->unix_tid != -1) -+ read_process_time(unix_pid, reply->unix_tid, clk_tck, -+ &spi->ti[i].KernelTime, &spi->ti[i].UserTime); - i++; - } - } -diff --git a/server/protocol.def b/server/protocol.def -index b0b837cb93..542060decd 100644 ---- a/server/protocol.def -+++ b/server/protocol.def -@@ -1789,6 +1789,7 @@ enum char_info_mode - timeout_t creation_time; /* thread creation time */ - int base_pri; /* base priority */ - int delta_pri; /* delta priority */ -+ int unix_tid; /* Unix tid */ - @END - - -diff --git a/server/snapshot.c b/server/snapshot.c -index cc8a9be1b5..a32207c720 100644 ---- a/server/snapshot.c -+++ b/server/snapshot.c -@@ -151,6 +151,7 @@ static int snapshot_next_thread( struct snapshot *snapshot, struct next_thread_r - reply->creation_time = get_thread_creation_time( ptr->thread ); - reply->base_pri = ptr->priority; - reply->delta_pri = 0; /* FIXME */ -+ reply->unix_tid = get_thread_unix_tid( ptr->thread ); - return 1; - } - -diff --git a/server/thread.h b/server/thread.h -index 2098c76a47..9614e2140d 100644 ---- a/server/thread.h -+++ b/server/thread.h -@@ -145,6 +145,7 @@ static inline void clear_error(void) { set_error(0); } - static inline void set_win32_error( unsigned int err ) { set_error( 0xc0010000 | err ); } - - static inline thread_id_t get_thread_id( struct thread *thread ) { return thread->id; } -+static inline int get_thread_unix_tid( struct thread *thread ) { return thread->unix_tid; } - static inline timeout_t get_thread_creation_time( struct thread *thread ) { return thread->creation_time; } - - #endif /* __WINE_SERVER_THREAD_H */ --- -2.11.0 - diff --git a/patches/ntdll-ThreadTime/definition b/patches/ntdll-ThreadTime/definition index 7693a411..95158a91 100644 --- a/patches/ntdll-ThreadTime/definition +++ b/patches/ntdll-ThreadTime/definition @@ -1,5 +1,2 @@ -Fixes: [20230] Return correct values for GetThreadTimes function Fixes: Return correct thread creation time in SystemProcessInformation Fixes: Fill process virtual memory counters in NtQuerySystemInformation -# Split awkwardly between .so and .dll parts (NtQuerySystemInformation vs NtQueryProcess/ThreadInformation). -Disabled: true diff --git a/patches/ntdll-ThreadTime/0006-ntdll-Fill-process-virtual-memory-counters-in-NtQuer.patch b/patches/ntdll-ThreadTime/xxx6-ntdll-Fill-process-virtual-memory-counters-in-NtQuer.patch similarity index 100% rename from patches/ntdll-ThreadTime/0006-ntdll-Fill-process-virtual-memory-counters-in-NtQuer.patch rename to patches/ntdll-ThreadTime/xxx6-ntdll-Fill-process-virtual-memory-counters-in-NtQuer.patch diff --git a/patches/patchinstall.sh b/patches/patchinstall.sh index 1017d098..4c153e8c 100755 --- a/patches/patchinstall.sh +++ b/patches/patchinstall.sh @@ -176,6 +176,7 @@ patch_enable_all () enable_ntdll_ForceBottomUpAlloc="$1" enable_ntdll_HashLinks="$1" enable_ntdll_Heap_Improvements="$1" + enable_ntdll_Hide_Wine_Exports="$1" enable_ntdll_Interrupt_0x2e="$1" enable_ntdll_Junction_Points="$1" enable_ntdll_Manifest_Range="$1" @@ -194,6 +195,7 @@ patch_enable_all () enable_ntdll_SystemInterruptInformation="$1" enable_ntdll_SystemModuleInformation="$1" enable_ntdll_SystemRoot_Symlink="$1" + enable_ntdll_ThreadTime="$1" enable_ntdll_WRITECOPY="$1" enable_ntdll_Zero_mod_name="$1" enable_ntdll_aarch_TEB="$1" @@ -223,6 +225,7 @@ patch_enable_all () enable_server_Inherited_ACLs="$1" enable_server_Object_Types="$1" enable_server_PeekMessage="$1" + enable_server_Realtime_Priority="$1" enable_server_Registry_Notifications="$1" enable_server_Signal_Thread="$1" enable_server_Stored_ACLs="$1" @@ -612,6 +615,9 @@ patch_enable () ntdll-Heap_Improvements) enable_ntdll_Heap_Improvements="$2" ;; + ntdll-Hide_Wine_Exports) + enable_ntdll_Hide_Wine_Exports="$2" + ;; ntdll-Interrupt-0x2e) enable_ntdll_Interrupt_0x2e="$2" ;; @@ -666,6 +672,9 @@ patch_enable () ntdll-SystemRoot_Symlink) enable_ntdll_SystemRoot_Symlink="$2" ;; + ntdll-ThreadTime) + enable_ntdll_ThreadTime="$2" + ;; ntdll-WRITECOPY) enable_ntdll_WRITECOPY="$2" ;; @@ -753,6 +762,9 @@ patch_enable () server-PeekMessage) enable_server_PeekMessage="$2" ;; + server-Realtime_Priority) + enable_server_Realtime_Priority="$2" + ;; server-Registry_Notifications) enable_server_Registry_Notifications="$2" ;; @@ -1505,6 +1517,13 @@ if test "$enable_shell32_Progress_Dialog" -eq 1; then enable_shell32_SHFileOperation_Move=1 fi +if test "$enable_server_Realtime_Priority" -eq 1; then + if test "$enable_ntdll_ThreadTime" -gt 1; then + abort "Patchset ntdll-ThreadTime disabled, but server-Realtime_Priority depends on that." + fi + enable_ntdll_ThreadTime=1 +fi + if test "$enable_server_Object_Types" -eq 1; then if test "$enable_ntdll_SystemModuleInformation" -gt 1; then abort "Patchset ntdll-SystemModuleInformation disabled, but server-Object_Types depends on that." @@ -1586,6 +1605,17 @@ if test "$enable_ntdll_Junction_Points" -eq 1; then enable_ntdll_DOS_Attributes=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_Builtin_Prot" -eq 1; then if test "$enable_ntdll_WRITECOPY" -gt 1; then abort "Patchset ntdll-WRITECOPY disabled, but ntdll-Builtin_Prot depends on that." @@ -3573,6 +3603,38 @@ if test "$enable_ntdll_Heap_Improvements" -eq 1; then ) >> "$patchlist" fi +# Patchset ntdll-ThreadTime +# | +# | Modified files: +# | * dlls/ntdll/unix/system.c, server/protocol.def, server/snapshot.c, server/thread.h +# | +if test "$enable_ntdll_ThreadTime" -eq 1; then + patch_apply ntdll-ThreadTime/0002-ntdll-Set-correct-thread-creation-time-for-SystemPro.patch + patch_apply ntdll-ThreadTime/0004-ntdll-Set-process-start-time.patch + ( + printf '%s\n' '+ { "Michael Müller", "ntdll: Set correct thread creation time for SystemProcessInformation in NtQuerySystemInformation.", 1 },'; + printf '%s\n' '+ { "Michael Müller", "ntdll: Set process start time.", 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-Interrupt-0x2e # | # | This patchset fixes the following Wine bugs: @@ -4393,6 +4455,21 @@ if test "$enable_server_PeekMessage" -eq 1; then ) >> "$patchlist" fi +# Patchset server-Realtime_Priority +# | +# | This patchset has the following (direct or indirect) dependencies: +# | * ntdll-ThreadTime +# | +# | Modified files: +# | * server/Makefile.in, server/main.c, server/scheduler.c, server/thread.c, server/thread.h +# | +if test "$enable_server_Realtime_Priority" -eq 1; then + patch_apply server-Realtime_Priority/0001-wineserver-Draft-to-implement-priority-levels-throug.patch + ( + printf '%s\n' '+ { "Joakim Hernberg", "wineserver: Draft to implement priority levels through POSIX scheduling policies on linux.", 1 },'; + ) >> "$patchlist" +fi + # Patchset server-Registry_Notifications # | # | Modified files: diff --git a/patches/server-Realtime_Priority/0001-wineserver-Draft-to-implement-priority-levels-throug.patch b/patches/server-Realtime_Priority/0001-wineserver-Draft-to-implement-priority-levels-throug.patch index 4691e814..ea32210e 100644 --- a/patches/server-Realtime_Priority/0001-wineserver-Draft-to-implement-priority-levels-throug.patch +++ b/patches/server-Realtime_Priority/0001-wineserver-Draft-to-implement-priority-levels-throug.patch @@ -1,4 +1,4 @@ -From c85f5ea67bddac0afecdf6d0cd54bf3c6c4df42d Mon Sep 17 00:00:00 2001 +From 98bc215910ff978093b666607f2cff3f1c93b7d3 Mon Sep 17 00:00:00 2001 From: Joakim Hernberg Date: Tue, 31 Mar 2015 20:58:20 +0200 Subject: [PATCH] wineserver: Draft to implement priority levels through POSIX @@ -215,10 +215,10 @@ index 00000000000..4a5d82b208d + +#endif diff --git a/server/thread.c b/server/thread.c -index d6d80a9a864..f161c8f3e24 100644 +index 23c0538150f..7feda374487 100644 --- a/server/thread.c +++ b/server/thread.c -@@ -539,7 +539,10 @@ static void set_thread_info( struct thread *thread, +@@ -607,7 +607,10 @@ static void set_thread_info( struct thread *thread, if ((req->priority >= min && req->priority <= max) || req->priority == THREAD_PRIORITY_IDLE || req->priority == THREAD_PRIORITY_TIME_CRITICAL) @@ -230,11 +230,11 @@ index d6d80a9a864..f161c8f3e24 100644 set_error( STATUS_INVALID_PARAMETER ); } diff --git a/server/thread.h b/server/thread.h -index 26dbc494f3c..7957557b6cc 100644 +index 43b17534693..924f28a8697 100644 --- a/server/thread.h +++ b/server/thread.h -@@ -154,4 +154,9 @@ static inline thread_id_t get_thread_id( struct thread *thread ) { return thread - static inline int get_thread_unix_tid( struct thread *thread ) { return thread->unix_tid; } +@@ -152,4 +152,9 @@ static inline void set_win32_error( unsigned int err ) { set_error( 0xc0010000 | + static inline thread_id_t get_thread_id( struct thread *thread ) { return thread->id; } static inline timeout_t get_thread_creation_time( struct thread *thread ) { return thread->creation_time; } +/* scheduler functions */ @@ -244,5 +244,5 @@ index 26dbc494f3c..7957557b6cc 100644 + #endif /* __WINE_SERVER_THREAD_H */ -- -2.26.0 +2.27.0 diff --git a/patches/server-Realtime_Priority/definition b/patches/server-Realtime_Priority/definition index 1d17edf2..de7045a9 100644 --- a/patches/server-Realtime_Priority/definition +++ b/patches/server-Realtime_Priority/definition @@ -1,4 +1,2 @@ Fixes: Support for linux priority levels for faster performance Depends: ntdll-ThreadTime -# Re-enable me when ntdll-ThreadTime gets re-enabled! -Disabled: true