Rebase against 9bd963065b1fb7b445d010897d5f84967eadf75b.

This commit is contained in:
Sebastian Lackner 2015-10-02 17:13:21 +02:00
parent 6ef9e97ec1
commit eb98f4e74f
14 changed files with 19 additions and 727 deletions

View File

@ -34,7 +34,7 @@ Wine. All those differences are also documented on the
Included bug fixes and improvements
-----------------------------------
**Bug fixes and features included in the next upcoming release [13]:**
**Bug fixes and features included in the next upcoming release [12]:**
* Add implementation for msidb commandline tool
* Codepage conversion should fail when destination length is < 0
@ -43,7 +43,6 @@ Included bug fixes and improvements
* Do not wait for hook thread startup in IDirectInput8::Initialize ([Wine Bug #21403](https://bugs.winehq.org/show_bug.cgi?id=21403))
* Fix calculation of listbox size when horizontal scrollbar is present ([Wine Bug #38142](https://bugs.winehq.org/show_bug.cgi?id=38142))
* Implement additional stub functions in authz.dll
* Implement semi-stub for d3d8 swapchain effect D3DSWAPEFFECT_COPY_VSYNC ([Wine Bug #39281](https://bugs.winehq.org/show_bug.cgi?id=39281))
* Pass cookie by reference to msvcrt_local_unwind4 in _seh_longjmp_unwind4 ([Wine Bug #39356](https://bugs.winehq.org/show_bug.cgi?id=39356))
* Protect TVM_GETITEM from invalid item pointers ([Wine Bug #33001](https://bugs.winehq.org/show_bug.cgi?id=33001))
* Reduce stack usage of virtual memory functions ([Wine Bug #34558](https://bugs.winehq.org/show_bug.cgi?id=34558))
@ -213,7 +212,7 @@ for more details.*
* Implement stub for ntoskrnl.KeDelayExecutionThread.
* Implement stubs for ntoskrnl.Ex{Acquire,Release}FastMutexUnsafe
* Implement stubs for ntoskrnl.ObReferenceObjectByPointer and ntoskrnl.ObDereferenceObject
* Implement {Set,Get}ThreadGroupAffinity and related ntdll functions ([Wine Bug #36549](https://bugs.winehq.org/show_bug.cgi?id=36549))
* ~~Implement {Set,Get}ThreadGroupAffinity and related ntdll functions~~ ([Wine Bug #36549](https://bugs.winehq.org/show_bug.cgi?id=36549))
* Improve ReadDataAvailable handling in FilePipeLocalInformation class
* Improve startup performance by delaying font initialization
* Improve stub for AEV_GetVolumeRange ([Wine Bug #35658](https://bugs.winehq.org/show_bug.cgi?id=35658))
@ -245,7 +244,7 @@ for more details.*
* Properly render themed buttons when they are pressed ([Wine Bug #37584](https://bugs.winehq.org/show_bug.cgi?id=37584))
* Reduced SetTimer minimum value from 10 ms to 5 ms (improves Silverlight framerates)
* Report correct ObjectName for NamedPipe wineserver objects
* Return STATUS_OBJECT_NAME_INVALID in wine_nt_to_unix_file_name for paths that only contain a prefix ([Wine Bug #39133](https://bugs.winehq.org/show_bug.cgi?id=39133))
* ~~Return STATUS_OBJECT_NAME_INVALID in wine_nt_to_unix_file_name for paths that only contain a prefix~~ ([Wine Bug #39133](https://bugs.winehq.org/show_bug.cgi?id=39133))
* Return a dummy BIOS name in Win32_BIOS record
* Return a valid mesh in D3DXCreateTeapot ([Wine Bug #36884](https://bugs.winehq.org/show_bug.cgi?id=36884))
* Return an error when trying to open a terminated process ([Wine Bug #37087](https://bugs.winehq.org/show_bug.cgi?id=37087))
@ -295,7 +294,7 @@ for more details.*
* Support for linux priority levels for faster performance
* Support for loader dll redirections
* Support for named pipe message mode (Linux only) ([Wine Bug #17195](https://bugs.winehq.org/show_bug.cgi?id=17195))
* Support for non-blocking SIO_ADDRESS_LIST_CHANGE requests ([Wine Bug #38062](https://bugs.winehq.org/show_bug.cgi?id=38062))
* ~~Support for non-blocking SIO_ADDRESS_LIST_CHANGE requests~~ ([Wine Bug #38062](https://bugs.winehq.org/show_bug.cgi?id=38062))
* Support for pasting HTML from Unix applications ([Wine Bug #7372](https://bugs.winehq.org/show_bug.cgi?id=7372))
* Support for process ACLs ([Wine Bug #22006](https://bugs.winehq.org/show_bug.cgi?id=22006))
* Support for setcap on wine-preloader ([Wine Bug #26256](https://bugs.winehq.org/show_bug.cgi?id=26256))

9
debian/changelog vendored
View File

@ -42,6 +42,15 @@ wine-staging (1.7.52) UNRELEASED; urgency=low
(accepted upstream).
* Removed patch to fix failure to create anonymous file mapping after failed
open_fd server call (accepted upstream).
* Removed patch to implement semi-stub for d3d8 swapchain effect
D3DSWAPEFFECT_COPY_VSYNC (identical patch accepted upstream).
* Removed patch to implement {Set,Get}ThreadGroupAffinity and related ntdll
functions (accepted upstream).
* Removed patch to return STATUS_OBJECT_NAME_INVALID in
wine_nt_to_unix_file_name for paths that only contain a prefix (accepted
upstream).
* Removed patch to implement support for non-blocking SIO_ADDRESS_LIST_CHANGE
requests (accepted upstream).
-- Sebastian Lackner <sebastian@fds-team.de> Mon, 07 Sep 2015 16:51:25 +0200
wine-staging (1.7.51) unstable; urgency=low

View File

@ -1,33 +0,0 @@
From d65c501e946415d47bb6fc7f084233ac8de43dec Mon Sep 17 00:00:00 2001
From: Sebastian Lackner <sebastian@fds-team.de>
Date: Sat, 26 Sep 2015 17:21:22 +0200
Subject: d3d8: Handle D3DSWAPEFFECT_COPY_VSYNC swapchain effect like
D3DSWAPEFFECT_COPY.
---
dlls/d3d8/device.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/dlls/d3d8/device.c b/dlls/d3d8/device.c
index e899b34..d006c12 100644
--- a/dlls/d3d8/device.c
+++ b/dlls/d3d8/device.c
@@ -191,13 +191,13 @@ static void present_parameters_from_wined3d_swapchain_desc(D3DPRESENT_PARAMETERS
static BOOL wined3d_swapchain_desc_from_present_parameters(struct wined3d_swapchain_desc *swapchain_desc,
const D3DPRESENT_PARAMETERS *present_parameters)
{
- if (!present_parameters->SwapEffect || present_parameters->SwapEffect > D3DSWAPEFFECT_COPY)
+ if (!present_parameters->SwapEffect || present_parameters->SwapEffect > D3DSWAPEFFECT_COPY_VSYNC)
{
WARN("Invalid swap effect %u passed.\n", present_parameters->SwapEffect);
return FALSE;
}
if (present_parameters->BackBufferCount > 3
- || (present_parameters->SwapEffect == D3DSWAPEFFECT_COPY
+ || (present_parameters->SwapEffect >= D3DSWAPEFFECT_COPY
&& present_parameters->BackBufferCount > 1))
{
WARN("Invalid backbuffer count %u.\n", present_parameters->BackBufferCount);
--
2.5.1

View File

@ -1 +0,0 @@
Fixes: [39281] Implement semi-stub for d3d8 swapchain effect D3DSWAPEFFECT_COPY_VSYNC

View File

@ -1,108 +0,0 @@
From c12f95c2b6fefcbe086e1d623d2124f31b84b53e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Michael=20M=C3=BCller?= <michael@fds-team.de>
Date: Sun, 6 Sep 2015 06:17:46 +0200
Subject: ntdll: Implement ThreadGroupInformation class.
---
dlls/ntdll/thread.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++
include/winternl.h | 16 ++++++++++++++++
2 files changed, 66 insertions(+)
diff --git a/dlls/ntdll/thread.c b/dlls/ntdll/thread.c
index 0a8a7b9..afb347f 100644
--- a/dlls/ntdll/thread.c
+++ b/dlls/ntdll/thread.c
@@ -1103,6 +1103,29 @@ NTSTATUS WINAPI NtQueryInformationThread( HANDLE handle, THREADINFOCLASS class,
SERVER_END_REQ;
return status;
}
+ case ThreadGroupInformation:
+ {
+ const ULONG_PTR affinity_mask = get_system_affinity_mask();
+ GROUP_AFFINITY affinity;
+
+ memset(&affinity, 0, sizeof(affinity));
+ affinity.Group = 0; /* Wine only supports max 64 processors */
+
+ SERVER_START_REQ( get_thread_info )
+ {
+ req->handle = wine_server_obj_handle( handle );
+ req->tid_in = 0;
+ if (!(status = wine_server_call( req )))
+ affinity.Mask = reply->affinity & affinity_mask;
+ }
+ SERVER_END_REQ;
+ if (status == STATUS_SUCCESS)
+ {
+ if (data) memcpy( data, &affinity, min( length, sizeof(affinity) ));
+ if (ret_len) *ret_len = min( length, sizeof(affinity) );
+ }
+ }
+ return status;
case ThreadPriority:
case ThreadBasePriority:
case ThreadImpersonationToken:
@@ -1233,6 +1256,33 @@ NTSTATUS WINAPI NtSetInformationThread( HANDLE handle, THREADINFOCLASS class,
SERVER_END_REQ;
}
return status;
+ case ThreadGroupInformation:
+ {
+ const ULONG_PTR affinity_mask = get_system_affinity_mask();
+ const GROUP_AFFINITY *req_aff;
+
+ if (length != sizeof(*req_aff)) return STATUS_INVALID_PARAMETER;
+ if (!data) return STATUS_ACCESS_VIOLATION;
+ req_aff = data;
+
+ /* On windows the request fails if the reserved fields are set */
+ if (req_aff->Reserved[0] || req_aff->Reserved[1] || req_aff->Reserved[2])
+ return STATUS_INVALID_PARAMETER;
+
+ /* Wine only supports max 64 processors */
+ if (req_aff->Group) return STATUS_INVALID_PARAMETER;
+ if (req_aff->Mask & ~affinity_mask) return STATUS_INVALID_PARAMETER;
+ if (!req_aff->Mask) return STATUS_INVALID_PARAMETER;
+ SERVER_START_REQ( set_thread_info )
+ {
+ req->handle = wine_server_obj_handle( handle );
+ req->affinity = req_aff->Mask;
+ req->mask = SET_THREAD_INFO_AFFINITY;
+ status = wine_server_call( req );
+ }
+ SERVER_END_REQ;
+ }
+ return status;
case ThreadBasicInformation:
case ThreadTimes:
case ThreadPriority:
diff --git a/include/winternl.h b/include/winternl.h
index 2b10f8d..3e64b4d 100644
--- a/include/winternl.h
+++ b/include/winternl.h
@@ -859,6 +859,22 @@ typedef enum _THREADINFOCLASS {
ThreadSetTlsArrayAddress,
ThreadIsIoPending,
ThreadHideFromDebugger,
+ ThreadBreakOnTermination,
+ ThreadSwitchLegacyState,
+ ThreadIsTerminated,
+ ThreadLastSystemCall,
+ ThreadIoPriority,
+ ThreadCycleTime,
+ ThreadPagePriority,
+ ThreadActualBasePriority,
+ ThreadTebInformation,
+ ThreadCSwitchMon,
+ ThreadCSwitchPmu,
+ ThreadWow64Context,
+ ThreadGroupInformation,
+ ThreadUmsInformation,
+ ThreadCounterProfiling,
+ ThreadIdealProcessorEx,
MaxThreadInfoClass
} THREADINFOCLASS;
--
2.5.1

View File

@ -1,275 +0,0 @@
From 0e15d46d97e226c2a566d7f30c9f67afaabbb6b1 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Michael=20M=C3=BCller?= <michael@fds-team.de>
Date: Sun, 6 Sep 2015 06:19:40 +0200
Subject: kernel32: Implement Set/GetThreadGroupAffinity.
---
dlls/kernel32/kernel32.spec | 4 +-
dlls/kernel32/tests/thread.c | 142 ++++++++++++++++++++++++++++++++-----------
dlls/kernel32/thread.c | 46 ++++++++++++++
3 files changed, 156 insertions(+), 36 deletions(-)
diff --git a/dlls/kernel32/kernel32.spec b/dlls/kernel32/kernel32.spec
index 77e55e1..bda7c9d 100644
--- a/dlls/kernel32/kernel32.spec
+++ b/dlls/kernel32/kernel32.spec
@@ -844,7 +844,7 @@
@ stdcall GetTempPathW(long ptr)
@ stdcall GetThreadContext(long ptr)
@ stdcall GetThreadErrorMode()
-# @ stub GetThreadGroupAffinity
+@ stdcall GetThreadGroupAffinity(long ptr)
@ stdcall GetThreadId(ptr)
# @ stub GetThreadIdealProcessorEx
@ stdcall GetThreadIOPendingFlag(long ptr)
@@ -1443,7 +1443,7 @@
@ stdcall SetThreadContext(long ptr)
@ stdcall SetThreadErrorMode(long ptr)
@ stdcall SetThreadExecutionState(long)
-# @ stub SetThreadGroupAffinity
+@ stdcall SetThreadGroupAffinity(long ptr ptr)
@ stdcall SetThreadIdealProcessor(long long)
# @ stub SetThreadIdealProcessorEx
@ stdcall SetThreadLocale(long)
diff --git a/dlls/kernel32/tests/thread.c b/dlls/kernel32/tests/thread.c
index d0fbfa4..fc5ff94 100644
--- a/dlls/kernel32/tests/thread.c
+++ b/dlls/kernel32/tests/thread.c
@@ -99,6 +99,9 @@ static void (WINAPI *pSubmitThreadpoolWork)(PTP_WORK);
static void (WINAPI *pWaitForThreadpoolWorkCallbacks)(PTP_WORK,BOOL);
static void (WINAPI *pCloseThreadpoolWork)(PTP_WORK);
static NTSTATUS (WINAPI *pNtQueryInformationThread)(HANDLE,THREADINFOCLASS,PVOID,ULONG,PULONG);
+static BOOL (WINAPI *pGetThreadGroupAffinity)(HANDLE,GROUP_AFFINITY*);
+static BOOL (WINAPI *pSetThreadGroupAffinity)(HANDLE,const GROUP_AFFINITY*,GROUP_AFFINITY*);
+static NTSTATUS (WINAPI *pNtSetInformationThread)(HANDLE,THREADINFOCLASS,LPCVOID,ULONG);
static HANDLE create_target_process(const char *arg)
{
@@ -877,6 +880,15 @@ static VOID test_thread_processor(void)
retMask = SetThreadAffinityMask(curthread,~0);
ok(broken(retMask==0) || retMask==processMask,
"SetThreadAffinityMask(thread,-1) failed to request all processors.\n");
+
+ if (retMask == processMask)
+ {
+ /* Show that the "all processors" flag is handled in ntdll/kernel */
+ DWORD_PTR mask = ~0;
+ NTSTATUS status = pNtSetInformationThread(curthread, ThreadAffinityMask, &mask, sizeof(mask));
+ ok(status == STATUS_SUCCESS, "Expected STATUS_SUCCESS in NtSetInformationThread, got %x\n", status);
+ }
+
if (retMask == processMask && sizeof(ULONG_PTR) > sizeof(ULONG))
{
/* only the low 32-bits matter */
@@ -886,41 +898,99 @@ static VOID test_thread_processor(void)
ok(retMask == processMask, "SetThreadAffinityMask failed\n");
}
/* NOTE: This only works on WinNT/2000/XP) */
- if (pSetThreadIdealProcessor) {
- SetLastError(0xdeadbeef);
- error=pSetThreadIdealProcessor(curthread,0);
- if (GetLastError()==ERROR_CALL_NOT_IMPLEMENTED)
- {
- win_skip("SetThreadIdealProcessor is not implemented\n");
- return;
- }
- ok(error!=-1, "SetThreadIdealProcessor failed\n");
-
- if (is_wow64)
- {
- SetLastError(0xdeadbeef);
- error=pSetThreadIdealProcessor(curthread,MAXIMUM_PROCESSORS+1);
- todo_wine
- ok(error!=-1, "SetThreadIdealProcessor failed for %u on Wow64\n", MAXIMUM_PROCESSORS+1);
-
- SetLastError(0xdeadbeef);
- error=pSetThreadIdealProcessor(curthread,65);
- ok(error==-1, "SetThreadIdealProcessor succeeded with an illegal processor #\n");
- ok(GetLastError()==ERROR_INVALID_PARAMETER,
- "Expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError());
- }
- else
- {
- SetLastError(0xdeadbeef);
- error=pSetThreadIdealProcessor(curthread,MAXIMUM_PROCESSORS+1);
- ok(error==-1, "SetThreadIdealProcessor succeeded with an illegal processor #\n");
- ok(GetLastError()==ERROR_INVALID_PARAMETER,
- "Expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError());
- }
+ if (pSetThreadIdealProcessor)
+ {
+ SetLastError(0xdeadbeef);
+ error=pSetThreadIdealProcessor(curthread,0);
+ if (GetLastError()!=ERROR_CALL_NOT_IMPLEMENTED)
+ {
+ ok(error!=-1, "SetThreadIdealProcessor failed\n");
+
+ if (is_wow64)
+ {
+ SetLastError(0xdeadbeef);
+ error=pSetThreadIdealProcessor(curthread,MAXIMUM_PROCESSORS+1);
+ todo_wine
+ ok(error!=-1, "SetThreadIdealProcessor failed for %u on Wow64\n", MAXIMUM_PROCESSORS+1);
+
+ SetLastError(0xdeadbeef);
+ error=pSetThreadIdealProcessor(curthread,65);
+ ok(error==-1, "SetThreadIdealProcessor succeeded with an illegal processor #\n");
+ ok(GetLastError()==ERROR_INVALID_PARAMETER,
+ "Expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError());
+ }
+ else
+ {
+ SetLastError(0xdeadbeef);
+ error=pSetThreadIdealProcessor(curthread,MAXIMUM_PROCESSORS+1);
+ ok(error==-1, "SetThreadIdealProcessor succeeded with an illegal processor #\n");
+ ok(GetLastError()==ERROR_INVALID_PARAMETER,
+ "Expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError());
+ }
+
+ error=pSetThreadIdealProcessor(curthread,MAXIMUM_PROCESSORS);
+ ok(error!=-1, "SetThreadIdealProcessor failed\n");
+ }
+ else
+ win_skip("SetThreadIdealProcessor is not implemented\n");
+ }
- error=pSetThreadIdealProcessor(curthread,MAXIMUM_PROCESSORS);
- ok(error!=-1, "SetThreadIdealProcessor failed\n");
- }
+ if (pGetThreadGroupAffinity && pSetThreadGroupAffinity)
+ {
+ GROUP_AFFINITY affinity, affinity_new;
+ NTSTATUS status;
+
+ memset(&affinity, 0, sizeof(affinity));
+ ok(pGetThreadGroupAffinity(curthread, &affinity), "GetThreadGroupAffinity failed\n");
+
+ SetLastError(0xdeadbeef);
+ ok(!pGetThreadGroupAffinity(curthread, NULL), "GetThreadGroupAffinity succeeded\n");
+ ok(GetLastError() == ERROR_INVALID_PARAMETER || broken(GetLastError() == ERROR_NOACCESS), /* Win 7 and 8 */
+ "Expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError());
+ ok(affinity.Group == 0, "Expected group 0 got %u\n", affinity.Group);
+
+ memset(&affinity_new, 0, sizeof(affinity_new));
+ affinity_new.Group = 0;
+ affinity_new.Mask = affinity.Mask;
+ ok(pSetThreadGroupAffinity(curthread, &affinity_new, &affinity), "SetThreadGroupAffinity failed\n");
+ ok(affinity_new.Mask == affinity.Mask, "Expected old affinity mask %lx, got %lx\n",
+ affinity_new.Mask, affinity.Mask);
+
+ /* show that the "all processors" flag is not supported for SetThreadGroupAffinity */
+ affinity_new.Group = 0;
+ affinity_new.Mask = ~0;
+ SetLastError(0xdeadbeef);
+ ok(!pSetThreadGroupAffinity(curthread, &affinity_new, NULL), "SetThreadGroupAffinity succeeded\n");
+ ok(GetLastError() == ERROR_INVALID_PARAMETER,
+ "Expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError());
+
+ affinity_new.Group = 1; /* assumes that you have less than 64 logical processors */
+ affinity_new.Mask = 0x1;
+ SetLastError(0xdeadbeef);
+ ok(!pSetThreadGroupAffinity(curthread, &affinity_new, NULL), "SetThreadGroupAffinity succeeded\n");
+ ok(GetLastError() == ERROR_INVALID_PARAMETER,
+ "Expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError());
+
+ SetLastError(0xdeadbeef);
+ ok(!pSetThreadGroupAffinity(curthread, NULL, NULL), "SetThreadGroupAffinity succeeded\n");
+ ok(GetLastError() == ERROR_NOACCESS,
+ "Expected ERROR_NOACCESS, got %d\n", GetLastError());
+
+ /* show that the ERROR_NOACCESS was set in ntdll */
+ status = pNtSetInformationThread(curthread, ThreadGroupInformation, NULL, sizeof(affinity_new));
+ ok(status == STATUS_ACCESS_VIOLATION,
+ "Expected STATUS_ACCESS_VIOLATION, got %08x\n", status);
+
+ /* restore original mask */
+ affinity_new.Group = 0;
+ affinity_new.Mask = affinity.Mask;
+ SetLastError(0xdeadbeef);
+ ok(pSetThreadGroupAffinity(curthread, &affinity_new, &affinity), "SetThreadGroupAffinity failed\n");
+ ok(affinity_new.Mask == affinity.Mask, "Expected old affinity mask %lx, got %lx\n",
+ affinity_new.Mask, affinity.Mask);
+ }
+ else
+ win_skip("Get/SetThreadGroupAffinity not available\n");
}
static VOID test_GetThreadExitCode(void)
@@ -1833,6 +1903,9 @@ static void init_funcs(void)
X(SubmitThreadpoolWork);
X(WaitForThreadpoolWorkCallbacks);
X(CloseThreadpoolWork);
+
+ X(GetThreadGroupAffinity);
+ X(SetThreadGroupAffinity);
#undef X
#define X(f) p##f = (void*)GetProcAddress(ntdll, #f)
@@ -1840,6 +1913,7 @@ static void init_funcs(void)
{
X(NtQueryInformationThread);
X(RtlGetThreadErrorMode);
+ X(NtSetInformationThread);
}
#undef X
}
diff --git a/dlls/kernel32/thread.c b/dlls/kernel32/thread.c
index c992e0d..0e9de82 100644
--- a/dlls/kernel32/thread.c
+++ b/dlls/kernel32/thread.c
@@ -378,6 +378,52 @@ BOOL WINAPI SetThreadStackGuarantee(PULONG stacksize)
return TRUE;
}
+/***********************************************************************
+ * GetThreadGroupAffinity (KERNEL32.@)
+ */
+BOOL WINAPI GetThreadGroupAffinity( HANDLE thread, GROUP_AFFINITY *affinity )
+{
+ NTSTATUS status;
+
+ if (!affinity)
+ {
+ SetLastError( ERROR_INVALID_PARAMETER );
+ return FALSE;
+ }
+
+ status = NtQueryInformationThread( thread, ThreadGroupInformation,
+ affinity, sizeof(*affinity), NULL );
+ if (status)
+ {
+ SetLastError( RtlNtStatusToDosError(status) );
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+/***********************************************************************
+ * SetThreadGroupAffinity (KERNEL32.@)
+ */
+BOOL WINAPI SetThreadGroupAffinity( HANDLE thread, const GROUP_AFFINITY *affinity_new,
+ GROUP_AFFINITY *affinity_old )
+{
+ NTSTATUS status;
+
+ if (affinity_old && !GetThreadGroupAffinity( thread, affinity_old ))
+ return FALSE;
+
+ status = NtSetInformationThread( thread, ThreadGroupInformation,
+ affinity_new, sizeof(*affinity_new) );
+ if (status)
+ {
+ SetLastError( RtlNtStatusToDosError(status) );
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
/**********************************************************************
* SetThreadAffinityMask (KERNEL32.@)
*/
--
2.5.1

View File

@ -1 +0,0 @@
Fixes: [36549] Implement {Set,Get}ThreadGroupAffinity and related ntdll functions

View File

@ -1,172 +0,0 @@
From 526502c4455016f3e42f671d7a03b9c15ce79fa9 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Michael=20M=C3=BCller?= <michael@fds-team.de>
Date: Sat, 22 Aug 2015 03:19:18 +0200
Subject: ntdll: Return STATUS_OBJECT_NAME_INVALID in wine_nt_to_unix_file_name
for paths that only contain a prefix.
---
dlls/kernel32/tests/file.c | 22 ++++++++++++++++++++++
dlls/ntdll/directory.c | 22 ++++++++++++++--------
dlls/ntdll/tests/file.c | 39 +++++++++++++++++++++++++++++++++++++++
3 files changed, 75 insertions(+), 8 deletions(-)
diff --git a/dlls/kernel32/tests/file.c b/dlls/kernel32/tests/file.c
index dd64c91..fbe2ddd 100644
--- a/dlls/kernel32/tests/file.c
+++ b/dlls/kernel32/tests/file.c
@@ -4650,6 +4650,27 @@ todo_wine
CloseHandle(file);
}
+static void test_GetFileAttributesExW(void)
+{
+ static const WCHAR path1[] = {'\\','\\','?','\\',0};
+ static const WCHAR path2[] = {'\\','?','?','\\',0};
+ static const WCHAR path3[] = {'\\','D','o','s','D','e','v','i','c','e','s','\\',0};
+ WIN32_FILE_ATTRIBUTE_DATA info;
+ BOOL ret;
+
+ ret = GetFileAttributesExW(path1, GetFileExInfoStandard, &info);
+ ok(!ret, "GetFileAttributesExW succeeded\n");
+ ok(GetLastError() == ERROR_INVALID_NAME, "Expected error ERROR_INVALID_NAME, got %d\n", GetLastError());
+
+ ret = GetFileAttributesExW(path2, GetFileExInfoStandard, &info);
+ ok(!ret, "GetFileAttributesExW succeeded\n");
+ ok(GetLastError() == ERROR_INVALID_NAME, "Expected error ERROR_INVALID_NAME, got %d\n", GetLastError());
+
+ ret = GetFileAttributesExW(path3, GetFileExInfoStandard, &info);
+ ok(!ret, "GetFileAttributesExW succeeded\n");
+ ok(GetLastError() == ERROR_FILE_NOT_FOUND, "Expected error ERROR_FILE_NOT_FOUND, got %d\n", GetLastError());
+}
+
START_TEST(file)
{
InitFunctionPointers();
@@ -4706,4 +4727,5 @@ START_TEST(file)
test_GetFinalPathNameByHandleA();
test_GetFinalPathNameByHandleW();
test_SetFileInformationByHandle();
+ test_GetFileAttributesExW();
}
diff --git a/dlls/ntdll/directory.c b/dlls/ntdll/directory.c
index 0e02f2e..d1f66e0 100644
--- a/dlls/ntdll/directory.c
+++ b/dlls/ntdll/directory.c
@@ -2757,20 +2757,26 @@ static NTSTATUS get_dos_device( const WCHAR *name, UINT name_len, ANSI_STRING *u
/* return the length of the DOS namespace prefix if any */
-static inline int get_dos_prefix_len( const UNICODE_STRING *name )
+static inline NTSTATUS get_dos_prefix_len( const UNICODE_STRING *name, int *prefix_len )
{
static const WCHAR nt_prefixW[] = {'\\','?','?','\\'};
static const WCHAR dosdev_prefixW[] = {'\\','D','o','s','D','e','v','i','c','e','s','\\'};
- if (name->Length > sizeof(nt_prefixW) &&
+ if (name->Length >= sizeof(nt_prefixW) &&
!memcmp( name->Buffer, nt_prefixW, sizeof(nt_prefixW) ))
- return sizeof(nt_prefixW) / sizeof(WCHAR);
+ {
+ *prefix_len = sizeof(nt_prefixW) / sizeof(WCHAR);
+ return (name->Length == sizeof(nt_prefixW)) ? STATUS_OBJECT_NAME_INVALID : STATUS_SUCCESS;
+ }
- if (name->Length > sizeof(dosdev_prefixW) &&
+ if (name->Length >= sizeof(dosdev_prefixW) &&
!memicmpW( name->Buffer, dosdev_prefixW, sizeof(dosdev_prefixW)/sizeof(WCHAR) ))
- return sizeof(dosdev_prefixW) / sizeof(WCHAR);
+ {
+ *prefix_len = sizeof(dosdev_prefixW) / sizeof(WCHAR);
+ return (name->Length == sizeof(dosdev_prefixW)) ? STATUS_OBJECT_NAME_INVALID : STATUS_SUCCESS;
+ }
- return 0;
+ return STATUS_BAD_DEVICE_TYPE;
}
@@ -3126,8 +3132,8 @@ NTSTATUS CDECL wine_nt_to_unix_file_name( const UNICODE_STRING *nameW, ANSI_STRI
if (!name_len || !IS_SEPARATOR(name[0])) return STATUS_OBJECT_PATH_SYNTAX_BAD;
- if (!(pos = get_dos_prefix_len( nameW )))
- return STATUS_BAD_DEVICE_TYPE; /* no DOS prefix, assume NT native name */
+ if ((status = get_dos_prefix_len( nameW, &pos )))
+ return status; /* no DOS prefix, assume NT native name */
name += pos;
name_len -= pos;
diff --git a/dlls/ntdll/tests/file.c b/dlls/ntdll/tests/file.c
index d68be15..70c7a55 100644
--- a/dlls/ntdll/tests/file.c
+++ b/dlls/ntdll/tests/file.c
@@ -78,6 +78,7 @@ static NTSTATUS (WINAPI *pNtQueryInformationFile)(HANDLE, PIO_STATUS_BLOCK, PVOI
static NTSTATUS (WINAPI *pNtQueryDirectoryFile)(HANDLE,HANDLE,PIO_APC_ROUTINE,PVOID,PIO_STATUS_BLOCK,
PVOID,ULONG,FILE_INFORMATION_CLASS,BOOLEAN,PUNICODE_STRING,BOOLEAN);
static NTSTATUS (WINAPI *pNtQueryVolumeInformationFile)(HANDLE,PIO_STATUS_BLOCK,PVOID,ULONG,FS_INFORMATION_CLASS);
+static NTSTATUS (WINAPI *pNtQueryFullAttributesFile)(POBJECT_ATTRIBUTES, PFILE_NETWORK_OPEN_INFORMATION);
static inline BOOL is_signaled( HANDLE obj )
{
@@ -173,6 +174,10 @@ static void create_file_test(void)
'\\','f','a','i','l','i','n','g',0};
static const WCHAR questionmarkInvalidNameW[] = {'a','f','i','l','e','?',0};
static const WCHAR pipeInvalidNameW[] = {'a','|','b',0};
+ static const WCHAR pathInvalidDosW[] = {'\\','D','o','s','D','e','v','i','c','e','s','\\',0};
+ static const WCHAR pathInvalidNtW[] = {'\\','\\','?','\\',0};
+ static const WCHAR pathInvalidNt2W[] = {'\\','?','?','\\',0};
+ FILE_NETWORK_OPEN_INFORMATION info;
NTSTATUS status;
HANDLE dir, file;
WCHAR path[MAX_PATH];
@@ -293,6 +298,39 @@ static void create_file_test(void)
ok(status == STATUS_OBJECT_NAME_INVALID,
"open %s failed %x\n", wine_dbgstr_w(nameW.Buffer), status);
pRtlFreeUnicodeString(&nameW);
+
+ pRtlInitUnicodeString( &nameW, pathInvalidNtW );
+ status = pNtCreateFile(&dir, GENERIC_READ|SYNCHRONIZE, &attr, &io, NULL, 0,
+ FILE_SHARE_READ, FILE_CREATE,
+ FILE_DIRECTORY_FILE|FILE_SYNCHRONOUS_IO_NONALERT, NULL, 0);
+ ok(status == STATUS_OBJECT_NAME_INVALID,
+ "open %s failed %x\n", wine_dbgstr_w(nameW.Buffer), status);
+
+ status = pNtQueryFullAttributesFile(&attr, &info);
+ todo_wine ok(status == STATUS_OBJECT_NAME_INVALID,
+ "query %s failed %x\n", wine_dbgstr_w(nameW.Buffer), status);
+
+ pRtlInitUnicodeString( &nameW, pathInvalidNt2W );
+ status = pNtCreateFile(&dir, GENERIC_READ|SYNCHRONIZE, &attr, &io, NULL, 0,
+ FILE_SHARE_READ, FILE_CREATE,
+ FILE_DIRECTORY_FILE|FILE_SYNCHRONOUS_IO_NONALERT, NULL, 0);
+ ok(status == STATUS_OBJECT_NAME_INVALID,
+ "open %s failed %x\n", wine_dbgstr_w(nameW.Buffer), status);
+
+ status = pNtQueryFullAttributesFile(&attr, &info);
+ ok(status == STATUS_OBJECT_NAME_INVALID,
+ "query %s failed %x\n", wine_dbgstr_w(nameW.Buffer), status);
+
+ pRtlInitUnicodeString( &nameW, pathInvalidDosW );
+ status = pNtCreateFile(&dir, GENERIC_READ|SYNCHRONIZE, &attr, &io, NULL, 0,
+ FILE_SHARE_READ, FILE_CREATE,
+ FILE_DIRECTORY_FILE|FILE_SYNCHRONOUS_IO_NONALERT, NULL, 0);
+ ok(status == STATUS_OBJECT_NAME_INVALID,
+ "open %s failed %x\n", wine_dbgstr_w(nameW.Buffer), status);
+
+ status = pNtQueryFullAttributesFile(&attr, &info);
+ ok(status == STATUS_OBJECT_NAME_INVALID,
+ "query %s failed %x\n", wine_dbgstr_w(nameW.Buffer), status);
}
static void open_file_test(void)
@@ -4158,6 +4196,7 @@ START_TEST(file)
pNtQueryInformationFile = (void *)GetProcAddress(hntdll, "NtQueryInformationFile");
pNtQueryDirectoryFile = (void *)GetProcAddress(hntdll, "NtQueryDirectoryFile");
pNtQueryVolumeInformationFile = (void *)GetProcAddress(hntdll, "NtQueryVolumeInformationFile");
+ pNtQueryFullAttributesFile = (void *)GetProcAddress(hntdll, "NtQueryFullAttributesFile");
test_read_write();
test_NtCreateFile();
--
2.5.0

View File

@ -1 +0,0 @@
Fixes: [39133] Return STATUS_OBJECT_NAME_INVALID in wine_nt_to_unix_file_name for paths that only contain a prefix

View File

@ -1,4 +1,4 @@
From 4a7559e041d5f83e57368a21caf0237f6a24a380 Mon Sep 17 00:00:00 2001
From 587d4844b3971d80d46e5641c29844b75756597c Mon Sep 17 00:00:00 2001
From: Sebastian Lackner <sebastian@fds-team.de>
Date: Sat, 6 Jun 2015 07:03:33 +0800
Subject: ntdll: Improve stub of NtQueryEaFile.
@ -44,13 +44,13 @@ index be6b591..8c8e976 100644
diff --git a/dlls/ntdll/tests/file.c b/dlls/ntdll/tests/file.c
index 70c7a55..ad27906 100644
index 1afb9c8..f13c9a9 100644
--- a/dlls/ntdll/tests/file.c
+++ b/dlls/ntdll/tests/file.c
@@ -79,6 +79,7 @@ static NTSTATUS (WINAPI *pNtQueryDirectoryFile)(HANDLE,HANDLE,PIO_APC_ROUTINE,PV
PVOID,ULONG,FILE_INFORMATION_CLASS,BOOLEAN,PUNICODE_STRING,BOOLEAN);
static NTSTATUS (WINAPI *pNtQueryVolumeInformationFile)(HANDLE,PIO_STATUS_BLOCK,PVOID,ULONG,FS_INFORMATION_CLASS);
static NTSTATUS (WINAPI *pNtQueryFullAttributesFile)(POBJECT_ATTRIBUTES, PFILE_NETWORK_OPEN_INFORMATION);
static NTSTATUS (WINAPI *pNtQueryFullAttributesFile)(const OBJECT_ATTRIBUTES*, FILE_NETWORK_OPEN_INFORMATION*);
+static NTSTATUS (WINAPI *pNtQueryEaFile)(HANDLE,PIO_STATUS_BLOCK,PVOID,ULONG,BOOLEAN,PVOID,ULONG,PULONG,BOOLEAN);
static inline BOOL is_signaled( HANDLE obj )
@ -157,5 +157,5 @@ index 70c7a55..ad27906 100644
+ test_query_ea();
}
--
2.5.0
2.5.1

View File

@ -1,2 +1 @@
Fixes: Improve stub for NtQueryEaFile
Depends: ntdll-Empty_Path

View File

@ -52,7 +52,7 @@ usage()
# Get the upstream commit sha
upstream_commit()
{
echo "781b88b7c586fc295780f0c8ad76bda0ffe96cd1"
echo "9bd963065b1fb7b445d010897d5f84967eadf75b"
}
# Show version information
@ -99,7 +99,6 @@ patch_enable_all ()
enable_configure_Absolute_RPATH="$1"
enable_crypt32_CMS_Certificates="$1"
enable_crypt32_CryptUnprotectMemory="$1"
enable_d3d8_D3DSWAPEFFECT_COPY_VSYNC="$1"
enable_d3d9_DesktopWindow="$1"
enable_d3d9_Skip_Tests="$1"
enable_d3d9_Surface_Refcount="$1"
@ -164,7 +163,6 @@ patch_enable_all ()
enable_kernel32_Profile="$1"
enable_kernel32_SetFileCompletionNotificationModes="$1"
enable_kernel32_SetFileInformationByHandle="$1"
enable_kernel32_ThreadGroupAffinity="$1"
enable_kernel32_TimezoneInformation_Registry="$1"
enable_kernel32_VerifyVersionInfo="$1"
enable_libs_Debug_Channel="$1"
@ -190,7 +188,6 @@ patch_enable_all ()
enable_ntdll_Dealloc_Thread_Stack="$1"
enable_ntdll_DeviceType_Systemroot="$1"
enable_ntdll_DllRedirects="$1"
enable_ntdll_Empty_Path="$1"
enable_ntdll_Exception="$1"
enable_ntdll_FileDispositionInformation="$1"
enable_ntdll_FileFsFullSizeInformation="$1"
@ -231,7 +228,6 @@ patch_enable_all ()
enable_riched20_IText_Interface="$1"
enable_rpcrt4_Pipe_Transport="$1"
enable_secur32_ANSI_NTLM_Credentials="$1"
enable_server_Address_List_Change="$1"
enable_server_ClipCursor="$1"
enable_server_CreateProcess_ACLs="$1"
enable_server_Delete_On_Close="$1"
@ -399,9 +395,6 @@ patch_enable ()
crypt32-CryptUnprotectMemory)
enable_crypt32_CryptUnprotectMemory="$2"
;;
d3d8-D3DSWAPEFFECT_COPY_VSYNC)
enable_d3d8_D3DSWAPEFFECT_COPY_VSYNC="$2"
;;
d3d9-DesktopWindow)
enable_d3d9_DesktopWindow="$2"
;;
@ -594,9 +587,6 @@ patch_enable ()
kernel32-SetFileInformationByHandle)
enable_kernel32_SetFileInformationByHandle="$2"
;;
kernel32-ThreadGroupAffinity)
enable_kernel32_ThreadGroupAffinity="$2"
;;
kernel32-TimezoneInformation_Registry)
enable_kernel32_TimezoneInformation_Registry="$2"
;;
@ -672,9 +662,6 @@ patch_enable ()
ntdll-DllRedirects)
enable_ntdll_DllRedirects="$2"
;;
ntdll-Empty_Path)
enable_ntdll_Empty_Path="$2"
;;
ntdll-Exception)
enable_ntdll_Exception="$2"
;;
@ -795,9 +782,6 @@ patch_enable ()
secur32-ANSI_NTLM_Credentials)
enable_secur32_ANSI_NTLM_Credentials="$2"
;;
server-Address_List_Change)
enable_server_Address_List_Change="$2"
;;
server-ClipCursor)
enable_server_ClipCursor="$2"
;;
@ -1595,9 +1579,6 @@ if test "$enable_category_stable" -eq 1; then
if test "$enable_opengl32_Revert_Disable_Ext" -gt 1; then
abort "Patchset opengl32-Revert_Disable_Ext disabled, but category-stable depends on that."
fi
if test "$enable_server_Address_List_Change" -gt 1; then
abort "Patchset server-Address_List_Change disabled, but category-stable depends on that."
fi
if test "$enable_server_ClipCursor" -gt 1; then
abort "Patchset server-ClipCursor disabled, but category-stable depends on that."
fi
@ -1728,7 +1709,6 @@ if test "$enable_category_stable" -eq 1; then
enable_ntdll_User_Shared_Data=1
enable_ntdll_WriteWatches=1
enable_opengl32_Revert_Disable_Ext=1
enable_server_Address_List_Change=1
enable_server_ClipCursor=1
enable_server_CreateProcess_ACLs=1
enable_server_Delete_On_Close=1
@ -1911,13 +1891,6 @@ if test "$enable_ntdll_Junction_Points" -eq 1; then
enable_ntdll_NtQueryEaFile=1
fi
if test "$enable_ntdll_NtQueryEaFile" -eq 1; then
if test "$enable_ntdll_Empty_Path" -gt 1; then
abort "Patchset ntdll-Empty_Path disabled, but ntdll-NtQueryEaFile depends on that."
fi
enable_ntdll_Empty_Path=1
fi
if test "$enable_ntdll_Fix_Alignment" -eq 1; then
if test "$enable_ntdll_Virtual_Memory_Stack" -gt 1; then
abort "Patchset ntdll-Virtual_Memory_Stack disabled, but ntdll-Fix_Alignment depends on that."
@ -2446,21 +2419,6 @@ if test "$enable_crypt32_CryptUnprotectMemory" -eq 1; then
) >> "$patchlist"
fi
# Patchset d3d8-D3DSWAPEFFECT_COPY_VSYNC
# |
# | This patchset fixes the following Wine bugs:
# | * [#39281] Implement semi-stub for d3d8 swapchain effect D3DSWAPEFFECT_COPY_VSYNC
# |
# | Modified files:
# | * dlls/d3d8/device.c
# |
if test "$enable_d3d8_D3DSWAPEFFECT_COPY_VSYNC" -eq 1; then
patch_apply d3d8-D3DSWAPEFFECT_COPY_VSYNC/0001-d3d8-Handle-D3DSWAPEFFECT_COPY_VSYNC-swapchain-effec.patch
(
echo '+ { "Sebastian Lackner", "d3d8: Handle D3DSWAPEFFECT_COPY_VSYNC swapchain effect like D3DSWAPEFFECT_COPY.", 1 },';
) >> "$patchlist"
fi
# Patchset d3d9-DesktopWindow
# |
# | Modified files:
@ -3651,24 +3609,6 @@ if test "$enable_kernel32_SetFileCompletionNotificationModes" -eq 1; then
) >> "$patchlist"
fi
# Patchset kernel32-ThreadGroupAffinity
# |
# | This patchset fixes the following Wine bugs:
# | * [#36549] Implement {Set,Get}ThreadGroupAffinity and related ntdll functions
# |
# | Modified files:
# | * dlls/kernel32/kernel32.spec, dlls/kernel32/tests/thread.c, dlls/kernel32/thread.c, dlls/ntdll/thread.c,
# | include/winternl.h
# |
if test "$enable_kernel32_ThreadGroupAffinity" -eq 1; then
patch_apply kernel32-ThreadGroupAffinity/0001-ntdll-Implement-ThreadGroupInformation-class.patch
patch_apply kernel32-ThreadGroupAffinity/0002-kernel32-Implement-Set-GetThreadGroupAffinity.patch
(
echo '+ { "Michael Müller", "ntdll: Implement ThreadGroupInformation class.", 1 },';
echo '+ { "Michael Müller", "kernel32: Implement Set/GetThreadGroupAffinity.", 1 },';
) >> "$patchlist"
fi
# Patchset kernel32-TimezoneInformation_Registry
# |
# | Modified files:
@ -4095,21 +4035,6 @@ if test "$enable_ntdll_DllRedirects" -eq 1; then
) >> "$patchlist"
fi
# Patchset ntdll-Empty_Path
# |
# | This patchset fixes the following Wine bugs:
# | * [#39133] Return STATUS_OBJECT_NAME_INVALID in wine_nt_to_unix_file_name for paths that only contain a prefix
# |
# | Modified files:
# | * dlls/kernel32/tests/file.c, dlls/ntdll/directory.c, dlls/ntdll/tests/file.c
# |
if test "$enable_ntdll_Empty_Path" -eq 1; then
patch_apply ntdll-Empty_Path/0001-ntdll-Return-STATUS_OBJECT_NAME_INVALID-in-wine_nt_t.patch
(
echo '+ { "Michael Müller", "ntdll: Return STATUS_OBJECT_NAME_INVALID in wine_nt_to_unix_file_name for paths that only contain a prefix.", 1 },';
) >> "$patchlist"
fi
# Patchset ntdll-Exception
# |
# | Modified files:
@ -4225,9 +4150,6 @@ fi
# Patchset ntdll-NtQueryEaFile
# |
# | This patchset has the following (direct or indirect) dependencies:
# | * ntdll-Empty_Path
# |
# | Modified files:
# | * dlls/ntdll/file.c, dlls/ntdll/tests/file.c
# |
@ -4241,7 +4163,7 @@ fi
# Patchset ntdll-Junction_Points
# |
# | This patchset has the following (direct or indirect) dependencies:
# | * ntdll-Fix_Free, ntdll-Empty_Path, ntdll-NtQueryEaFile
# | * ntdll-Fix_Free, ntdll-NtQueryEaFile
# |
# | This patchset fixes the following Wine bugs:
# | * [#12401] Support for Junction Points
@ -4749,21 +4671,6 @@ if test "$enable_secur32_ANSI_NTLM_Credentials" -eq 1; then
) >> "$patchlist"
fi
# Patchset server-Address_List_Change
# |
# | This patchset fixes the following Wine bugs:
# | * [#38062] Support for non-blocking SIO_ADDRESS_LIST_CHANGE requests
# |
# | Modified files:
# | * server/sock.c
# |
if test "$enable_server_Address_List_Change" -eq 1; then
patch_apply server-Address_List_Change/0001-server-Return-STATUS_CANT_WAIT-WSAEWOULDBLOCK-for-no.patch
(
echo '+ { "Erich E. Hoover", "server: Return STATUS_CANT_WAIT/WSAEWOULDBLOCK for non-overlapped SIO_ADDRESS_LIST_CHANGE requests on non-blocking sockets.", 1 },';
) >> "$patchlist"
fi
# Patchset server-ClipCursor
# |
# | This patchset fixes the following Wine bugs:

View File

@ -1,29 +0,0 @@
From 9d55100d71863cfcbf71114d3578be1d58f74377 Mon Sep 17 00:00:00 2001
From: "Erich E. Hoover" <erich.e.hoover@wine-staging.com>
Date: Fri, 20 Feb 2015 14:03:34 -0700
Subject: server: Return STATUS_CANT_WAIT/WSAEWOULDBLOCK for non-overlapped
SIO_ADDRESS_LIST_CHANGE requests on non-blocking sockets.
---
server/sock.c | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/server/sock.c b/server/sock.c
index 67d6416..1767dea 100644
--- a/server/sock.c
+++ b/server/sock.c
@@ -546,6 +546,11 @@ obj_handle_t sock_ioctl( struct fd *fd, ioctl_code_t code, const async_data_t *a
switch(code)
{
case WS_SIO_ADDRESS_LIST_CHANGE:
+ if ((sock->state & FD_WINE_NONBLOCKING) && !blocking)
+ {
+ set_error( STATUS_CANT_WAIT );
+ return 0;
+ }
if (!(ifchange_q = sock_get_ifchange_q( sock ))) return 0;
if (!(async = create_async( current, ifchange_q, async_data ))) return 0;
if (blocking) wait_handle = alloc_handle( current->process, async, SYNCHRONIZE, 0 );
--
2.4.0

View File

@ -1,2 +0,0 @@
Fixes: [38062] Support for non-blocking SIO_ADDRESS_LIST_CHANGE requests
Category: stable