Compare commits

...

18 Commits
v4.15 ... v4.16

Author SHA1 Message Date
Alistair Leslie-Hughes
c323ef47c7 Release v4.16 2019-09-14 17:17:30 +10:00
Zebediah Figura
9e6693ed13 ntdll-Interrupt-0x2e: Fully handle interrupt 0x2e on the signal stack. 2019-09-13 17:12:40 -05:00
Zebediah Figura
29bdd4cd85 ntdll-Signal_Handler: Restore accidentally deleted hunk. 2019-09-13 17:03:26 -05:00
Zebediah Figura
39d7dcb2c6 Rebase against 3bf7473b880eea8b8dcaa43487afda2d7b1fbd03. 2019-09-13 17:03:00 -05:00
Alistair Leslie-Hughes
2e4d0f4727 Updated wined3d-zero-inf-shaders patchset 2019-09-13 09:28:30 +10:00
Alistair Leslie-Hughes
fd818b1914 Update mfplat-MFGetConfigurationDWORD patchset 2019-09-13 09:28:30 +10:00
Alistair Leslie-Hughes
26e542b4e5 Rebase against 85d8d1390467147fca416236fd50bb6ea2e2c8e4 2019-09-13 09:28:30 +10:00
Alistair Leslie-Hughes
6ef7be2566 Updated directmanipulation-new-dll patchset 2019-09-12 09:00:15 +10:00
Alistair Leslie-Hughes
5b012f08d5 Added mfplat-MFGetConfigurationDWORD patchset 2019-09-12 09:00:15 +10:00
Alistair Leslie-Hughes
8390ba0d95 Added wined3d-zero-inf-shaders patchset 2019-09-12 08:33:01 +10:00
Alistair Leslie-Hughes
fb18deb95f Rebase against 1413f577c592cd4aaeb3dba1a8adbe3e04d62d29 2019-09-11 09:26:34 +10:00
Alistair Leslie-Hughes
27b33a4be9 Remove setupapi-Display_Device patchset
This has been reported as fixed upstream and is no longer required.

Thanks Zhiyi Zhang.
2019-09-10 18:16:20 +10:00
Zebediah Figura
a15bdaa0ba Rebase against 01b19b63a454aa455928c10c694895fdba901aba. 2019-09-09 18:52:44 -05:00
Zebediah Figura
734918298c Rebase against 765815729fc4af2472e60551364e3b29dccfbcff. 2019-09-06 17:38:54 -05:00
Alistair Leslie-Hughes
bc1aa54891 Rebase against 92c00c51b21594987d342b5ce00c174ab4e84595 2019-09-05 08:52:02 +10:00
Alistair Leslie-Hughes
2da0d341f6 Rebase against 363b8809f37b3ea5915ea4240b3d397fd2355e2e 2019-09-04 08:23:20 +10:00
Alistair Leslie-Hughes
155cb0b051 Rebase against 0c2f5f8b15a4f7bb7008c3efb12b4cd3c774a3a1 2019-09-04 08:02:11 +10:00
Alistair Leslie-Hughes
498c9eae60 Added macos-compile patchset 2019-09-04 07:58:11 +10:00
25 changed files with 836 additions and 713 deletions

View File

