mirror of
https://gitlab.winehq.org/wine/wine-staging.git
synced 2025-01-28 22:04:43 -08:00
ntdll-NtAlertThreadByThreadId: Use a lock-free (list of) arrays to map thread IDs to addresses.
This commit is contained in:
parent
350eb136a5
commit
b8ca0eae9f
@ -1,156 +0,0 @@
|
||||
From a9f438755a74e85cfb3b9dd122058c722ffa2f3c Mon Sep 17 00:00:00 2001
|
||||
From: Zebediah Figura <z.figura12@gmail.com>
|
||||
Date: Wed, 28 Oct 2020 17:31:00 -0500
|
||||
Subject: [PATCH 08/13] ntdll: Use a separate lock to access the PE TEB list.
|
||||
|
||||
Signed-off-by: Zebediah Figura <z.figura12@gmail.com>
|
||||
---
|
||||
dlls/ntdll/loader.c | 70 +++++++++++++++++++++++++++++++++++++++++----
|
||||
1 file changed, 64 insertions(+), 6 deletions(-)
|
||||
|
||||
diff --git a/dlls/ntdll/loader.c b/dlls/ntdll/loader.c
|
||||
index 45ad496fd64..26443a8c4f4 100644
|
||||
--- a/dlls/ntdll/loader.c
|
||||
+++ b/dlls/ntdll/loader.c
|
||||
@@ -127,7 +127,6 @@ typedef struct _wine_modref
|
||||
|
||||
static UINT tls_module_count; /* number of modules with TLS directory */
|
||||
static IMAGE_TLS_DIRECTORY *tls_dirs; /* array of TLS directories */
|
||||
-LIST_ENTRY tls_links = { &tls_links, &tls_links };
|
||||
|
||||
static RTL_CRITICAL_SECTION loader_section;
|
||||
static RTL_CRITICAL_SECTION_DEBUG critsect_debug =
|
||||
@@ -184,6 +183,55 @@ static inline BOOL contains_path( LPCWSTR name )
|
||||
return ((*name && (name[1] == ':')) || wcschr(name, '/') || wcschr(name, '\\'));
|
||||
}
|
||||
|
||||
+/* We need to access this lock from inside the implementation of (process-local)
|
||||
+ * synchronization functions, which makes actually scheduling more than a little
|
||||
+ * difficult.
|
||||
+ *
|
||||
+ * On the other hand, we want to make this a read/write lock, not just to avoid
|
||||
+ * lock contention, but also because lock contention is particularly expensive
|
||||
+ * for a spinlock.
|
||||
+ */
|
||||
+LIST_ENTRY tls_links = { &tls_links, &tls_links };
|
||||
+static LONG teb_spinlock;
|
||||
+
|
||||
+#define TEB_SPINLOCK_WRITE (-1)
|
||||
+
|
||||
+static inline void small_pause(void)
|
||||
+{
|
||||
+#ifdef __i386__
|
||||
+ __asm__ __volatile__( "rep;nop" : : : "memory" );
|
||||
+#else
|
||||
+ __asm__ __volatile__( "" : : : "memory" );
|
||||
+#endif
|
||||
+}
|
||||
+
|
||||
+static void teb_list_rdlock(void)
|
||||
+{
|
||||
+ for (;;)
|
||||
+ {
|
||||
+ LONG old = teb_spinlock;
|
||||
+ if (old != TEB_SPINLOCK_WRITE && InterlockedCompareExchange( &teb_spinlock, old + 1, old ) == old)
|
||||
+ return;
|
||||
+ small_pause();
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+static void teb_list_rdunlock(void)
|
||||
+{
|
||||
+ InterlockedDecrement( &teb_spinlock );
|
||||
+}
|
||||
+
|
||||
+static void teb_list_wrlock(void)
|
||||
+{
|
||||
+ while (InterlockedCompareExchange( &teb_spinlock, TEB_SPINLOCK_WRITE, 0 ))
|
||||
+ small_pause();
|
||||
+}
|
||||
+
|
||||
+static void teb_list_wrunlock(void)
|
||||
+{
|
||||
+ InterlockedExchange( &teb_spinlock, 0 );
|
||||
+}
|
||||
+
|
||||
#define RTL_UNLOAD_EVENT_TRACE_NUMBER 64
|
||||
|
||||
typedef struct _RTL_UNLOAD_EVENT_TRACE
|
||||
@@ -991,13 +1039,18 @@ static SHORT alloc_tls_slot( LDR_DATA_TABLE_ENTRY *mod )
|
||||
if (!new_ptr) return -1;
|
||||
|
||||
/* resize the pointer block in all running threads */
|
||||
+ teb_list_rdlock();
|
||||
for (entry = tls_links.Flink; entry != &tls_links; entry = entry->Flink)
|
||||
{
|
||||
TEB *teb = CONTAINING_RECORD( entry, TEB, TlsLinks );
|
||||
void **old = teb->ThreadLocalStoragePointer;
|
||||
void **new = RtlAllocateHeap( GetProcessHeap(), HEAP_ZERO_MEMORY, new_count * sizeof(*new));
|
||||
|
||||
- if (!new) return -1;
|
||||
+ if (!new)
|
||||
+ {
|
||||
+ teb_list_rdunlock();
|
||||
+ return -1;
|
||||
+ }
|
||||
if (old) memcpy( new, old, tls_module_count * sizeof(*new) );
|
||||
teb->ThreadLocalStoragePointer = new;
|
||||
#ifdef __x86_64__ /* macOS-specific hack */
|
||||
@@ -1006,12 +1059,14 @@ static SHORT alloc_tls_slot( LDR_DATA_TABLE_ENTRY *mod )
|
||||
TRACE( "thread %04lx tls block %p -> %p\n", (ULONG_PTR)teb->ClientId.UniqueThread, old, new );
|
||||
/* FIXME: can't free old block here, should be freed at thread exit */
|
||||
}
|
||||
+ teb_list_rdunlock();
|
||||
|
||||
tls_dirs = new_ptr;
|
||||
tls_module_count = new_count;
|
||||
}
|
||||
|
||||
/* allocate the data block in all running threads */
|
||||
+ teb_list_rdlock();
|
||||
for (entry = tls_links.Flink; entry != &tls_links; entry = entry->Flink)
|
||||
{
|
||||
TEB *teb = CONTAINING_RECORD( entry, TEB, TlsLinks );
|
||||
@@ -1026,6 +1081,7 @@ static SHORT alloc_tls_slot( LDR_DATA_TABLE_ENTRY *mod )
|
||||
RtlFreeHeap( GetProcessHeap(), 0,
|
||||
InterlockedExchangePointer( (void **)teb->ThreadLocalStoragePointer + i, new_ptr ));
|
||||
}
|
||||
+ teb_list_rdunlock();
|
||||
|
||||
*(DWORD *)dir->AddressOfIndex = i;
|
||||
tls_dirs[i] = *dir;
|
||||
@@ -3243,7 +3299,9 @@ void WINAPI LdrShutdownThread(void)
|
||||
if (wm->ldr.TlsIndex != -1) call_tls_callbacks( wm->ldr.DllBase, DLL_THREAD_DETACH );
|
||||
|
||||
RtlAcquirePebLock();
|
||||
+ teb_list_wrlock();
|
||||
RemoveEntryList( &NtCurrentTeb()->TlsLinks );
|
||||
+ teb_list_wrunlock();
|
||||
if ((pointers = NtCurrentTeb()->ThreadLocalStoragePointer))
|
||||
{
|
||||
for (i = 0; i < tls_module_count; i++) RtlFreeHeap( GetProcessHeap(), 0, pointers[i] );
|
||||
@@ -3480,6 +3538,10 @@ void WINAPI LdrInitializeThunk( CONTEXT *context, ULONG_PTR unknown2, ULONG_PTR
|
||||
|
||||
if (process_detaching) NtTerminateThread( GetCurrentThread(), 0 );
|
||||
|
||||
+ teb_list_wrlock();
|
||||
+ InsertHeadList( &tls_links, &NtCurrentTeb()->TlsLinks );
|
||||
+ teb_list_wrunlock();
|
||||
+
|
||||
RtlEnterCriticalSection( &loader_section );
|
||||
|
||||
wm = get_modref( NtCurrentTeb()->Peb->ImageBaseAddress );
|
||||
@@ -3502,10 +3564,6 @@ void WINAPI LdrInitializeThunk( CONTEXT *context, ULONG_PTR unknown2, ULONG_PTR
|
||||
imports_fixup_done = TRUE;
|
||||
}
|
||||
|
||||
- RtlAcquirePebLock();
|
||||
- InsertHeadList( &tls_links, &NtCurrentTeb()->TlsLinks );
|
||||
- RtlReleasePebLock();
|
||||
-
|
||||
NtCurrentTeb()->FlsSlots = fls_alloc_data();
|
||||
|
||||
if (!attach_done) /* first time around */
|
||||
--
|
||||
2.29.2
|
||||
|
@ -1,56 +1,18 @@
|
||||
From e27be2eef2738f6c7f213d70ee5554b052d07ec1 Mon Sep 17 00:00:00 2001
|
||||
From c5833a431cf9ba59f1f04081a2be058833b4cbb8 Mon Sep 17 00:00:00 2001
|
||||
From: Zebediah Figura <z.figura12@gmail.com>
|
||||
Date: Mon, 2 Nov 2020 20:24:07 -0600
|
||||
Subject: [PATCH 09/13] ntdll: Reimplement Win32 futexes on top of thread-ID
|
||||
alerts.
|
||||
Subject: [PATCH] ntdll: Reimplement Win32 futexes on top of thread-ID alerts.
|
||||
|
||||
Signed-off-by: Zebediah Figura <z.figura12@gmail.com>
|
||||
---
|
||||
dlls/ntdll/loader.c | 4 +-
|
||||
dlls/ntdll/ntdll_misc.h | 2 +
|
||||
dlls/ntdll/sync.c | 77 ++++++++++++++++++-
|
||||
dlls/ntdll/sync.c | 147 ++++++++++++++++++++++++++++++++++-
|
||||
dlls/ntdll/unix/loader.c | 3 -
|
||||
dlls/ntdll/unix/sync.c | 162 ---------------------------------------
|
||||
dlls/ntdll/unixlib.h | 6 +-
|
||||
6 files changed, 79 insertions(+), 175 deletions(-)
|
||||
4 files changed, 145 insertions(+), 173 deletions(-)
|
||||
|
||||
diff --git a/dlls/ntdll/loader.c b/dlls/ntdll/loader.c
|
||||
index 26443a8c4f4..440a77d4063 100644
|
||||
--- a/dlls/ntdll/loader.c
|
||||
+++ b/dlls/ntdll/loader.c
|
||||
@@ -205,7 +205,7 @@ static inline void small_pause(void)
|
||||
#endif
|
||||
}
|
||||
|
||||
-static void teb_list_rdlock(void)
|
||||
+void teb_list_rdlock(void)
|
||||
{
|
||||
for (;;)
|
||||
{
|
||||
@@ -216,7 +216,7 @@ static void teb_list_rdlock(void)
|
||||
}
|
||||
}
|
||||
|
||||
-static void teb_list_rdunlock(void)
|
||||
+void teb_list_rdunlock(void)
|
||||
{
|
||||
InterlockedDecrement( &teb_spinlock );
|
||||
}
|
||||
diff --git a/dlls/ntdll/ntdll_misc.h b/dlls/ntdll/ntdll_misc.h
|
||||
index 41e8666a25c..6a46946b218 100644
|
||||
--- a/dlls/ntdll/ntdll_misc.h
|
||||
+++ b/dlls/ntdll/ntdll_misc.h
|
||||
@@ -71,6 +71,8 @@ extern BOOL is_wow64 DECLSPEC_HIDDEN;
|
||||
|
||||
/* module handling */
|
||||
extern LIST_ENTRY tls_links DECLSPEC_HIDDEN;
|
||||
+extern void teb_list_rdlock(void) DECLSPEC_HIDDEN;
|
||||
+extern void teb_list_rdunlock(void) DECLSPEC_HIDDEN;
|
||||
extern FARPROC RELAY_GetProcAddress( HMODULE module, const IMAGE_EXPORT_DIRECTORY *exports,
|
||||
DWORD exp_size, FARPROC proc, DWORD ordinal, const WCHAR *user ) DECLSPEC_HIDDEN;
|
||||
extern FARPROC SNOOP_GetProcAddress( HMODULE hmod, const IMAGE_EXPORT_DIRECTORY *exports, DWORD exp_size,
|
||||
diff --git a/dlls/ntdll/sync.c b/dlls/ntdll/sync.c
|
||||
index 8df7015df9f..05bccf698b6 100644
|
||||
index 8df7015df9f..be462f27881 100644
|
||||
--- a/dlls/ntdll/sync.c
|
||||
+++ b/dlls/ntdll/sync.c
|
||||
@@ -37,6 +37,13 @@
|
||||
@ -67,10 +29,70 @@ index 8df7015df9f..05bccf698b6 100644
|
||||
|
||||
/******************************************************************
|
||||
* RtlRunOnceInitialize (NTDLL.@)
|
||||
@@ -531,13 +538,48 @@ NTSTATUS WINAPI RtlSleepConditionVariableSRW( RTL_CONDITION_VARIABLE *variable,
|
||||
@@ -531,13 +538,116 @@ NTSTATUS WINAPI RtlSleepConditionVariableSRW( RTL_CONDITION_VARIABLE *variable,
|
||||
return status;
|
||||
}
|
||||
|
||||
+/* The following functions define a lock-free array mapping thread IDs to
|
||||
+ * values, which can be grown but not shrunk. We do this by allocating one slice
|
||||
+ * of the array at a time, and storing a pointer to the next slice at the end.
|
||||
+ *
|
||||
+ * This is both for efficiency (we want this function to be as fast as possible)
|
||||
+ * and because locking the TEB list is hard otherwise—we need to safely access
|
||||
+ * the TEB list, but cannot do so using any of these synchronization primitives,
|
||||
+ * and we may need to access the TEB list before being inserted into it (e.g.
|
||||
+ * from heap locks, or the TEB list lock itself.)
|
||||
+ */
|
||||
+
|
||||
+struct addr_wait_entry
|
||||
+{
|
||||
+ void *addr;
|
||||
+ HANDLE tid;
|
||||
+};
|
||||
+
|
||||
+struct addr_wait_array
|
||||
+{
|
||||
+ struct addr_wait_entry entries[(0x1000 - sizeof(struct addr_wait_entry *)) / sizeof(struct addr_wait_entry)];
|
||||
+ struct addr_wait_array *next;
|
||||
+};
|
||||
+
|
||||
+static struct addr_wait_array first_addr_wait_array;
|
||||
+
|
||||
+static struct addr_wait_entry *addr_wait_allocate_entry( HANDLE tid )
|
||||
+{
|
||||
+ struct addr_wait_array *array = &first_addr_wait_array;
|
||||
+
|
||||
+ for (;;)
|
||||
+ {
|
||||
+ struct addr_wait_array *new_array = NULL;
|
||||
+ SIZE_T size = sizeof(*new_array);
|
||||
+ unsigned int i;
|
||||
+
|
||||
+ for (;;)
|
||||
+ {
|
||||
+ for (i = 0; i < ARRAY_SIZE(array->entries); ++i)
|
||||
+ {
|
||||
+ if (!array->entries[i].tid && !InterlockedCompareExchangePointer( &array->entries[i].tid, tid, NULL ))
|
||||
+ return &array->entries[i];
|
||||
+ }
|
||||
+
|
||||
+ if (!array->next) break;
|
||||
+ array = array->next;
|
||||
+ }
|
||||
+
|
||||
+ if (NtAllocateVirtualMemory( NtCurrentProcess(), (void **)&new_array, 0, &size, MEM_COMMIT, PAGE_READWRITE ))
|
||||
+ return NULL;
|
||||
+
|
||||
+ if (InterlockedCompareExchangePointer( (void **)&array->next, new_array, NULL ))
|
||||
+ {
|
||||
+ /* another thread beat us to it */
|
||||
+ NtFreeVirtualMemory( NtCurrentProcess(), (void **)&new_array, &size, MEM_RELEASE );
|
||||
+ }
|
||||
+ /* start searching again from the new array */
|
||||
+ array = array->next;
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+static BOOL compare_addr( const void *addr, const void *cmp, SIZE_T size )
|
||||
+{
|
||||
+ switch (size)
|
||||
@ -95,6 +117,7 @@ index 8df7015df9f..05bccf698b6 100644
|
||||
const LARGE_INTEGER *timeout )
|
||||
{
|
||||
- return unix_funcs->RtlWaitOnAddress( addr, cmp, size, timeout );
|
||||
+ struct addr_wait_entry *entry = NtCurrentTeb()->ReservedForPerf;
|
||||
+ NTSTATUS ret;
|
||||
+
|
||||
+ TRACE("addr %p cmp %p size %#Ix timeout %s\n", addr, cmp, size, debugstr_timeout( timeout ));
|
||||
@ -102,65 +125,74 @@ index 8df7015df9f..05bccf698b6 100644
|
||||
+ if (size != 1 && size != 2 && size != 4 && size != 8)
|
||||
+ return STATUS_INVALID_PARAMETER;
|
||||
+
|
||||
+ InterlockedExchangePointer( &NtCurrentTeb()->ReservedForPerf, (void *)addr );
|
||||
+ if (!entry)
|
||||
+ {
|
||||
+ if (!(entry = addr_wait_allocate_entry( NtCurrentTeb()->ClientId.UniqueThread )))
|
||||
+ return STATUS_NO_MEMORY;
|
||||
+ NtCurrentTeb()->ReservedForPerf = entry;
|
||||
+ }
|
||||
+
|
||||
+ InterlockedExchangePointer( &entry->addr, (void *)addr );
|
||||
+
|
||||
+ if (!compare_addr( addr, cmp, size ))
|
||||
+ {
|
||||
+ InterlockedExchangePointer( &NtCurrentTeb()->ReservedForPerf, NULL );
|
||||
+ InterlockedExchangePointer( &entry->addr, NULL );
|
||||
+ return STATUS_SUCCESS;
|
||||
+ }
|
||||
+
|
||||
+ ret = NtWaitForAlertByThreadId( addr, timeout );
|
||||
+ InterlockedExchangePointer( &NtCurrentTeb()->ReservedForPerf, NULL );
|
||||
+ ret = NtWaitForAlertByThreadId( NULL, timeout );
|
||||
+ InterlockedExchangePointer( &entry->addr, NULL );
|
||||
+ if (ret == STATUS_ALERTED) ret = STATUS_SUCCESS;
|
||||
+ return ret;
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
@@ -545,7 +587,20 @@ NTSTATUS WINAPI RtlWaitOnAddress( const void *addr, const void *cmp, SIZE_T size
|
||||
@@ -545,7 +655,21 @@ NTSTATUS WINAPI RtlWaitOnAddress( const void *addr, const void *cmp, SIZE_T size
|
||||
*/
|
||||
void WINAPI RtlWakeAddressAll( const void *addr )
|
||||
{
|
||||
- return unix_funcs->RtlWakeAddressAll( addr );
|
||||
+ LIST_ENTRY *entry;
|
||||
+ struct addr_wait_array *array;
|
||||
+ unsigned int i;
|
||||
+
|
||||
+ TRACE("%p\n", addr);
|
||||
+
|
||||
+ if (!addr) return;
|
||||
+
|
||||
+ teb_list_rdlock();
|
||||
+ for (entry = tls_links.Flink; entry != &tls_links; entry = entry->Flink)
|
||||
+ for (array = &first_addr_wait_array; array != NULL; array = array->next)
|
||||
+ {
|
||||
+ const TEB *teb = CONTAINING_RECORD( entry, TEB, TlsLinks );
|
||||
+ if (teb->ReservedForPerf == addr)
|
||||
+ NtAlertThreadByThreadId( teb->ClientId.UniqueThread );
|
||||
+ for (i = 0; i < ARRAY_SIZE(array->entries); ++i)
|
||||
+ {
|
||||
+ if (array->entries[i].addr == addr)
|
||||
+ NtAlertThreadByThreadId( array->entries[i].tid );
|
||||
+ }
|
||||
+ }
|
||||
+ teb_list_rdunlock();
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
@@ -553,5 +608,21 @@ void WINAPI RtlWakeAddressAll( const void *addr )
|
||||
@@ -553,5 +677,22 @@ void WINAPI RtlWakeAddressAll( const void *addr )
|
||||
*/
|
||||
void WINAPI RtlWakeAddressSingle( const void *addr )
|
||||
{
|
||||
- return unix_funcs->RtlWakeAddressSingle( addr );
|
||||
+ LIST_ENTRY *entry;
|
||||
+ struct addr_wait_array *array;
|
||||
+ unsigned int i;
|
||||
+
|
||||
+ TRACE("%p\n", addr);
|
||||
+
|
||||
+ if (!addr) return;
|
||||
+
|
||||
+ teb_list_rdlock();
|
||||
+ for (entry = tls_links.Flink; entry != &tls_links; entry = entry->Flink)
|
||||
+ for (array = &first_addr_wait_array; array != NULL; array = array->next)
|
||||
+ {
|
||||
+ const TEB *teb = CONTAINING_RECORD( entry, TEB, TlsLinks );
|
||||
+ if (teb->ReservedForPerf == addr)
|
||||
+ for (i = 0; i < ARRAY_SIZE(array->entries); ++i)
|
||||
+ {
|
||||
+ NtAlertThreadByThreadId( teb->ClientId.UniqueThread );
|
||||
+ break;
|
||||
+ if (array->entries[i].addr == addr)
|
||||
+ {
|
||||
+ NtAlertThreadByThreadId( array->entries[i].tid );
|
||||
+ return;
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+ teb_list_rdunlock();
|
||||
}
|
||||
diff --git a/dlls/ntdll/unix/loader.c b/dlls/ntdll/unix/loader.c
|
||||
index 31cfb43d11f..5ab3121dd2c 100644
|
||||
|
@ -1,7 +1,7 @@
|
||||
From 9e9f51741ee04bcf8123ae23241ba3c4f8c8b2cf Mon Sep 17 00:00:00 2001
|
||||
From 9141708f675ec4aca0551249082dc7b494135bad Mon Sep 17 00:00:00 2001
|
||||
From: Zebediah Figura <z.figura12@gmail.com>
|
||||
Date: Mon, 31 Aug 2020 23:30:52 -0500
|
||||
Subject: [PATCH 10/13] ntdll: Merge critsection.c into sync.c.
|
||||
Subject: [PATCH] ntdll: Merge critsection.c into sync.c.
|
||||
|
||||
Signed-off-by: Zebediah Figura <z.figura12@gmail.com>
|
||||
---
|
||||
@ -573,7 +573,7 @@ index fe7d933c0fa..00000000000
|
||||
- return STATUS_SUCCESS;
|
||||
-}
|
||||
diff --git a/dlls/ntdll/sync.c b/dlls/ntdll/sync.c
|
||||
index 05bccf698b6..ea327172b86 100644
|
||||
index be462f27881..b8465c53832 100644
|
||||
--- a/dlls/ntdll/sync.c
|
||||
+++ b/dlls/ntdll/sync.c
|
||||
@@ -2,7 +2,7 @@
|
||||
@ -593,9 +593,9 @@ index 05bccf698b6..ea327172b86 100644
|
||||
|
||||
static const char *debugstr_timeout( const LARGE_INTEGER *timeout )
|
||||
{
|
||||
@@ -626,3 +627,334 @@ void WINAPI RtlWakeAddressSingle( const void *addr )
|
||||
@@ -696,3 +697,334 @@ void WINAPI RtlWakeAddressSingle( const void *addr )
|
||||
}
|
||||
}
|
||||
teb_list_rdunlock();
|
||||
}
|
||||
+
|
||||
+
|
||||
|
@ -1,3 +1,2 @@
|
||||
Fixes: [50292] Process-local synchronization objects use private interfaces into the Unix library
|
||||
Depends: server-Object_Types
|
||||
Disabled: True
|
||||
|
@ -171,6 +171,7 @@ patch_enable_all ()
|
||||
enable_ntdll_Junction_Points="$1"
|
||||
enable_ntdll_Manifest_Range="$1"
|
||||
enable_ntdll_NtAccessCheck="$1"
|
||||
enable_ntdll_NtAlertThreadByThreadId="$1"
|
||||
enable_ntdll_NtDevicePath="$1"
|
||||
enable_ntdll_NtQueryEaFile="$1"
|
||||
enable_ntdll_NtQuerySection="$1"
|
||||
@ -599,6 +600,9 @@ patch_enable ()
|
||||
ntdll-NtAccessCheck)
|
||||
enable_ntdll_NtAccessCheck="$2"
|
||||
;;
|
||||
ntdll-NtAlertThreadByThreadId)
|
||||
enable_ntdll_NtAlertThreadByThreadId="$2"
|
||||
;;
|
||||
ntdll-NtDevicePath)
|
||||
enable_ntdll_NtDevicePath="$2"
|
||||
;;
|
||||
@ -1585,6 +1589,13 @@ if test "$enable_ntdll_NtDevicePath" -eq 1; then
|
||||
enable_ntdll_Pipe_SpecialCharacters=1
|
||||
fi
|
||||
|
||||
if test "$enable_ntdll_NtAlertThreadByThreadId" -eq 1; then
|
||||
if test "$enable_server_Object_Types" -gt 1; then
|
||||
abort "Patchset server-Object_Types disabled, but ntdll-NtAlertThreadByThreadId depends on that."
|
||||
fi
|
||||
enable_server_Object_Types=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."
|
||||
@ -3249,6 +3260,58 @@ if test "$enable_ntdll_NtAccessCheck" -eq 1; then
|
||||
patch_apply ntdll-NtAccessCheck/0001-ntdll-Improve-invalid-paramater-handling-in-NtAccess.patch
|
||||
fi
|
||||
|
||||
# Patchset server-Object_Types
|
||||
# |
|
||||
# | This patchset fixes the following Wine bugs:
|
||||
# | * [#44629] Process Hacker can't enumerate handles
|
||||
# | * [#45374] Yet Another Process Monitor (.NET 2.0 app) reports System.AccessViolationException
|
||||
# |
|
||||
# | Modified files:
|
||||
# | * dlls/ntdll/tests/info.c, dlls/ntdll/tests/om.c, dlls/ntdll/unix/file.c, dlls/ntdll/unix/system.c, include/winternl.h,
|
||||
# | server/completion.c, server/directory.c, server/event.c, server/file.c, server/handle.c, server/mailslot.c,
|
||||
# | server/main.c, server/mapping.c, server/mutex.c, server/named_pipe.c, server/object.c, server/object.h,
|
||||
# | server/process.c, server/protocol.def, server/registry.c, server/semaphore.c, server/symlink.c, server/thread.c,
|
||||
# | server/timer.c, server/token.c, server/winstation.c
|
||||
# |
|
||||
if test "$enable_server_Object_Types" -eq 1; then
|
||||
patch_apply server-Object_Types/0001-ntdll-Implement-SystemExtendedHandleInformation-in-N.patch
|
||||
patch_apply server-Object_Types/0002-ntdll-Implement-ObjectTypesInformation-in-NtQueryObj.patch
|
||||
patch_apply server-Object_Types/0003-server-Register-types-during-startup.patch
|
||||
patch_apply server-Object_Types/0004-server-Rename-ObjectType-to-Type.patch
|
||||
patch_apply server-Object_Types/0008-ntdll-Set-TypeIndex-for-ObjectTypeInformation-in-NtQ.patch
|
||||
patch_apply server-Object_Types/0009-ntdll-Set-object-type-for-System-Extended-HandleInfo.patch
|
||||
patch_apply server-Object_Types/0010-ntdll-Mimic-object-type-behavior-for-different-windo.patch
|
||||
fi
|
||||
|
||||
# Patchset ntdll-NtAlertThreadByThreadId
|
||||
# |
|
||||
# | This patchset has the following (direct or indirect) dependencies:
|
||||
# | * server-Object_Types
|
||||
# |
|
||||
# | This patchset fixes the following Wine bugs:
|
||||
# | * [#50292] Process-local synchronization objects use private interfaces into the Unix library
|
||||
# |
|
||||
# | Modified files:
|
||||
# | * dlls/ntdll/Makefile.in, dlls/ntdll/critsection.c, dlls/ntdll/ntdll.spec, dlls/ntdll/sync.c,
|
||||
# | dlls/ntdll/tests/Makefile.in, dlls/ntdll/tests/om.c, dlls/ntdll/tests/sync.c, dlls/ntdll/unix/loader.c,
|
||||
# | dlls/ntdll/unix/sync.c, dlls/ntdll/unix/thread.c, dlls/ntdll/unix/unix_private.h, dlls/ntdll/unix/virtual.c,
|
||||
# | dlls/ntdll/unixlib.h, include/winbase.h, include/winternl.h
|
||||
# |
|
||||
if test "$enable_ntdll_NtAlertThreadByThreadId" -eq 1; then
|
||||
patch_apply ntdll-NtAlertThreadByThreadId/0001-ntdll-tests-Move-some-tests-to-a-new-sync.c-file.patch
|
||||
patch_apply ntdll-NtAlertThreadByThreadId/0002-ntdll-tests-Add-some-tests-for-Rtl-resources.patch
|
||||
patch_apply ntdll-NtAlertThreadByThreadId/0003-ntdll-Use-a-separate-mutex-to-lock-the-TEB-list.patch
|
||||
patch_apply ntdll-NtAlertThreadByThreadId/0004-ntdll-Implement-NtAlertThreadByThreadId-and-NtWaitFo.patch
|
||||
patch_apply ntdll-NtAlertThreadByThreadId/0005-ntdll-tests-Add-basic-tests-for-thread-id-alert-func.patch
|
||||
patch_apply ntdll-NtAlertThreadByThreadId/0006-ntdll-Implement-thread-id-alerts-on-top-of-futexes-i.patch
|
||||
patch_apply ntdll-NtAlertThreadByThreadId/0007-ntdll-Implement-thread-id-alerts-on-top-of-Mach-sema.patch
|
||||
patch_apply ntdll-NtAlertThreadByThreadId/0009-ntdll-Reimplement-Win32-futexes-on-top-of-thread-ID-.patch
|
||||
patch_apply ntdll-NtAlertThreadByThreadId/0010-ntdll-Merge-critsection.c-into-sync.c.patch
|
||||
patch_apply ntdll-NtAlertThreadByThreadId/0011-ntdll-Reimplement-the-critical-section-fast-path-on-.patch
|
||||
patch_apply ntdll-NtAlertThreadByThreadId/0012-ntdll-Get-rid-of-the-direct-futex-path-for-condition.patch
|
||||
patch_apply ntdll-NtAlertThreadByThreadId/0013-ntdll-Reimplement-SRW-locks-on-top-of-Win32-futexes.patch
|
||||
fi
|
||||
|
||||
# Patchset ntdll-Pipe_SpecialCharacters
|
||||
# |
|
||||
# | This patchset fixes the following Wine bugs:
|
||||
@ -3743,29 +3806,6 @@ if test "$enable_server_Key_State" -eq 1; then
|
||||
patch_apply server-Key_State/0002-server-Implement-locking-and-synchronization-of-keys.patch
|
||||
fi
|
||||
|
||||
# Patchset server-Object_Types
|
||||
# |
|
||||
# | This patchset fixes the following Wine bugs:
|
||||
# | * [#44629] Process Hacker can't enumerate handles
|
||||
# | * [#45374] Yet Another Process Monitor (.NET 2.0 app) reports System.AccessViolationException
|
||||
# |
|
||||
# | Modified files:
|
||||
# | * dlls/ntdll/tests/info.c, dlls/ntdll/tests/om.c, dlls/ntdll/unix/file.c, dlls/ntdll/unix/system.c, include/winternl.h,
|
||||
# | server/completion.c, server/directory.c, server/event.c, server/file.c, server/handle.c, server/mailslot.c,
|
||||
# | server/main.c, server/mapping.c, server/mutex.c, server/named_pipe.c, server/object.c, server/object.h,
|
||||
# | server/process.c, server/protocol.def, server/registry.c, server/semaphore.c, server/symlink.c, server/thread.c,
|
||||
# | server/timer.c, server/token.c, server/winstation.c
|
||||
# |
|
||||
if test "$enable_server_Object_Types" -eq 1; then
|
||||
patch_apply server-Object_Types/0001-ntdll-Implement-SystemExtendedHandleInformation-in-N.patch
|
||||
patch_apply server-Object_Types/0002-ntdll-Implement-ObjectTypesInformation-in-NtQueryObj.patch
|
||||
patch_apply server-Object_Types/0003-server-Register-types-during-startup.patch
|
||||
patch_apply server-Object_Types/0004-server-Rename-ObjectType-to-Type.patch
|
||||
patch_apply server-Object_Types/0008-ntdll-Set-TypeIndex-for-ObjectTypeInformation-in-NtQ.patch
|
||||
patch_apply server-Object_Types/0009-ntdll-Set-object-type-for-System-Extended-HandleInfo.patch
|
||||
patch_apply server-Object_Types/0010-ntdll-Mimic-object-type-behavior-for-different-windo.patch
|
||||
fi
|
||||
|
||||
# Patchset server-Registry_Notifications
|
||||
# |
|
||||
# | Modified files:
|
||||
|
Loading…
x
Reference in New Issue
Block a user