@@ -0,0 +1,26 @@
From 5d5892c9403b77bd3f17acebfee1acc7e95003a0 Mon Sep 17 00:00:00 2001
From: Alistair Leslie-Hughes <leslie_alistair@hotmail.com>
Date: Tue, 30 Jul 2019 09:30:41 +1000
Subject: [PATCH 1/4] directmanipulation: Fake success from
IDirectManipulationViewport2 ActivateConfiguration.
---
dlls/directmanipulation/directmanipulation.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/dlls/directmanipulation/directmanipulation.c b/dlls/directmanipulation/directmanipulation.c
index 4f16963d42..f1e008bc7f 100644
--- a/dlls/directmanipulation/directmanipulation.c
+++ b/dlls/directmanipulation/directmanipulation.c
@@ -370,7 +370,7 @@ static HRESULT WINAPI viewport_ActivateConfiguration(IDirectManipulationViewport
{
struct directviewport *This = impl_from_IDirectManipulationViewport2(iface);
FIXME("%p, %d\n", This, configuration);
- return E_NOTIMPL;
+ return S_OK;
}
static HRESULT WINAPI viewport_SetManualGesture(IDirectManipulationViewport2 *iface, DIRECTMANIPULATION_GESTURE_CONFIGURATION configuration)
--
2.17.1

View File

@@ -0,0 +1,91 @@
From 34c03e1857d977ef7ec913628a358092f749394b Mon Sep 17 00:00:00 2001
From: Alistair Leslie-Hughes <leslie_alistair@hotmail.com>
Date: Wed, 31 Jul 2019 10:03:26 +1000
Subject: [PATCH 2/4] include: Add IDirectManipulationPrimaryContent interface
---
include/directmanipulation.idl | 61 ++++++++++++++++++++++++++++++++++
1 file changed, 61 insertions(+)
diff --git a/include/directmanipulation.idl b/include/directmanipulation.idl
index 443b31a0ce..a49f368d11 100644
--- a/include/directmanipulation.idl
+++ b/include/directmanipulation.idl
@@ -88,6 +88,39 @@ typedef enum DIRECTMANIPULATION_MOTION_TYPES
DIRECTMANIPULATION_MOTION_CENTERY
} DIRECTMANIPULATION_MOTION_TYPES;
+typedef enum DIRECTMANIPULATION_SNAPPOINT_TYPE
+{
+ DIRECTMANIPULATION_SNAPPOINT_MANDATORY = 0,
+ DIRECTMANIPULATION_SNAPPOINT_OPTIONAL = 1,
+ DIRECTMANIPULATION_SNAPPOINT_MANDATORY_SINGLE = 2,
+ DIRECTMANIPULATION_SNAPPOINT_OPTIONAL_SINGLE = 3
+} DIRECTMANIPULATION_SNAPPOINT_TYPE;
+
+typedef enum DIRECTMANIPULATION_SNAPPOINT_COORDINATE
+{
+ DIRECTMANIPULATION_COORDINATE_BOUNDARY = 0x00,
+ DIRECTMANIPULATION_COORDINATE_ORIGIN = 0x01,
+ DIRECTMANIPULATION_COORDINATE_MIRRORED = 0x10
+} DIRECTMANIPULATION_SNAPPOINT_COORDINATE;
+
+typedef enum DIRECTMANIPULATION_HORIZONTALALIGNMENT
+{
+ DIRECTMANIPULATION_HORIZONTALALIGNMENT_NONE = 0x00,
+ DIRECTMANIPULATION_HORIZONTALALIGNMENT_LEFT = 0x01,
+ DIRECTMANIPULATION_HORIZONTALALIGNMENT_CENTER = 0x02,
+ DIRECTMANIPULATION_HORIZONTALALIGNMENT_RIGHT = 0x04,
+ DIRECTMANIPULATION_HORIZONTALALIGNMENT_UNLOCKCENTER = 0x08
+} DIRECTMANIPULATION_HORIZONTALALIGNMENT;
+
+typedef enum DIRECTMANIPULATION_VERTICALALIGNMENT
+{
+ DIRECTMANIPULATION_VERTICALALIGNMENT_NONE = 0x00,
+ DIRECTMANIPULATION_VERTICALALIGNMENT_TOP = 0x01,
+ DIRECTMANIPULATION_VERTICALALIGNMENT_CENTER = 0x02,
+ DIRECTMANIPULATION_VERTICALALIGNMENT_BOTTOM = 0x04,
+ DIRECTMANIPULATION_VERTICALALIGNMENT_UNLOCKCENTER = 0x08
+} DIRECTMANIPULATION_VERTICALALIGNMENT;
+
typedef enum DIRECTMANIPULATION_INPUT_MODE
{
DIRECTMANIPULATION_INPUT_MODE_AUTOMATIC = 0,
@@ -309,6 +342,34 @@ interface IDirectManipulationManager2 : IDirectManipulationManager
HRESULT CreateBehavior([in] REFCLSID clsid, [in] REFIID riid, [out, iid_is(riid), retval] void **obj);
}
+[
+ local,
+ object,
+ uuid(c12851e4-1698-4625-b9b1-7ca3ec18630b),
+ pointer_default(unique)
+]
+interface IDirectManipulationPrimaryContent : IUnknown
+{
+ HRESULT SetSnapInterval([in] DIRECTMANIPULATION_MOTION_TYPES motion, [in] float interval, [in] float offset);
+
+ HRESULT SetSnapPoints([in] DIRECTMANIPULATION_MOTION_TYPES motion, [in] const float *points, [in] DWORD count);
+
+ HRESULT SetSnapType([in] DIRECTMANIPULATION_MOTION_TYPES motion, [in] DIRECTMANIPULATION_SNAPPOINT_TYPE type);
+
+ HRESULT SetSnapCoordinate([in] DIRECTMANIPULATION_MOTION_TYPES motion, [in] DIRECTMANIPULATION_SNAPPOINT_COORDINATE coordinate,
+ [in] float origin);
+
+ HRESULT SetZoomBoundaries([in] float minimum, [in] float maximum);
+
+ HRESULT SetHorizontalAlignment([in] DIRECTMANIPULATION_HORIZONTALALIGNMENT alignment);
+
+ HRESULT SetVerticalAlignment([in] DIRECTMANIPULATION_VERTICALALIGNMENT alignment);
+
+ HRESULT GetInertiaEndTransform([out] float *matrix, [in] DWORD count);
+
+ HRESULT GetCenterPoint([out] float *x, [out] float *y);
+}
+
[
uuid(9fbedf98-f6d8-4e3b-b488-fa66dbf5e9f3),
version(1.0)
--
2.17.1

View File

@@ -0,0 +1,186 @@
From 52d03476a908684bb201ae69032f39bf2a745190 Mon Sep 17 00:00:00 2001
From: Alistair Leslie-Hughes <leslie_alistair@hotmail.com>
Date: Fri, 23 Aug 2019 11:34:16 +1000
Subject: [PATCH 3/4] directmanipulation: Implement
IDirectManipulationViewport2 GetPrimaryContent
---
dlls/directmanipulation/directmanipulation.c | 155 ++++++++++++++++++-
1 file changed, 154 insertions(+), 1 deletion(-)
diff --git a/dlls/directmanipulation/directmanipulation.c b/dlls/directmanipulation/directmanipulation.c
index f1e008bc7f..ca60e76db6 100644
--- a/dlls/directmanipulation/directmanipulation.c
+++ b/dlls/directmanipulation/directmanipulation.c
@@ -177,6 +177,142 @@ static HRESULT create_update_manager(IDirectManipulationUpdateManager **obj)
return S_OK;
}
+
+struct primarycontext
+{
+ IDirectManipulationPrimaryContent IDirectManipulationPrimaryContent_iface;
+ LONG ref;
+};
+
+static inline struct primarycontext *impl_from_IDirectManipulationPrimaryContent(IDirectManipulationPrimaryContent *iface)
+{
+ return CONTAINING_RECORD(iface, struct primarycontext, IDirectManipulationPrimaryContent_iface);
+}
+
+static HRESULT WINAPI primary_QueryInterface(IDirectManipulationPrimaryContent *iface, REFIID riid, void **ppv)
+{
+ struct primarycontext *This = impl_from_IDirectManipulationPrimaryContent(iface);
+ TRACE("(%p)->(%s,%p)\n", This, debugstr_guid(riid), ppv);
+
+ if (IsEqualGUID(riid, &IID_IUnknown) ||
+ IsEqualGUID(riid, &IID_IDirectManipulationPrimaryContent))
+ {
+ IDirectManipulationPrimaryContent_AddRef(&This->IDirectManipulationPrimaryContent_iface);
+ *ppv = &This->IDirectManipulationPrimaryContent_iface;
+ return S_OK;
+ }
+
+ FIXME("(%p)->(%s,%p),not found\n", This, debugstr_guid(riid), ppv);
+ return E_NOINTERFACE;
+}
+
+static ULONG WINAPI primary_AddRef(IDirectManipulationPrimaryContent *iface)
+{
+ struct primarycontext *This = impl_from_IDirectManipulationPrimaryContent(iface);
+ ULONG ref = InterlockedIncrement(&This->ref);
+
+ TRACE("(%p) ref=%u\n", This, ref);
+
+ return ref;
+}
+
+static ULONG WINAPI primary_Release(IDirectManipulationPrimaryContent *iface)
+{
+ struct primarycontext *This = impl_from_IDirectManipulationPrimaryContent(iface);
+ ULONG ref = InterlockedDecrement(&This->ref);
+
+ TRACE("(%p) ref=%u\n", This, ref);
+
+ if (!ref)
+ {
+ heap_free(This);
+ }
+ return ref;
+}
+
+static HRESULT WINAPI primary_SetSnapInterval(IDirectManipulationPrimaryContent *iface, DIRECTMANIPULATION_MOTION_TYPES motion,
+ float interval, float offset)
+{
+ struct primarycontext *This = impl_from_IDirectManipulationPrimaryContent(iface);
+ FIXME("%p, %d, %f, %f\n", This, motion, interval, offset);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI primary_SetSnapPoints(IDirectManipulationPrimaryContent *iface, DIRECTMANIPULATION_MOTION_TYPES motion,
+ const float *points, DWORD count)
+{
+ struct primarycontext *This = impl_from_IDirectManipulationPrimaryContent(iface);
+ FIXME("%p, %d, %p, %d\n", This, motion, points, count);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI primary_SetSnapType(IDirectManipulationPrimaryContent *iface, DIRECTMANIPULATION_MOTION_TYPES motion,
+ DIRECTMANIPULATION_SNAPPOINT_TYPE type)
+{
+ struct primarycontext *This = impl_from_IDirectManipulationPrimaryContent(iface);
+ FIXME("%p, %d, %d\n", This, motion, type);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI primary_SetSnapCoordinate(IDirectManipulationPrimaryContent *iface, DIRECTMANIPULATION_MOTION_TYPES motion,
+ DIRECTMANIPULATION_SNAPPOINT_COORDINATE coordinate, float origin)
+{
+ struct primarycontext *This = impl_from_IDirectManipulationPrimaryContent(iface);
+ FIXME("%p, %d, %d, %f\n", This, motion, coordinate, origin);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI primary_SetZoomBoundaries(IDirectManipulationPrimaryContent *iface, float minimum, float maximum)
+{
+ struct primarycontext *This = impl_from_IDirectManipulationPrimaryContent(iface);
+ FIXME("%p, %f, %f\n", This, minimum, maximum);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI primary_SetHorizontalAlignment(IDirectManipulationPrimaryContent *iface, DIRECTMANIPULATION_HORIZONTALALIGNMENT alignment)
+{
+ struct primarycontext *This = impl_from_IDirectManipulationPrimaryContent(iface);
+ FIXME("%p, %d\n", This, alignment);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI primary_SetVerticalAlignment(IDirectManipulationPrimaryContent *iface, DIRECTMANIPULATION_VERTICALALIGNMENT alignment)
+{
+ struct primarycontext *This = impl_from_IDirectManipulationPrimaryContent(iface);
+ FIXME("%p, %d\n", This, alignment);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI primary_GetInertiaEndTransform(IDirectManipulationPrimaryContent *iface, float *matrix, DWORD count)
+{
+ struct primarycontext *This = impl_from_IDirectManipulationPrimaryContent(iface);
+ FIXME("%p, %p, %d\n", This, matrix, count);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI primary_GetCenterPoint(IDirectManipulationPrimaryContent *iface, float *x, float *y)
+{
+ struct primarycontext *This = impl_from_IDirectManipulationPrimaryContent(iface);
+ FIXME("%p, %p, %p\n", This, x, y);
+ return E_NOTIMPL;
+}
+
+static const IDirectManipulationPrimaryContentVtbl primaryVtbl =
+{
+ primary_QueryInterface,
+ primary_AddRef,
+ primary_Release,
+ primary_SetSnapInterval,
+ primary_SetSnapPoints,
+ primary_SetSnapType,
+ primary_SetSnapCoordinate,
+ primary_SetZoomBoundaries,
+ primary_SetHorizontalAlignment,
+ primary_SetVerticalAlignment,
+ primary_GetInertiaEndTransform,
+ primary_GetCenterPoint
+};
+
struct directviewport
{
IDirectManipulationViewport2 IDirectManipulationViewport2_iface;
@@ -327,7 +463,24 @@ static HRESULT WINAPI viewport_SyncDisplayTransform(IDirectManipulationViewport2
static HRESULT WINAPI viewport_GetPrimaryContent(IDirectManipulationViewport2 *iface, REFIID riid, void **object)
{
struct directviewport *This = impl_from_IDirectManipulationViewport2(iface);
- FIXME("%p, %s, %p\n", This, debugstr_guid(riid), object);
+ TRACE("%p, %s, %p\n", This, debugstr_guid(riid), object);
+ if(IsEqualGUID(riid, &IID_IDirectManipulationPrimaryContent))
+ {
+ struct primarycontext *primary;
+ TRACE("IDirectManipulationPrimaryContent\n");
+ primary = heap_alloc( sizeof(*primary));
+ if(!primary)
+ return E_OUTOFMEMORY;
+
+ primary->IDirectManipulationPrimaryContent_iface.lpVtbl = &primaryVtbl;
+ primary->ref = 1;
+
+ *object = &primary->IDirectManipulationPrimaryContent_iface;
+
+ return S_OK;
+ }
+ else
+ FIXME("Unsupported interface %s\n", debugstr_guid(riid));
return E_NOTIMPL;
}
--
2.17.1

View File

@@ -1,24 +1,24 @@
From efdcaba02d66b65177ce73686f4d4b5fb8f6e4f8 Mon Sep 17 00:00:00 2001
From b617701d440a9b5210762503cf441e9fcb3132e1 Mon Sep 17 00:00:00 2001
From: Sebastian Lackner <sebastian@fds-team.de>
Date: Fri, 13 Jan 2017 01:59:13 +0100
Subject: kernel32: Always start debugger on WinSta0.
---
dlls/kernel32/except.c | 1 +
dlls/kernelbase/debug.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/dlls/kernel32/except.c b/dlls/kernel32/except.c
index 1a1521a8038..cbc880f9a44 100644
--- a/dlls/kernel32/except.c
+++ b/dlls/kernel32/except.c
@@ -314,6 +314,7 @@ static BOOL start_debugger(PEXCEPTION_POINTERS epointers, HANDLE hEvent)
TRACE("Starting debugger %s\n", debugstr_a(cmdline));
memset(&startup, 0, sizeof(startup));
diff --git a/dlls/kernelbase/debug.c b/dlls/kernelbase/debug.c
index 016c21109..0681f726b 100644
--- a/dlls/kernelbase/debug.c
+++ b/dlls/kernelbase/debug.c
@@ -640,6 +640,7 @@ static BOOL start_debugger( EXCEPTION_POINTERS *epointers, HANDLE event )
TRACE( "Starting debugger %s\n", debugstr_w(cmdline) );
memset( &startup, 0, sizeof(startup) );
startup.cb = sizeof(startup);
+ startup.lpDesktop = (char *)"WinSta0";
startup.dwFlags = STARTF_USESHOWWINDOW;
startup.wShowWindow = SW_SHOWNORMAL;
ret = CreateProcessA(NULL, cmdline, NULL, NULL, TRUE, 0, env, NULL, &startup, &info);
ret = CreateProcessW( NULL, cmdline, NULL, NULL, TRUE, 0, env, NULL, &startup, &info );
--
2.11.0
2.23.0

View File

@@ -0,0 +1,50 @@
From cd8c2fb687e322b2d142ad0d6b23978e56df5a5c Mon Sep 17 00:00:00 2001
From: Andrey Gusev <andrey.goosev@gmail.com>
Date: Sun, 1 Sep 2019 18:34:53 +0300
Subject: [PATCH 1/2] mfplat: Add DestroyPropVariant stub.
---
dlls/mfplat/main.c | 13 +++++++++++++
dlls/mfplat/mfplat.spec | 2 +-
2 files changed, 14 insertions(+), 1 deletion(-)
diff --git a/dlls/mfplat/main.c b/dlls/mfplat/main.c
index 5cbf1212f7..755b86aced 100644
--- a/dlls/mfplat/main.c
+++ b/dlls/mfplat/main.c
@@ -7619,6 +7619,19 @@ HRESULT WINAPI CreatePropertyStore(IPropertyStore **store)
return S_OK;
}
+/***********************************************************************
+ * DestroyPropVariant (mfplat.@)
+ */
+HRESULT WINAPI DestroyPropVariant(PROPVARIANT *pv)
+{
+ FIXME("%p stub!\n", pv);
+
+ if (!pv)
+ return E_POINTER;
+
+ return E_NOTIMPL;
+}
+
struct dxgi_device_manager
{
IMFDXGIDeviceManager IMFDXGIDeviceManager_iface;
diff --git a/dlls/mfplat/mfplat.spec b/dlls/mfplat/mfplat.spec
index cc440c5ee0..a217bda82d 100644
--- a/dlls/mfplat/mfplat.spec
+++ b/dlls/mfplat/mfplat.spec
@@ -11,7 +11,7 @@
@ stub CopyPropVariant
@ stub CreatePropVariant
@ stdcall CreatePropertyStore(ptr)
-@ stub DestroyPropVariant
+@ stdcall DestroyPropVariant(ptr)
@ stub GetAMSubtypeFromD3DFormat
@ stub GetD3DFormatFromMFSubtype
@ stub LFGetGlobalPool
--
2.17.1

View File

@@ -0,0 +1,47 @@
From a45f5f4a1605bd5c1324c641bbe6fbc5d5c3df90 Mon Sep 17 00:00:00 2001
From: Andrey Gusev <andrey.goosev@gmail.com>
Date: Sun, 1 Sep 2019 17:40:05 +0300
Subject: [PATCH 2/2] mfplat: Add MFGetConfigurationDWORD stub.
---
dlls/mfplat/main.c | 10 ++++++++++
dlls/mfplat/mfplat.spec | 2 +-
2 files changed, 11 insertions(+), 1 deletion(-)
diff --git a/dlls/mfplat/main.c b/dlls/mfplat/main.c
index 755b86aced..a74d472d15 100644
--- a/dlls/mfplat/main.c
+++ b/dlls/mfplat/main.c
@@ -2300,6 +2300,16 @@ static HRESULT attributes_deserialize_read(struct attr_serialize_context *contex
return S_OK;
}
+/***********************************************************************
+ * MFGetConfigurationDWORD (mfplat.@)
+ */
+HRESULT WINAPI MFGetConfigurationDWORD(void *unk1, void *unk2, void *unk3)
+{
+ FIXME("%p, %p, %p stub!\n", unk1, unk2, unk3);
+
+ return E_NOTIMPL;
+}
+
/***********************************************************************
* MFInitAttributesFromBlob (mfplat.@)
*/
diff --git a/dlls/mfplat/mfplat.spec b/dlls/mfplat/mfplat.spec
index a217bda82d..18cefa936b 100644
--- a/dlls/mfplat/mfplat.spec
+++ b/dlls/mfplat/mfplat.spec
@@ -89,7 +89,7 @@
@ stub MFGetAdaptersAddresses
@ stdcall MFGetAttributesAsBlob(ptr ptr long)
@ stdcall MFGetAttributesAsBlobSize(ptr ptr)
-@ stub MFGetConfigurationDWORD
+@ stdcall MFGetConfigurationDWORD(ptr ptr ptr)
@ stub MFGetConfigurationPolicy
@ stub MFGetConfigurationStore
@ stub MFGetConfigurationString
--
2.17.1

View File

@@ -0,0 +1 @@
Fixes: [47757] - mfplat: Add MFGetConfigurationDWORD stub.

View File

@@ -1,19 +1,19 @@
From d14f1523f3694d7bc2c7c79b6b7bd6f2a354bfb7 Mon Sep 17 00:00:00 2001
From bf3b9244f374b9926db04b63b29f77139280b44a Mon Sep 17 00:00:00 2001
From: Sebastian Lackner <sebastian@fds-team.de>
Date: Sun, 28 Sep 2014 23:39:51 +0200
Subject: ntdll: OutputDebugString should throw the exception a second time, if
a debugger is attached.
---
dlls/kernel32/debugger.c | 17 +++++++++++++++++
dlls/kernelbase/debug.c | 17 +++++++++++++++++
dlls/ntdll/tests/exception.c | 11 +++++------
2 files changed, 22 insertions(+), 6 deletions(-)
diff --git a/dlls/kernel32/debugger.c b/dlls/kernel32/debugger.c
index a277f93..2fb9c73 100644
--- a/dlls/kernel32/debugger.c
+++ b/dlls/kernel32/debugger.c
@@ -277,6 +277,23 @@ void WINAPI OutputDebugStringA( LPCSTR str )
diff --git a/dlls/kernelbase/debug.c b/dlls/kernelbase/debug.c
index 016c21109..a3d14d340 100644
--- a/dlls/kernelbase/debug.c
+++ b/dlls/kernelbase/debug.c
@@ -210,6 +210,23 @@ void WINAPI DECLSPEC_HOTPATCH OutputDebugStringA( LPCSTR str )
__ENDTRY
if (caught_by_dbg) return;
@@ -38,10 +38,10 @@ index a277f93..2fb9c73 100644
if (!mutex_inited)
{
diff --git a/dlls/ntdll/tests/exception.c b/dlls/ntdll/tests/exception.c
index 7462024..151b67a 100644
index 0a9dae138..b7b0f0e70 100644
--- a/dlls/ntdll/tests/exception.c
+++ b/dlls/ntdll/tests/exception.c
@@ -2063,7 +2063,7 @@ static LONG CALLBACK outputdebugstring_vectored_handler(EXCEPTION_POINTERS *Exce
@@ -2751,7 +2751,7 @@ static LONG CALLBACK outputdebugstring_vectored_handler(EXCEPTION_POINTERS *Exce
return EXCEPTION_CONTINUE_SEARCH;
}
@@ -50,7 +50,7 @@ index 7462024..151b67a 100644
{
PVOID vectored_handler;
@@ -2079,7 +2079,6 @@ static void test_outputdebugstring(DWORD numexc, BOOL todo)
@@ -2767,7 +2767,6 @@ static void test_outputdebugstring(DWORD numexc, BOOL todo)
outputdebugstring_exceptions = 0;
OutputDebugStringA("Hello World");
@@ -58,7 +58,7 @@ index 7462024..151b67a 100644
ok(outputdebugstring_exceptions == numexc, "OutputDebugStringA generated %d exceptions, expected %d\n",
outputdebugstring_exceptions, numexc);
@@ -2522,9 +2521,9 @@ START_TEST(exception)
@@ -3448,9 +3447,9 @@ START_TEST(exception)
run_rtlraiseexception_test(EXCEPTION_BREAKPOINT);
run_rtlraiseexception_test(EXCEPTION_INVALID_HANDLE);
test_stage = 3;
@@ -70,7 +70,7 @@ index 7462024..151b67a 100644
test_stage = 5;
test_ripevent(0);
test_stage = 6;
@@ -2553,7 +2552,7 @@ START_TEST(exception)
@@ -3481,7 +3480,7 @@ START_TEST(exception)
test_exceptions();
test_rtlraiseexception();
test_debug_registers();
@@ -79,7 +79,7 @@ index 7462024..151b67a 100644
test_ripevent(1);
test_debug_service(1);
test_breakpoint(1);
@@ -2586,7 +2585,7 @@ START_TEST(exception)
@@ -3519,7 +3518,7 @@ START_TEST(exception)
"_setjmp" );
test_debug_registers();
@@ -89,5 +89,5 @@ index 7462024..151b67a 100644
test_debug_service(1);
test_breakpoint(1);
--
2.9.0
2.23.0

View File

@@ -1,55 +1,28 @@
From 40f4e264b0c957eafe187bc0de597c3aa18dc6be Mon Sep 17 00:00:00 2001
From 2873f540b5334e1562b1b2f0f537ee5a27b23592 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Michael=20M=C3=BCller?= <michael@fds-team.de>
Date: Sun, 19 Mar 2017 19:08:34 +0100
Subject: ntdll: Catch windows int 0x2e syscall on i386.
Subject: [PATCH] ntdll: Catch windows int 0x2e syscall on i386.
---
dlls/ntdll/signal_i386.c | 13 +++++++++++++
include/wine/exception.h | 1 +
2 files changed, 14 insertions(+)
dlls/ntdll/signal_i386.c | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/dlls/ntdll/signal_i386.c b/dlls/ntdll/signal_i386.c
index d76fe95dfa..93d9418527 100644
index 8d1c59150..ca2c67333 100644
--- a/dlls/ntdll/signal_i386.c
+++ b/dlls/ntdll/signal_i386.c
@@ -1572,6 +1572,14 @@ static inline BOOL handle_interrupt( unsigned int interrupt, EXCEPTION_RECORD *r
rec->ExceptionInformation[1] = context->Ecx;
rec->ExceptionInformation[2] = context->Edx;
@@ -1946,6 +1946,11 @@ static BOOL handle_interrupt( unsigned int interrupt, ucontext_t *sigcontext, st
stack->rec.ExceptionInformation[2] = stack->context.Edx;
setup_raise_exception( sigcontext, stack );
return TRUE;
+ case 0x2e:
+ context->Eip += 2;
+ rec->ExceptionCode = EXCEPTION_WINE_SYSCALL;
+ rec->ExceptionAddress = (void *)context->Eip;
+ rec->NumberParameters = 2;
+ rec->ExceptionInformation[0] = context->Eax;
+ rec->ExceptionInformation[1] = context->Edx;
+ FIXME("unimplemented syscall handler for %#lx\n", stack->context.Eax);
+ EAX_sig(sigcontext) = STATUS_INVALID_SYSTEM_SERVICE;
+ EIP_sig(sigcontext) += 2;
+ return TRUE;
default:
return FALSE;
}
@@ -1953,6 +1961,11 @@ static void WINAPI raise_segv_exception( EXCEPTION_RECORD *rec, CONTEXT *context
}
}
break;
+ case EXCEPTION_WINE_SYSCALL:
+ FIXME("unimplemented syscall handler for 0x%lx, stack 0x%lx\n",
+ rec->ExceptionInformation[0], rec->ExceptionInformation[1]);
+ context->Eax = STATUS_INVALID_SYSTEM_SERVICE;
+ goto done;
}
status = NtRaiseException( rec, context, TRUE );
raise_status( status, rec );
diff --git a/include/wine/exception.h b/include/wine/exception.h
index f275568f4d..b8aeb3b866 100644
--- a/include/wine/exception.h
+++ b/include/wine/exception.h
@@ -302,6 +302,7 @@ static inline EXCEPTION_REGISTRATION_REC
#define EXCEPTION_WINE_STUB 0x80000100 /* stub entry point called */
#define EXCEPTION_WINE_ASSERTION 0x80000101 /* assertion failed */
+#define EXCEPTION_WINE_SYSCALL 0x80000103
#ifdef __cplusplus
}
--
2.11.0
2.23.0

View File

@@ -1,182 +0,0 @@
From e180b88a8c4c1d2d43cd084264fea48b93c17b3a Mon Sep 17 00:00:00 2001
From: Alex Henrie <alexhenrie24@gmail.com>
Date: Sun, 25 Aug 2019 18:02:28 -0600
Subject: [PATCH 1/4] ntdll: Implement RtlIpv4StringToAddress(Ex)W
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=46149
Signed-off-by: Alex Henrie <alexhenrie24@gmail.com>
---
dlls/ntdll/rtl.c | 145 +++++++++++++++++++++++++++++++++++++++++++++--
1 file changed, 141 insertions(+), 4 deletions(-)
diff --git a/dlls/ntdll/rtl.c b/dlls/ntdll/rtl.c
index e0d855138f..72ecfd937a 100644
--- a/dlls/ntdll/rtl.c
+++ b/dlls/ntdll/rtl.c
@@ -884,13 +884,150 @@ void WINAPI RtlCopyLuidAndAttributesArray(
for (i = 0; i < Count; i++) Dest[i] = Src[i];
}
+static BOOL parse_ipv4_component(const WCHAR **str, BOOL strict, ULONG *value)
+{
+ static const int hex_table[] = {
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0x00-0x0F */
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0x10-0x1F */
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0x20-0x2F */
+ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1, -1, -1, -1, -1, -1, /* 0x30-0x3F */
+ -1, 10, 11, 12, 13, 14, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0x40-0x4F */
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0x50-0x5F */
+ -1, 10, 11, 12, 13, 14, 15 /* 0x60-0x66 */
+ };
+ int base = 10, d;
+ WCHAR c;
+ ULONG cur_value, prev_value = 0;
+ BOOL success = FALSE;
+
+ if (**str == '.')
+ {
+ *str += 1;
+ return FALSE;
+ }
+
+ if ((*str)[0] == '0')
+ {
+ if ((*str)[1] == 'x' || (*str)[1] == 'X')
+ {
+ *str += 2;
+ if (strict) return FALSE;
+ base = 16;
+ }
+ else if ((*str)[1] >= '0' && (*str)[1] <= '9')
+ {
+ *str += 1;
+ if (strict) return FALSE;
+ base = 8;
+ }
+ }
+
+ for (cur_value = 0; **str; *str += 1)
+ {
+ c = **str;
+ if (c >= ARRAY_SIZE(hex_table)) break;
+ d = hex_table[c];
+ if (d == -1 || d >= base) break;
+ cur_value = cur_value * base + d;
+ success = TRUE;
+ if (cur_value < prev_value) return FALSE; /* overflow */
+ prev_value = cur_value;
+ }
+
+ if (success) *value = cur_value;
+ return success;
+}
+
+static NTSTATUS ipv4_string_to_address(const WCHAR *str, BOOL strict,
+ const WCHAR **terminator, IN_ADDR *address, USHORT *port)
+{
+ ULONG fields[4];
+ int n = 0;
+
+ for (;;)
+ {
+ if (!parse_ipv4_component(&str, strict, &fields[n]))
+ goto error;
+ n++;
+ if (*str != '.')
+ break;
+ if (n == 4)
+ goto error;
+ str++;
+ }
+
+ if (strict && n < 4)
+ goto error;
+
+ switch (n)
+ {
+ case 4:
+ if (fields[0] > 0xFF || fields[1] > 0xFF || fields[2] > 0xFF || fields[3] > 0xFF)
+ goto error;
+ address->S_un.S_un_b.s_b1 = fields[0];
+ address->S_un.S_un_b.s_b2 = fields[1];
+ address->S_un.S_un_b.s_b3 = fields[2];
+ address->S_un.S_un_b.s_b4 = fields[3];
+ break;
+ case 3:
+ if (fields[0] > 0xFF || fields[1] > 0xFF || fields[2] > 0xFFFF)
+ goto error;
+ address->S_un.S_un_b.s_b1 = fields[0];
+ address->S_un.S_un_b.s_b2 = fields[1];
+ address->S_un.S_un_b.s_b3 = (fields[2] & 0xFF00) >> 8;
+ address->S_un.S_un_b.s_b4 = (fields[2] & 0x00FF);
+ break;
+ case 2:
+ if (fields[0] > 0xFF || fields[1] > 0xFFFFFF)
+ goto error;
+ address->S_un.S_un_b.s_b1 = fields[0];
+ address->S_un.S_un_b.s_b2 = (fields[1] & 0xFF0000) >> 16;
+ address->S_un.S_un_b.s_b3 = (fields[1] & 0x00FF00) >> 8;
+ address->S_un.S_un_b.s_b4 = (fields[1] & 0x0000FF);
+ break;
+ case 1:
+ address->S_un.S_un_b.s_b1 = (fields[0] & 0xFF000000) >> 24;
+ address->S_un.S_un_b.s_b2 = (fields[0] & 0x00FF0000) >> 16;
+ address->S_un.S_un_b.s_b3 = (fields[0] & 0x0000FF00) >> 8;
+ address->S_un.S_un_b.s_b4 = (fields[0] & 0x000000FF);
+ break;
+ default:
+ goto error;
+ }
+
+ if (terminator) *terminator = str;
+
+ if (*str == ':')
+ {
+ str++;
+ if (!parse_ipv4_component(&str, FALSE, &fields[0]))
+ goto error;
+ if (!fields[0] || fields[0] > 0xFFFF || *str)
+ goto error;
+ if (port)
+ {
+ *port = htons(fields[0]);
+ if (terminator) *terminator = str;
+ }
+ }
+
+ if (!terminator && *str)
+ return STATUS_INVALID_PARAMETER;
+ return STATUS_SUCCESS;
+
+error:
+ if (terminator) *terminator = str;
+ return STATUS_INVALID_PARAMETER;
+}
+
/***********************************************************************
* RtlIpv4StringToAddressExW [NTDLL.@]
*/
NTSTATUS WINAPI RtlIpv4StringToAddressExW(const WCHAR *str, BOOLEAN strict, IN_ADDR *address, USHORT *port)
{
- FIXME("(%s, %u, %p, %p): stub\n", debugstr_w(str), strict, address, port);
- return STATUS_NOT_IMPLEMENTED;
+ TRACE("(%s, %u, %p, %p)\n", debugstr_w(str), strict, address, port);
+ if (!str || !address || !port) return STATUS_INVALID_PARAMETER;
+ return ipv4_string_to_address(str, strict, NULL, address, port);
}
/***********************************************************************
@@ -898,8 +1035,8 @@ NTSTATUS WINAPI RtlIpv4StringToAddressExW(const WCHAR *str, BOOLEAN strict, IN_A
*/
NTSTATUS WINAPI RtlIpv4StringToAddressW(const WCHAR *str, BOOLEAN strict, const WCHAR **terminator, IN_ADDR *address)
{
- FIXME("(%s, %u, %p, %p): stub\n", debugstr_w(str), strict, terminator, address);
- return STATUS_NOT_IMPLEMENTED;
+ TRACE("(%s, %u, %p, %p)\n", debugstr_w(str), strict, terminator, address);
+ return ipv4_string_to_address(str, strict, terminator, address, NULL);
}
/***********************************************************************
--
2.23.0

View File

@@ -1,74 +0,0 @@
From 2f39a185e26072c7c776a1475236d798ebf267f0 Mon Sep 17 00:00:00 2001
From: Alex Henrie <alexhenrie24@gmail.com>
Date: Sun, 25 Aug 2019 17:18:06 -0600
Subject: [PATCH 2/4] ntdll: Implement RtlIpv4StringToAddress(Ex)A
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=46149
Signed-off-by: Alex Henrie <alexhenrie24@gmail.com>
---
dlls/ntdll/ntdll.spec | 4 ++--
dlls/ntdll/rtl.c | 33 +++++++++++++++++++++++++++++++++
2 files changed, 35 insertions(+), 2 deletions(-)
diff --git a/dlls/ntdll/ntdll.spec b/dlls/ntdll/ntdll.spec
index 82c78f6e78..8cacc97ec4 100644
--- a/dlls/ntdll/ntdll.spec
+++ b/dlls/ntdll/ntdll.spec
@@ -760,8 +760,8 @@
@ stdcall RtlIpv4AddressToStringExA(ptr long ptr ptr)
@ stdcall RtlIpv4AddressToStringExW(ptr long ptr ptr)
@ stdcall RtlIpv4AddressToStringW(ptr ptr)
-# @ stub RtlIpv4StringToAddressA
-# @ stub RtlIpv4StringToAddressExA
+@ stdcall RtlIpv4StringToAddressA(str long ptr ptr)
+@ stdcall RtlIpv4StringToAddressExA(str long ptr ptr)
@ stdcall RtlIpv4StringToAddressExW(wstr long ptr ptr)
@ stdcall RtlIpv4StringToAddressW(wstr long ptr ptr)
# @ stub RtlIpv6AddressToStringA
diff --git a/dlls/ntdll/rtl.c b/dlls/ntdll/rtl.c
index 72ecfd937a..1604513e7e 100644
--- a/dlls/ntdll/rtl.c
+++ b/dlls/ntdll/rtl.c
@@ -1039,6 +1039,39 @@ NTSTATUS WINAPI RtlIpv4StringToAddressW(const WCHAR *str, BOOLEAN strict, const
return ipv4_string_to_address(str, strict, terminator, address, NULL);
}
+/***********************************************************************
+ * RtlIpv4StringToAddressExA [NTDLL.@]
+ */
+NTSTATUS WINAPI RtlIpv4StringToAddressExA(const char *str, BOOLEAN strict, IN_ADDR *address, USHORT *port)
+{
+ WCHAR wstr[32];
+
+ TRACE("(%s, %u, %p, %p)\n", debugstr_a(str), strict, address, port);
+
+ if (!str || !address || !port)
+ return STATUS_INVALID_PARAMETER;
+
+ RtlMultiByteToUnicodeN(wstr, sizeof(wstr), NULL, str, strlen(str) + 1);
+ return ipv4_string_to_address(wstr, strict, NULL, address, port);
+}
+
+/***********************************************************************
+ * RtlIpv4StringToAddressA [NTDLL.@]
+ */
+NTSTATUS WINAPI RtlIpv4StringToAddressA(const char *str, BOOLEAN strict, const char **terminator, IN_ADDR *address)
+{
+ WCHAR wstr[32];
+ const WCHAR *wterminator;
+ NTSTATUS ret;
+
+ TRACE("(%s, %u, %p, %p)\n", debugstr_a(str), strict, terminator, address);
+
+ RtlMultiByteToUnicodeN(wstr, sizeof(wstr), NULL, str, strlen(str) + 1);
+ ret = ipv4_string_to_address(wstr, strict, &wterminator, address, NULL);
+ if (terminator) *terminator = str + (wterminator - wstr);
+ return ret;
+}
+
/***********************************************************************
* RtlIpv6StringToAddressExW [NTDLL.@]
*/
--
2.23.0

View File

@@ -1,14 +1,15 @@
From b27c92f6d5f212307e291eac1b2abd376399366c Mon Sep 17 00:00:00 2001
From b4d01c5332cd076e5e7f98842d5811d5f44c8a05 Mon Sep 17 00:00:00 2001
From: Sebastian Lackner <sebastian@fds-team.de>
Date: Sun, 20 Aug 2017 17:22:20 +0200
Subject: ntdll: Avoid stack protector frame in signal handler functions.
Subject: [PATCH] ntdll: Avoid stack protector frame in signal handler
functions.
---
dlls/ntdll/signal_i386.c | 31 +++++++++++++++++++------------
1 file changed, 19 insertions(+), 12 deletions(-)
dlls/ntdll/signal_i386.c | 29 ++++++++++++++++++-----------
1 file changed, 18 insertions(+), 11 deletions(-)
diff --git a/dlls/ntdll/signal_i386.c b/dlls/ntdll/signal_i386.c
index c46d50eb271..8a637f23825 100644
index 1645c9c7d..751ba4264 100644
--- a/dlls/ntdll/signal_i386.c
+++ b/dlls/ntdll/signal_i386.c
@@ -96,6 +96,13 @@ typedef struct
@@ -25,7 +26,7 @@ index c46d50eb271..8a637f23825 100644
/***********************************************************************
* signal context platform-specific definitions
*/
@@ -663,7 +670,7 @@ static inline void *get_signal_stack(void)
@@ -582,7 +589,7 @@ static inline int has_fpux(void)
*
* Get the current teb based on the stack pointer.
*/
@@ -34,7 +35,7 @@ index c46d50eb271..8a637f23825 100644
{
unsigned long esp;
__asm__("movl %%esp,%0" : "=g" (esp) );
@@ -1023,7 +1030,7 @@ __ASM_GLOBAL_FUNC( clear_alignment_flag,
@@ -820,7 +827,7 @@ __ASM_GLOBAL_FUNC( clear_alignment_flag,
* Handler initialization when the full context is not needed.
* Return the stack pointer to use for pushing the exception data.
*/
@@ -43,16 +44,16 @@ index c46d50eb271..8a637f23825 100644
{
TEB *teb = get_current_teb();
@@ -2032,7 +2039,7 @@ static EXCEPTION_RECORD *setup_exception_record( ucontext_t *sigcontext, void *s
@@ -1842,7 +1849,7 @@ static struct stack_layout *setup_exception_record( ucontext_t *sigcontext, void
* sigcontext so that the return from the signal handler will call
* the raise function.
*/
-static EXCEPTION_RECORD *setup_exception( ucontext_t *sigcontext, raise_func func )
+static EXCEPTION_RECORD * SIGNALFUNC setup_exception( ucontext_t *sigcontext, raise_func func )
-static struct stack_layout *setup_exception( ucontext_t *sigcontext )
+static struct stack_layout * SIGNALFUNC setup_exception( ucontext_t *sigcontext )
{
WORD fs, gs;
void *stack = init_handler( sigcontext, &fs, &gs );
@@ -2245,7 +2252,7 @@ static void usr2_handler( int signal, siginfo_t *siginfo, void *sigcontext )
@@ -1958,7 +1965,7 @@ static BOOL handle_interrupt( unsigned int interrupt, ucontext_t *sigcontext, st
* Handler for SIGSEGV and related errors. Used only during the initialization
* of the process to handle virtual faults.
*/
@@ -61,7 +62,7 @@ index c46d50eb271..8a637f23825 100644
{
WORD fs, gs;
ucontext_t *context = sigcontext;
@@ -2269,7 +2276,7 @@ static void segv_handler_early( int signal, siginfo_t *siginfo, void *sigcontext
@@ -1982,7 +1989,7 @@ static void segv_handler_early( int signal, siginfo_t *siginfo, void *sigcontext
*
* Handler for SIGSEGV and related errors.
*/
@@ -69,8 +70,8 @@ index c46d50eb271..8a637f23825 100644
+static void SIGNALFUNC segv_handler( int signal, siginfo_t *siginfo, void *sigcontext )
{
WORD fs, gs;
EXCEPTION_RECORD *rec;
@@ -2363,7 +2370,7 @@ static void segv_handler( int signal, siginfo_t *siginfo, void *sigcontext )
struct stack_layout *stack;
@@ -2101,7 +2108,7 @@ done:
*
* Handler for SIGTRAP.
*/
@@ -78,17 +79,17 @@ index c46d50eb271..8a637f23825 100644
+static void SIGNALFUNC trap_handler( int signal, siginfo_t *siginfo, void *sigcontext )
{
ucontext_t *context = sigcontext;
EXCEPTION_RECORD *rec = setup_exception( context, raise_trap_exception );
@@ -2392,7 +2399,7 @@ static void trap_handler( int signal, siginfo_t *siginfo, void *sigcontext )
struct stack_layout *stack = setup_exception( context );
@@ -2143,7 +2150,7 @@ static void trap_handler( int signal, siginfo_t *siginfo, void *sigcontext )
*
* Handler for SIGFPE.
*/
-static void fpe_handler( int signal, siginfo_t *siginfo, void *sigcontext )
+static void SIGNALFUNC fpe_handler( int signal, siginfo_t *siginfo, void *sigcontext )
{
CONTEXT *win_context;
ucontext_t *context = sigcontext;
@@ -2441,7 +2448,7 @@ static void fpe_handler( int signal, siginfo_t *siginfo, void *sigcontext )
struct stack_layout *stack = setup_exception( context );
@@ -2191,7 +2198,7 @@ static void fpe_handler( int signal, siginfo_t *siginfo, void *sigcontext )
*
* FIXME: should not be calling external functions on the signal stack.
*/
@@ -96,17 +97,17 @@ index c46d50eb271..8a637f23825 100644
+static void SIGNALFUNC int_handler( int signal, siginfo_t *siginfo, void *sigcontext )
{
WORD fs, gs;
init_handler( sigcontext, &fs, &gs );
@@ -2457,7 +2464,7 @@ static void int_handler( int signal, siginfo_t *siginfo, void *sigcontext )
void *stack_ptr = init_handler( sigcontext, &fs, &gs );
@@ -2208,7 +2215,7 @@ static void int_handler( int signal, siginfo_t *siginfo, void *sigcontext )
*
* Handler for SIGABRT.
*/
-static void abrt_handler( int signal, siginfo_t *siginfo, void *sigcontext )
+static void SIGNALFUNC abrt_handler( int signal, siginfo_t *siginfo, void *sigcontext )
{
EXCEPTION_RECORD *rec = setup_exception( sigcontext, raise_generic_exception );
rec->ExceptionCode = EXCEPTION_WINE_ASSERTION;
@@ -2470,7 +2477,7 @@ static void abrt_handler( int signal, siginfo_t *siginfo, void *sigcontext )
struct stack_layout *stack = setup_exception( sigcontext );
stack->rec.ExceptionCode = EXCEPTION_WINE_ASSERTION;
@@ -2222,7 +2229,7 @@ static void abrt_handler( int signal, siginfo_t *siginfo, void *sigcontext )
*
* Handler for SIGQUIT.
*/
@@ -115,7 +116,7 @@ index c46d50eb271..8a637f23825 100644
{
WORD fs, gs;
init_handler( sigcontext, &fs, &gs );
@@ -2483,7 +2490,7 @@ static void quit_handler( int signal, siginfo_t *siginfo, void *sigcontext )
@@ -2235,7 +2242,7 @@ static void quit_handler( int signal, siginfo_t *siginfo, void *sigcontext )
*
* Handler for SIGUSR1, used to signal a thread that it got suspended.
*/
@@ -125,5 +126,5 @@ index c46d50eb271..8a637f23825 100644
CONTEXT context;
WORD fs, gs;
--
2.14.1
2.23.0

View File

@@ -52,13 +52,13 @@ usage()
# Get the upstream commit sha
upstream_commit()
{
echo "a4aaf3f3d184c2cdad8c4bf06dc10980744a9d15"
echo "3bf7473b880eea8b8dcaa43487afda2d7b1fbd03"
}
# Show version information
version()
{
echo "Wine Staging 4.15"
echo "Wine Staging 4.16"
echo "Copyright (C) 2014-2019 the Wine Staging project authors."
echo "Copyright (C) 2018-2019 Alistair Leslie-Hughes"
echo ""
@@ -169,6 +169,7 @@ patch_enable_all ()
enable_libs_Debug_Channel="$1"
enable_libs_Unicode_Collation="$1"
enable_loader_KeyboardLayouts="$1"
enable_mfplat_MFGetConfigurationDWORD="$1"
enable_mmsystem_dll16_MIDIHDR_Refcount="$1"
enable_mountmgr_DosDevices="$1"
enable_mscoree_CorValidateImage="$1"
@@ -333,6 +334,7 @@ patch_enable_all ()
enable_wined3d_mesa_texture_download="$1"
enable_wined3d_unset_flip_gdi="$1"
enable_wined3d_wined3d_guess_gl_vendor="$1"
enable_wined3d_zero_inf_shaders="$1"
enable_winedbg_Process_Arguments="$1"
enable_winedevice_Default_Drivers="$1"
enable_winemapi_user_xdg_mail="$1"
@@ -632,6 +634,9 @@ patch_enable ()
loader-KeyboardLayouts)
enable_loader_KeyboardLayouts="$2"
;;
mfplat-MFGetConfigurationDWORD)
enable_mfplat_MFGetConfigurationDWORD="$2"
;;
mmsystem.dll16-MIDIHDR_Refcount)
enable_mmsystem_dll16_MIDIHDR_Refcount="$2"
;;
@@ -1124,6 +1129,9 @@ patch_enable ()
wined3d-wined3d_guess_gl_vendor)
enable_wined3d_wined3d_guess_gl_vendor="$2"
;;
wined3d-zero-inf-shaders)
enable_wined3d_zero_inf_shaders="$2"
;;
winedbg-Process_Arguments)
enable_winedbg_Process_Arguments="$2"
;;
@@ -3148,6 +3156,9 @@ if test "$enable_directmanipulation_new_dll" -eq 1; then
patch_apply directmanipulation-new-dll/0010-include-Add-IDirectManipulationViewport2-interface.patch
patch_apply directmanipulation-new-dll/0011-directmanipulation-Implement-IDirectManipulationMana.patch
patch_apply directmanipulation-new-dll/0012-directmanipulation-tests-Initial-tests.patch
patch_apply directmanipulation-new-dll/0013-directmanipulation-Fake-success-from-IDirectManipula.patch
patch_apply directmanipulation-new-dll/0014-include-Add-IDirectManipulationPrimaryContent-interf.patch
patch_apply directmanipulation-new-dll/0015-directmanipulation-Implement-IDirectManipulationView.patch
(
printf '%s\n' '+ { "Alistair Leslie-Hughes", "include: Add directmanipulation.idl.", 1 },';
printf '%s\n' '+ { "Alistair Leslie-Hughes", "directmanipulation: New dll.", 1 },';
@@ -3161,6 +3172,9 @@ if test "$enable_directmanipulation_new_dll" -eq 1; then
printf '%s\n' '+ { "Alistair Leslie-Hughes", "include: Add IDirectManipulationViewport2 interface.", 1 },';
printf '%s\n' '+ { "Alistair Leslie-Hughes", "directmanipulation: Implement IDirectManipulationManager2 CreateViewport.", 1 },';
printf '%s\n' '+ { "Alistair Leslie-Hughes", "directmanipulation/tests: Initial tests.", 1 },';
printf '%s\n' '+ { "Alistair Leslie-Hughes", "directmanipulation: Fake success from IDirectManipulationViewport2 ActivateConfiguration.", 1 },';
printf '%s\n' '+ { "Alistair Leslie-Hughes", "include: Add IDirectManipulationPrimaryContent interface.", 1 },';
printf '%s\n' '+ { "Alistair Leslie-Hughes", "directmanipulation: Implement IDirectManipulationViewport2 GetPrimaryContent.", 1 },';
) >> "$patchlist"
fi
@@ -3546,7 +3560,7 @@ fi
# | * [#44819] Throw second DBG_PRINTEXCEPTION_C when debugging.
# |
# | Modified files:
# | * dlls/kernel32/debugger.c, dlls/ntdll/tests/exception.c
# | * dlls/kernelbase/debug.c, dlls/ntdll/tests/exception.c
# |
if test "$enable_ntdll_Exception" -eq 1; then
patch_apply ntdll-Exception/0002-ntdll-OutputDebugString-should-throw-the-exception-a.patch
@@ -4152,7 +4166,7 @@ fi
# Patchset kernel32-Debugger
# |
# | Modified files:
# | * dlls/kernel32/except.c
# | * dlls/kernelbase/debug.c
# |
if test "$enable_kernel32_Debugger" -eq 1; then
patch_apply kernel32-Debugger/0001-kernel32-Always-start-debugger-on-WinSta0.patch
@@ -4357,6 +4371,23 @@ if test "$enable_loader_KeyboardLayouts" -eq 1; then
) >> "$patchlist"
fi
# Patchset mfplat-MFGetConfigurationDWORD
# |
# | This patchset fixes the following Wine bugs:
# | * [#47757] - mfplat: Add MFGetConfigurationDWORD stub.
# |
# | Modified files:
# | * dlls/mfplat/main.c, dlls/mfplat/mfplat.spec
# |
if test "$enable_mfplat_MFGetConfigurationDWORD" -eq 1; then
patch_apply mfplat-MFGetConfigurationDWORD/0001-mfplat-Add-DestroyPropVariant-stub.patch
patch_apply mfplat-MFGetConfigurationDWORD/0002-mfplat-Add-MFGetConfigurationDWORD-stub.patch
(
printf '%s\n' '+ { "Andrey Gusev", "mfplat: Add DestroyPropVariant stub.", 1 },';
printf '%s\n' '+ { "Andrey Gusev", "mfplat: Add MFGetConfigurationDWORD stub.", 1 },';
) >> "$patchlist"
fi
# Patchset mmsystem.dll16-MIDIHDR_Refcount
# |
# | This patchset fixes the following Wine bugs:
@@ -4709,7 +4740,7 @@ fi
# | * [#42647] Implement stub handler for int 0x2e
# |
# | Modified files:
# | * dlls/ntdll/signal_i386.c, include/wine/exception.h
# | * dlls/ntdll/signal_i386.c
# |
if test "$enable_ntdll_Interrupt_0x2e" -eq 1; then
patch_apply ntdll-Interrupt-0x2e/0001-ntdll-Catch-windows-int-0x2e-syscall-on-i386.patch
@@ -4912,13 +4943,9 @@ fi
# | * dlls/ntdll/ntdll.spec, dlls/ntdll/rtl.c, dlls/ntdll/tests/rtl.c
# |
if test "$enable_ntdll_RtlIpv4StringToAddress" -eq 1; then
patch_apply ntdll-RtlIpv4StringToAddress/0001-ntdll-Implement-RtlIpv4StringToAddress-Ex-W.patch
patch_apply ntdll-RtlIpv4StringToAddress/0002-ntdll-Implement-RtlIpv4StringToAddress-Ex-A.patch
patch_apply ntdll-RtlIpv4StringToAddress/0003-ntdll-Add-semi-stub-for-RtlIpv6AddressToString-Ex-A.patch
patch_apply ntdll-RtlIpv4StringToAddress/0004-ntdll-Implement-RtlIpv6AddressToString-Ex-W.patch
(
printf '%s\n' '+ { "Alex Henrie", "ntdll: Implement RtlIpv4StringToAddress(Ex)W.", 1 },';
printf '%s\n' '+ { "Alex Henrie", "ntdll: Implement RtlIpv4StringToAddress(Ex)A.", 1 },';
printf '%s\n' '+ { "Alex Henrie", "ntdll: Add semi-stub for RtlIpv6AddressToString(Ex)A.", 1 },';
printf '%s\n' '+ { "Alex Henrie", "ntdll: Implement RtlIpv6AddressToString(Ex)W.", 1 },';
) >> "$patchlist"
@@ -6819,6 +6846,21 @@ if test "$enable_wined3d_wined3d_guess_gl_vendor" -eq 1; then
) >> "$patchlist"
fi
# Patchset wined3d-zero-inf-shaders
# |
# | This patchset fixes the following Wine bugs:
# | * [#34266] wined3d: Add a setting to workaround 0 * inf problem in shader models 1-3.
# |
# | Modified files:
# | * dlls/wined3d/glsl_shader.c, dlls/wined3d/wined3d_main.c, dlls/wined3d/wined3d_private.h
# |
if test "$enable_wined3d_zero_inf_shaders" -eq 1; then
patch_apply wined3d-zero-inf-shaders/0001-wined3d-Add-a-setting-to-workaround-0-inf-problem-in.patch
(
printf '%s\n' '+ { "Paul Gofman", "wined3d: Add a setting to workaround 0 * inf problem in shader models 1-3.", 1 },';
) >> "$patchlist"
fi
# Patchset winedbg-Process_Arguments
# |
# | Modified files:

View File

@@ -1,168 +0,0 @@
From c9b3268ab753c5d00ba39968eba4311fdc6e6100 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Michael=20M=C3=BCller?= <michael@fds-team.de>
Date: Thu, 11 Feb 2016 03:17:09 +0100
Subject: [PATCH] setupapi: Create registry keys for display devices and
display drivers.
---
dlls/setupapi/devinst.c | 102 +++++++++++++++++++++++++++++++++++++---
loader/wine.inf.in | 2 +
2 files changed, 98 insertions(+), 6 deletions(-)
diff --git a/dlls/setupapi/devinst.c b/dlls/setupapi/devinst.c
index 9b83c3519be..e666d3bb008 100644
--- a/dlls/setupapi/devinst.c
+++ b/dlls/setupapi/devinst.c
@@ -111,6 +111,15 @@ struct driver
WCHAR description[LINE_LEN];
};
+/* GUIDs */
+static const WCHAR displayGUIDW[] = {'{','4','d','3','6','e','9','6','8','-','e','3','2','5','-',
+ '1','1','c','e','-','b','f','c','1','-',
+ '0','8','0','0','2','b','e','1','0','3','1','8','}',0};
+static const WCHAR ddriverGUIDW[] = {'{','4','d','3','6','e','9','6','8','-','e','3','2','5','-',
+ '1','1','c','e','-','b','f','c','1','-',
+ '0','8','0','0','2','b','e','1','0','3','1','8','}',
+ '\\','0','0','0','0',0};
+
/* is used to identify if a DeviceInfoSet pointer is
valid or not */
#define SETUP_DEVICE_INFO_SET_MAGIC 0xd00ff056
@@ -210,6 +219,90 @@ static struct device_iface *get_device_iface(HDEVINFO devinfo, const SP_DEVICE_I
return (struct device_iface *)data->Reserved;
}
+static void create_display_keys(HKEY enumKey, int index, DISPLAY_DEVICEW *disp)
+{
+ static const WCHAR fmtW[] = {'1','3','&','1','2','3','4','5','&','%','d',0};
+ HKEY devKey, intKey;
+ WCHAR buffer[50];
+ LONG l;
+
+ l = RegCreateKeyExW(enumKey, disp->DeviceID, 0, NULL, 0, KEY_ALL_ACCESS,
+ NULL, &devKey, NULL);
+ if (l) return;
+
+ snprintfW(buffer, sizeof(buffer) / sizeof(WCHAR), fmtW, index);
+ l = RegCreateKeyExW(devKey, buffer, 0, NULL, 0, KEY_ALL_ACCESS,
+ NULL, &intKey, NULL);
+ if (!l)
+ {
+ RegSetValueExW(intKey, ClassGUID, 0, REG_SZ, (BYTE *)displayGUIDW, sizeof(displayGUIDW));
+ RegSetValueExW(intKey, Driver, 0, REG_SZ, (BYTE *)ddriverGUIDW, sizeof(ddriverGUIDW));
+ RegCloseKey(intKey);
+ }
+
+ RegCloseKey(devKey);
+}
+
+static void create_display_driver_keys(void)
+{
+ static const WCHAR DriverDateDataW[] = {'D','r','i','v','e','r','D','a','t','e','D','a','t','a',0};
+ HKEY classesKey, driverKey;
+ SYSTEMTIME systime;
+ FILETIME filetime;
+ LONG l;
+
+ l = RegCreateKeyExW(HKEY_LOCAL_MACHINE, ControlClass, 0, NULL, 0, KEY_ALL_ACCESS,
+ NULL, &classesKey, NULL);
+ if (l) return;
+
+ l = RegCreateKeyExW(classesKey, ddriverGUIDW, 0, NULL, 0, KEY_ALL_ACCESS,
+ NULL, &driverKey, NULL);
+ if (!l)
+ {
+ /* we are really keeping our drivers up to date */
+ GetSystemTime(&systime);
+ if (SystemTimeToFileTime(&systime, &filetime))
+ RegSetValueExW(driverKey, DriverDateDataW, 0, REG_BINARY, (BYTE *)&filetime, sizeof(filetime));
+
+ RegCloseKey(driverKey);
+ }
+
+ RegCloseKey(classesKey);
+}
+
+static LONG open_enum_key(HKEY *key)
+{
+ static BOOL initialized = FALSE;
+ DISPLAY_DEVICEW disp;
+ HKEY enumKey;
+ LONG l;
+
+ l = RegCreateKeyExW(HKEY_LOCAL_MACHINE, Enum, 0, NULL, 0, KEY_ALL_ACCESS,
+ NULL, &enumKey, NULL);
+ if (l) return l;
+
+ if (!initialized)
+ {
+ /* Wine currently does not properly distinguish between monitors and
+ * display devices yet. On a multi monitor system the enumeration
+ * returns multiple devices although there is only one graphic card.
+ * To work around this, we stop the enumeration after the first device. */
+
+ TRACE("creating display keys\n");
+
+ disp.cb = sizeof(disp);
+ if (EnumDisplayDevicesW(NULL, 0, &disp, 0))
+ create_display_keys(enumKey, 0, &disp);
+
+ create_display_driver_keys();
+
+ initialized = TRUE;
+ }
+
+ *key = enumKey;
+ return ERROR_SUCCESS;
+}
+
static inline void copy_device_data(SP_DEVINFO_DATA *data, const struct device *device)
{
data->ClassGuid = device->class;
@@ -523,8 +616,7 @@ static HKEY SETUPDI_CreateDevKey(struct device *device)
HKEY enumKey, key = INVALID_HANDLE_VALUE;
LONG l;
- l = RegCreateKeyExW(HKEY_LOCAL_MACHINE, Enum, 0, NULL, 0, KEY_ALL_ACCESS,
- NULL, &enumKey, NULL);
+ l = open_enum_key(&enumKey);
if (!l)
{
RegCreateKeyExW(enumKey, device->instanceId, 0, NULL, 0,
@@ -2143,8 +2235,7 @@ static void SETUPDI_EnumerateMatchingInterfaces(HDEVINFO DeviceInfoSet,
TRACE("%s\n", debugstr_w(enumstr));
- l = RegCreateKeyExW(HKEY_LOCAL_MACHINE, Enum, 0, NULL, 0, KEY_READ, NULL,
- &enumKey, NULL);
+ l = open_enum_key(&enumKey);
for (i = 0; !l; i++)
{
len = ARRAY_SIZE(subKeyName);
@@ -2364,8 +2455,7 @@ static void SETUPDI_EnumerateDevices(HDEVINFO DeviceInfoSet, const GUID *class,
TRACE("%p, %s, %s, %08x\n", DeviceInfoSet, debugstr_guid(class),
debugstr_w(enumstr), flags);
- l = RegCreateKeyExW(HKEY_LOCAL_MACHINE, Enum, 0, NULL, 0, KEY_READ, NULL,
- &enumKey, NULL);
+ l = open_enum_key(&enumKey);
if (enumKey != INVALID_HANDLE_VALUE)
{
if (enumstr)
diff --git a/loader/wine.inf.in b/loader/wine.inf.in
index 4d28a93c359..7a44e0fe713 100644
--- a/loader/wine.inf.in
+++ b/loader/wine.inf.in
@@ -465,6 +465,8 @@ HKLM,System\CurrentControlSet\Control\ContentIndex\Language\Neutral,"Locale",0x1
[ControlClass]
HKLM,System\CurrentControlSet\Control\Class\{4d36e967-e325-11ce-bfc1-08002be10318},,,"Disk drives"
HKLM,System\CurrentControlSet\Control\Class\{4d36e967-e325-11ce-bfc1-08002be10318},"Class",,"DiskDrive"
+HKLM,System\CurrentControlSet\Control\Class\{4d36e968-e325-11ce-bfc1-08002be10318},,,"Display drivers"
+HKLM,System\CurrentControlSet\Control\Class\{4d36e968-e325-11ce-bfc1-08002be10318},"Class",,"Display"
HKLM,System\CurrentControlSet\Control\Class\{4d36e978-e325-11ce-bfc1-08002be10318},,,"Ports (COM & LPT)"
HKLM,System\CurrentControlSet\Control\Class\{4d36e978-e325-11ce-bfc1-08002be10318},"Class",,"Ports"
HKLM,System\CurrentControlSet\Control\Class\{6bdd1fc6-810f-11d0-bec7-08002be2092f},,,"Imaging devices"
--
2.20.1

View File

@@ -1,101 +0,0 @@
From 9732937171cfb05055b0ef8cb2d4fcf7efddf679 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Michael=20M=C3=BCller?= <michael@fds-team.de>
Date: Thu, 11 Feb 2016 03:20:33 +0100
Subject: [PATCH] setupapi: Handle the case that a full driver path is passed
to SetupDiGetClassDevs.
---
dlls/setupapi/devinst.c | 26 ++++++++++++++++++++++++--
dlls/setupapi/tests/devinst.c | 25 +++++++++++++++++++++++--
2 files changed, 47 insertions(+), 4 deletions(-)
diff --git a/dlls/setupapi/devinst.c b/dlls/setupapi/devinst.c
index 38d994e3a..846531343 100644
--- a/dlls/setupapi/devinst.c
+++ b/dlls/setupapi/devinst.c
@@ -2455,8 +2455,30 @@ static void SETUPDI_EnumerateDevices(HDEVINFO DeviceInfoSet, const GUID *class,
&enumStrKey);
if (!l)
{
- SETUPDI_EnumerateMatchingDevices(DeviceInfoSet, enumstr,
- enumStrKey, class, flags);
+ WCHAR *bus, *device;
+ HKEY devKey;
+
+ if (!strchrW(enumstr, '\\'))
+ {
+ SETUPDI_EnumerateMatchingDevices(DeviceInfoSet, enumstr,
+ enumStrKey, class, flags);
+ }
+ else if ((bus = strdupW(enumstr)))
+ {
+ device = strchrW(bus, '\\');
+ *device++ = 0;
+
+ l = RegOpenKeyExW(enumKey, enumstr, 0, KEY_READ, &devKey);
+ if (!l)
+ {
+ SETUPDI_EnumerateMatchingDeviceInstances(DeviceInfoSet, bus, device,
+ devKey, class, flags);
+ RegCloseKey(devKey);
+ }
+
+ HeapFree(GetProcessHeap(), 0, bus);
+ }
+
RegCloseKey(enumStrKey);
}
}
diff --git a/dlls/setupapi/tests/devinst.c b/dlls/setupapi/tests/devinst.c
index afb431f8d..332755190 100644
--- a/dlls/setupapi/tests/devinst.c
+++ b/dlls/setupapi/tests/devinst.c
@@ -1884,6 +1884,28 @@ static void test_device_interface_key(void)
SetupDiDestroyDeviceInfoList(set);
}
+static void testSetupDiGetClassDevsA(void)
+{
+ static GUID displayguid = {0x4d36e968, 0xe325, 0x11ce, {0xbf,0xc1,0x08,0x00,0x2b,0xe1,0x03,0x18}};
+ SP_DEVINFO_DATA devinfo;
+ DISPLAY_DEVICEA disp;
+ HDEVINFO set;
+ BOOL ret;
+
+ disp.cb = sizeof(disp);
+ ok(EnumDisplayDevicesA(NULL, 0, &disp, 0), "EnumDisplayDevices failed: %08x\n", GetLastError());
+
+ SetLastError(0xdeadbeef);
+ set = SetupDiGetClassDevsA(&displayguid, disp.DeviceID, 0, 0);
+ ok(set != INVALID_HANDLE_VALUE, "SetupDiGetClassDevsA failed: %08x\n", GetLastError());
+
+ devinfo.cbSize = sizeof(devinfo);
+ ret = SetupDiEnumDeviceInfo(set, 0, &devinfo);
+ ok(ret, "SetupDiEnumDeviceInfo failed: %08x\n", GetLastError());
+
+ SetupDiDestroyDeviceInfoList(set);
+}
+
static void test_device_install_params(void)
{
SP_DEVINFO_DATA device = {sizeof(device)};
@@ -1951,8 +1973,6 @@ static void test_device_install_params(void)
ok(!params.FileQueue, "Got queue %p.\n", params.FileQueue);
ok(!params.ClassInstallReserved, "Got class installer data %#lx.\n", params.ClassInstallReserved);
ok(!strcasecmp(params.DriverPath, "C:\\windows"), "Got driver path %s.\n", params.DriverPath);
-
- SetupDiDestroyDeviceInfoList(set);
}
#ifdef __i386__
@@ -2135,6 +2155,7 @@ START_TEST(devinst)
test_registry_property_a();
test_registry_property_w();
test_get_inf_class();
+ testSetupDiGetClassDevsA();
test_devnode();
test_device_interface_key();
test_device_install_params();
--
2.21.0

View File

@@ -1,38 +0,0 @@
From 879401065780700c0236e51d9e52d629d8a9bb8f Mon Sep 17 00:00:00 2001
From: Sebastian Lackner <sebastian@fds-team.de>
Date: Sun, 2 Oct 2016 18:07:18 +0200
Subject: setupapi: Also create HardwareId registry key for display devices.
---
dlls/setupapi/devinst.c | 8 +++++++-
1 file changed, 7 insertions(+), 1 deletion(-)
diff --git a/dlls/setupapi/devinst.c b/dlls/setupapi/devinst.c
index 4b67833..67aa98d 100644
--- a/dlls/setupapi/devinst.c
+++ b/dlls/setupapi/devinst.c
@@ -153,7 +153,7 @@ static void create_display_keys(HKEY enumKey, int index, DISPLAY_DEVICEW *disp)
{
static const WCHAR fmtW[] = {'1','3','&','1','2','3','4','5','&','%','d',0};
HKEY devKey, intKey;
- WCHAR buffer[50];
+ WCHAR *str, buffer[50];
LONG l;
l = RegCreateKeyExW(enumKey, disp->DeviceID, 0, NULL, 0, KEY_ALL_ACCESS,
@@ -167,6 +167,12 @@ static void create_display_keys(HKEY enumKey, int index, DISPLAY_DEVICEW *disp)
{
RegSetValueExW(intKey, ClassGUID, 0, REG_SZ, (BYTE *)displayGUIDW, sizeof(displayGUIDW));
RegSetValueExW(intKey, Driver, 0, REG_SZ, (BYTE *)ddriverGUIDW, sizeof(ddriverGUIDW));
+ if ((str = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, (strlenW(disp->DeviceID) + 2) * sizeof(WCHAR))))
+ {
+ lstrcpyW(str, disp->DeviceID); /* we need two \0 for REG_MULTI_SZ */
+ RegSetValueExW(intKey, HardwareId, 0, REG_MULTI_SZ, (BYTE *)str, (strlenW(str) + 2) * sizeof(WCHAR));
+ HeapFree(GetProcessHeap(), 0, str);
+ }
RegCloseKey(intKey);
}
--
2.9.0

View File

@@ -1,2 +0,0 @@
Fixes: [35345] Fix enumeration of display driver properties using setupapi
Disabled: True

View File

@@ -0,0 +1,264 @@
From 7b97835b41aa751196b87d1c2739e48312d4b899 Mon Sep 17 00:00:00 2001
From: Paul Gofman <gofmanp@gmail.com>
Date: Mon, 9 Sep 2019 18:48:43 +0300
Subject: [PATCH] wined3d: Add a setting to workaround 0 * inf problem in
shader models 1-3.
Adds 'multiply_special' config option which works around
https://bugs.winehq.org/show_bug.cgi?id=34266.
Signed-off-by: Paul Gofman <gofmanp@gmail.com>
---
dlls/wined3d/glsl_shader.c | 123 +++++++++++++++++++++++++++------
dlls/wined3d/wined3d_main.c | 3 +
dlls/wined3d/wined3d_private.h | 1 +
3 files changed, 107 insertions(+), 20 deletions(-)
diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c
index c0713527ba..1632fd6005 100644
--- a/dlls/wined3d/glsl_shader.c
+++ b/dlls/wined3d/glsl_shader.c
@@ -2298,6 +2298,19 @@ static void shader_generate_glsl_declarations(const struct wined3d_context_gl *c
if (wined3d_settings.strict_shader_math)
shader_addline(buffer, "#pragma optionNV(fastmath off)\n");
+ if (wined3d_settings.multiply_special == 2 && version->major < 4)
+ {
+ shader_addline(buffer, "float dot1(float v1, float v2) {return abs(v1) == 0.0 || abs(v2) == 0.0 ? 0.0 : v1 * v2;}\n");
+ shader_addline(buffer, "float dot2(vec2 v1, vec2 v2) {return dot1(v1.x, v2.x) + dot1(v1.y, v2.y);}\n");
+ shader_addline(buffer, "float dot3(vec3 v1, vec3 v2) {return dot2(v1.xy, v2.xy) + dot1(v1.z, v2.z);}\n");
+ shader_addline(buffer, "float dot4(vec4 v1, vec4 v2) {return dot2(v1.xy, v2.xy) + dot2(v1.zw, v2.zw);}\n");
+
+ shader_addline(buffer, "float mul1(float v1, float v2) {return abs(v1) == 0.0 || abs(v2) == 0.0 ? 0.0 : v1 * v2;}\n");
+ shader_addline(buffer, "vec2 mul2(vec2 v1, vec2 v2) {return vec2(mul1(v1.x, v2.x), mul1(v1.y, v2.y));}\n");
+ shader_addline(buffer, "vec3 mul3(vec3 v1, vec3 v2) {return vec3(mul2(v1.xy, v2.xy), mul1(v1.z, v2.z));}\n");
+ shader_addline(buffer, "vec4 mul4(vec4 v1, vec4 v2) {return vec4(mul2(v1.xy, v2.xy), mul2(v1.zw, v2.zw));}\n");
+ }
+
prefix = shader_glsl_get_prefix(version->type);
/* Prototype the subroutines */
@@ -3829,7 +3842,12 @@ static void shader_glsl_binop(const struct wined3d_shader_instruction *ins)
write_mask = shader_glsl_append_dst(buffer, ins);
shader_glsl_add_src_param(ins, &ins->src[0], write_mask, &src0_param);
shader_glsl_add_src_param(ins, &ins->src[1], write_mask, &src1_param);
- shader_addline(buffer, "%s %s %s);\n", src0_param.param_str, op, src1_param.param_str);
+ if (wined3d_settings.multiply_special == 2 && ins->ctx->reg_maps->shader_version.major < 4
+ && ins->handler_idx == WINED3DSIH_MUL)
+ shader_addline(buffer, "mul%d(%s, %s));\n", shader_glsl_get_write_mask_size(write_mask),
+ src0_param.param_str, src1_param.param_str);
+ else
+ shader_addline(buffer, "%s %s %s);\n", src0_param.param_str, op, src1_param.param_str);
}
static void shader_glsl_relop(const struct wined3d_shader_instruction *ins)
@@ -4041,26 +4059,45 @@ static void shader_glsl_dot(const struct wined3d_shader_instruction *ins)
struct glsl_src_param src0_param;
struct glsl_src_param src1_param;
DWORD dst_write_mask, src_write_mask;
- unsigned int dst_size;
+ unsigned int dst_size, src_size;
dst_write_mask = shader_glsl_append_dst(buffer, ins);
dst_size = shader_glsl_get_write_mask_size(dst_write_mask);
/* dp4 works on vec4, dp3 on vec3, etc. */
if (ins->handler_idx == WINED3DSIH_DP4)
+ {
src_write_mask = WINED3DSP_WRITEMASK_ALL;
+ src_size = 4;
+ }
else if (ins->handler_idx == WINED3DSIH_DP3)
+ {
src_write_mask = WINED3DSP_WRITEMASK_0 | WINED3DSP_WRITEMASK_1 | WINED3DSP_WRITEMASK_2;
+ src_size = 3;
+ }
else
+ {
src_write_mask = WINED3DSP_WRITEMASK_0 | WINED3DSP_WRITEMASK_1;
-
+ src_size = 2;
+ }
shader_glsl_add_src_param(ins, &ins->src[0], src_write_mask, &src0_param);
shader_glsl_add_src_param(ins, &ins->src[1], src_write_mask, &src1_param);
- if (dst_size > 1) {
- shader_addline(buffer, "vec%d(dot(%s, %s)));\n", dst_size, src0_param.param_str, src1_param.param_str);
- } else {
- shader_addline(buffer, "dot(%s, %s));\n", src0_param.param_str, src1_param.param_str);
+ if (dst_size > 1)
+ {
+ if (wined3d_settings.multiply_special == 2 && ins->ctx->reg_maps->shader_version.major < 4)
+ shader_addline(buffer, "vec%d(dot%d(%s, %s)));\n", dst_size, src_size,
+ src0_param.param_str, src1_param.param_str);
+ else
+ shader_addline(buffer, "vec%d(dot(%s, %s)));\n", dst_size,
+ src0_param.param_str, src1_param.param_str);
+ }
+ else
+ {
+ if (wined3d_settings.multiply_special == 2 && ins->ctx->reg_maps->shader_version.major < 4)
+ shader_addline(buffer, "dot%d(%s, %s));\n", src_size, src0_param.param_str, src1_param.param_str);
+ else
+ shader_addline(buffer, "dot(%s, %s));\n", src0_param.param_str, src1_param.param_str);
}
}
@@ -4290,11 +4327,15 @@ static void shader_glsl_scalar_op(const struct wined3d_shader_instruction *ins)
{
DWORD shader_version = WINED3D_SHADER_VERSION(ins->ctx->reg_maps->shader_version.major,
ins->ctx->reg_maps->shader_version.minor);
+ static const float max_float = FLT_MAX, min_float = -FLT_MAX;
+ struct shader_glsl_ctx_priv *priv = ins->ctx->backend_data;
struct wined3d_string_buffer *buffer = ins->ctx->buffer;
+ struct wined3d_string_buffer *suffix;
struct glsl_src_param src0_param;
- const char *prefix, *suffix;
unsigned int dst_size;
DWORD dst_write_mask;
+ const char *prefix;
+ BOOL guard_inf;
dst_write_mask = shader_glsl_append_dst(buffer, ins);
dst_size = shader_glsl_get_write_mask_size(dst_write_mask);
@@ -4304,41 +4345,78 @@ static void shader_glsl_scalar_op(const struct wined3d_shader_instruction *ins)
shader_glsl_add_src_param(ins, &ins->src[0], dst_write_mask, &src0_param);
+ guard_inf = wined3d_settings.multiply_special == 1 && shader_version < WINED3D_SHADER_VERSION(4, 0);
+ suffix = string_buffer_get(priv->string_buffers);
+
switch (ins->handler_idx)
{
case WINED3DSIH_EXP:
case WINED3DSIH_EXPP:
prefix = "exp2(";
- suffix = ")";
+ string_buffer_sprintf(suffix, ")");
break;
case WINED3DSIH_LOG:
case WINED3DSIH_LOGP:
- prefix = "log2(abs(";
- suffix = "))";
+ if (guard_inf)
+ {
+ prefix = "max(log2(abs(";
+ string_buffer_sprintf(suffix, ")), ");
+ shader_glsl_append_imm_vec(suffix, &min_float, 1, ins->ctx->gl_info);
+ shader_addline(suffix, ")");
+ }
+ else
+ {
+ prefix = "log2(abs(";
+ string_buffer_sprintf(suffix, "))");
+ }
break;
case WINED3DSIH_RCP:
- prefix = "1.0 / ";
- suffix = "";
+ if (guard_inf)
+ {
+ prefix = "clamp(1.0 / ";
+ string_buffer_sprintf(suffix, ", ");
+ shader_glsl_append_imm_vec(suffix, &min_float, 1, ins->ctx->gl_info);
+ shader_addline(suffix, ", ");
+ shader_glsl_append_imm_vec(suffix, &max_float, 1, ins->ctx->gl_info);
+ shader_addline(suffix, ")");
+ }
+ else
+ {
+ prefix = "1.0 / ";
+ string_buffer_clear(suffix);
+ }
break;
case WINED3DSIH_RSQ:
- prefix = "inversesqrt(abs(";
- suffix = "))";
+ if (guard_inf)
+ {
+ prefix = "min(inversesqrt(abs(";
+ string_buffer_sprintf(suffix, ")), ");
+ shader_glsl_append_imm_vec(suffix, &max_float, 1, ins->ctx->gl_info);
+ shader_addline(suffix, ")");
+ }
+ else
+ {
+ prefix = "inversesqrt(abs(";
+ string_buffer_sprintf(suffix, "))");
+ }
break;
default:
prefix = "";
- suffix = "";
+ string_buffer_clear(suffix);
FIXME("Unhandled instruction %#x.\n", ins->handler_idx);
break;
}
if (dst_size > 1 && shader_version < WINED3D_SHADER_VERSION(4, 0))
- shader_addline(buffer, "vec%u(%s%s%s));\n", dst_size, prefix, src0_param.param_str, suffix);
+ shader_addline(buffer, "vec%u(%s%s%s));\n", dst_size, prefix, src0_param.param_str, suffix->buffer);
else
- shader_addline(buffer, "%s%s%s);\n", prefix, src0_param.param_str, suffix);
+ shader_addline(buffer, "%s%s%s);\n", prefix, src0_param.param_str, suffix->buffer);
+
+ string_buffer_release(priv->string_buffers, suffix);
}
/** Process the WINED3DSIO_EXPP instruction in GLSL:
@@ -4655,8 +4733,13 @@ static void shader_glsl_mad(const struct wined3d_shader_instruction *ins)
shader_glsl_add_src_param(ins, &ins->src[0], write_mask, &src0_param);
shader_glsl_add_src_param(ins, &ins->src[1], write_mask, &src1_param);
shader_glsl_add_src_param(ins, &ins->src[2], write_mask, &src2_param);
- shader_addline(ins->ctx->buffer, "(%s * %s) + %s);\n",
- src0_param.param_str, src1_param.param_str, src2_param.param_str);
+ if (wined3d_settings.multiply_special == 2 && ins->ctx->reg_maps->shader_version.major < 4)
+ shader_addline(ins->ctx->buffer, "mul%d(%s, %s) + %s);\n",
+ shader_glsl_get_write_mask_size(write_mask), src0_param.param_str,
+ src1_param.param_str, src2_param.param_str);
+ else
+ shader_addline(ins->ctx->buffer, "(%s * %s) + %s);\n",
+ src0_param.param_str, src1_param.param_str, src2_param.param_str);
}
/* Handles transforming all WINED3DSIO_M?x? opcodes for
diff --git a/dlls/wined3d/wined3d_main.c b/dlls/wined3d/wined3d_main.c
index 5d60a44ef6..e9efbbf08a 100644
--- a/dlls/wined3d/wined3d_main.c
+++ b/dlls/wined3d/wined3d_main.c
@@ -111,6 +111,7 @@ struct wined3d_settings wined3d_settings =
~0u, /* Don't force a specific sample count by default. */
FALSE, /* Don't range check relative addressing indices in float constants. */
FALSE, /* No strict shader math by default. */
+ 0, /* IEEE 0 * inf result. */
~0U, /* No VS shader model limit by default. */
~0U, /* No HS shader model limit by default. */
~0U, /* No DS shader model limit by default. */
@@ -362,6 +363,8 @@ static BOOL wined3d_dll_init(HINSTANCE hInstDLL)
}
if (!get_config_key_dword(hkey, appkey, "strict_shader_math", &wined3d_settings.strict_shader_math))
ERR_(winediag)("Setting strict shader math to %#x.\n", wined3d_settings.strict_shader_math);
+ if (!get_config_key_dword(hkey, appkey, "multiply_special", &wined3d_settings.multiply_special))
+ ERR_(winediag)("Setting multiply special to %#x.\n", wined3d_settings.multiply_special);
if (!get_config_key_dword(hkey, appkey, "MaxShaderModelVS", &wined3d_settings.max_sm_vs))
TRACE("Limiting VS shader model to %u.\n", wined3d_settings.max_sm_vs);
if (!get_config_key_dword(hkey, appkey, "MaxShaderModelHS", &wined3d_settings.max_sm_hs))
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index b786962a74..5bc0a1a0bd 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -427,6 +427,7 @@ struct wined3d_settings
unsigned int sample_count;
BOOL check_float_constants;
unsigned int strict_shader_math;
+ unsigned int multiply_special;
unsigned int max_sm_vs;
unsigned int max_sm_hs;
unsigned int max_sm_ds;
--
2.21.0

View File

@@ -0,0 +1 @@
Fixes: [34266] wined3d: Add a setting to workaround 0 * inf problem in shader models 1-3.

View File

@@ -1,4 +1,4 @@
From a652b6aef0055d851b630b195181f152472f18ed Mon Sep 17 00:00:00 2001
From 5a33ff21b47fe88180df08a13d5ecb2c3ec15e7a Mon Sep 17 00:00:00 2001
From: Sebastian Lackner <sebastian@fds-team.de>
Date: Wed, 4 Nov 2015 02:57:56 +0100
Subject: [PATCH] winepulse.drv: Use a separate mainloop and ctx for
@@ -9,11 +9,11 @@ Subject: [PATCH] winepulse.drv: Use a separate mainloop and ctx for
1 file changed, 27 insertions(+), 32 deletions(-)
diff --git a/dlls/winepulse.drv/mmdevdrv.c b/dlls/winepulse.drv/mmdevdrv.c
index 8d57f1a45a..f6466c3602 100644
index 1c647c73d62..2d6cabed8c2 100644
--- a/dlls/winepulse.drv/mmdevdrv.c
+++ b/dlls/winepulse.drv/mmdevdrv.c
@@ -369,7 +369,7 @@ static DWORD pulse_channel_map_to_channel_mask(const pa_channel_map *map) {
return mask;
@@ -457,7 +457,7 @@ static void convert_channel_map(const pa_channel_map *pa_map, WAVEFORMATEXTENSIB
fmt->dwChannelMask = pa_mask;
}
-static void pulse_probe_settings(int render, WAVEFORMATEXTENSIBLE *fmt) {
@@ -21,7 +21,7 @@ index 8d57f1a45a..f6466c3602 100644
WAVEFORMATEX *wfx = &fmt->Format;
pa_stream *stream;
pa_channel_map map;
@@ -388,7 +388,7 @@ static void pulse_probe_settings(int render, WAVEFORMATEXTENSIBLE *fmt) {
@@ -476,7 +476,7 @@ static void pulse_probe_settings(int render, WAVEFORMATEXTENSIBLE *fmt) {
attr.minreq = attr.fragsize = pa_frame_size(&ss);
attr.prebuf = 0;
@@ -30,7 +30,7 @@ index 8d57f1a45a..f6466c3602 100644
if (stream)
pa_stream_set_state_callback(stream, pulse_stream_state, NULL);
if (!stream)
@@ -399,7 +399,7 @@ static void pulse_probe_settings(int render, WAVEFORMATEXTENSIBLE *fmt) {
@@ -487,7 +487,7 @@ static void pulse_probe_settings(int render, WAVEFORMATEXTENSIBLE *fmt) {
else
ret = pa_stream_connect_record(stream, NULL, &attr, PA_STREAM_START_CORKED|PA_STREAM_FIX_RATE|PA_STREAM_FIX_CHANNELS|PA_STREAM_EARLY_REQUESTS);
if (ret >= 0) {
@@ -39,7 +39,7 @@ index 8d57f1a45a..f6466c3602 100644
pa_stream_get_state(stream) == PA_STREAM_CREATING)
{}
if (pa_stream_get_state(stream) == PA_STREAM_READY) {
@@ -410,7 +410,7 @@ static void pulse_probe_settings(int render, WAVEFORMATEXTENSIBLE *fmt) {
@@ -498,7 +498,7 @@ static void pulse_probe_settings(int render, WAVEFORMATEXTENSIBLE *fmt) {
else
length = pa_stream_get_buffer_attr(stream)->fragsize;
pa_stream_disconnect(stream);
@@ -48,7 +48,7 @@ index 8d57f1a45a..f6466c3602 100644
pa_stream_get_state(stream) == PA_STREAM_READY)
{}
}
@@ -532,10 +532,12 @@ static HRESULT pulse_test_connect(void)
@@ -620,10 +620,12 @@ static HRESULT pulse_test_connect(void)
WCHAR path[MAX_PATH], *name;
char *str;
pa_operation *o;
@@ -63,7 +63,7 @@ index 8d57f1a45a..f6466c3602 100644
GetModuleFileNameW(NULL, path, ARRAY_SIZE(path));
name = strrchrW(path, '\\');
@@ -547,24 +549,23 @@ static HRESULT pulse_test_connect(void)
@@ -635,24 +637,23 @@ static HRESULT pulse_test_connect(void)
str = pa_xmalloc(len);
WideCharToMultiByte(CP_UNIXCP, 0, name, -1, str, len, NULL, NULL);
TRACE("Name: %s\n", str);
@@ -96,7 +96,7 @@ index 8d57f1a45a..f6466c3602 100644
if (state == PA_CONTEXT_FAILED || state == PA_CONTEXT_TERMINATED)
goto fail;
@@ -573,38 +574,32 @@ static HRESULT pulse_test_connect(void)
@@ -661,38 +662,32 @@ static HRESULT pulse_test_connect(void)
break;
}
@@ -147,5 +147,5 @@ index 8d57f1a45a..f6466c3602 100644
}
--
2.18.0
2.17.1

Some files were not shown because too many files have changed in this diff Show More