Wine-Devel
By thread
wine-devel@list.winehq.org
By month
Messages by month
- ----- 2026 -----
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2007 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2006 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2005 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2004 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2003 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2002 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2001 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
July 2019
- 65 participants
- 633 messages
[PATCH v2 2/5] gdi32: Add D3DKMTSetVidPnSourceOwner stub.
by Zhiyi Zhang
D3DKMTSetVidPnSourceOwner needs to be implemented in user drivers
because we need to maintain the VidPN source ownership information list
in user driver. For example, user drivers need to release the
exclusive owner when a new window is moved to a monitor which already
have an exclusive owner.
Signed-off-by: Zhiyi Zhang <zzhang(a)codeweavers.com>
---
.../api-ms-win-dx-d3dkmt-l1-1-0.spec | 2 +-
dlls/d3d11/d3d11.spec | 2 +-
dlls/gdi32/dibdrv/dc.c | 2 ++
dlls/gdi32/driver.c | 29 +++++++++++++++++++
dlls/gdi32/enhmfdrv/dc.c | 1 +
dlls/gdi32/enhmfdrv/init.c | 1 +
dlls/gdi32/freetype.c | 1 +
dlls/gdi32/gdi32.spec | 1 +
dlls/gdi32/mfdrv/init.c | 1 +
dlls/gdi32/path.c | 1 +
dlls/wineandroid.drv/init.c | 1 +
dlls/winemac.drv/gdi.c | 1 +
dlls/wineps.drv/init.c | 1 +
dlls/winex11.drv/init.c | 1 +
dlls/winex11.drv/xrender.c | 1 +
include/ddk/d3dkmthk.h | 1 +
include/wine/gdi_driver.h | 5 +++-
17 files changed, 49 insertions(+), 3 deletions(-)
diff --git a/dlls/api-ms-win-dx-d3dkmt-l1-1-0/api-ms-win-dx-d3dkmt-l1-1-0.spec b/dlls/api-ms-win-dx-d3dkmt-l1-1-0/api-ms-win-dx-d3dkmt-l1-1-0.spec
index 43452cda74..c14ebc68e9 100644
--- a/dlls/api-ms-win-dx-d3dkmt-l1-1-0/api-ms-win-dx-d3dkmt-l1-1-0.spec
+++ b/dlls/api-ms-win-dx-d3dkmt-l1-1-0/api-ms-win-dx-d3dkmt-l1-1-0.spec
@@ -82,7 +82,7 @@
@ stub D3DKMTSetProcessSchedulingPriorityClass
@ stub D3DKMTSetQueuedLimit
@ stub D3DKMTSetStereoEnabled
-@ stub D3DKMTSetVidPnSourceOwner
+@ stdcall D3DKMTSetVidPnSourceOwner(ptr) gdi32.D3DKMTSetVidPnSourceOwner
@ stub D3DKMTShareObjects
@ stub D3DKMTSharedPrimaryLockNotification
@ stub D3DKMTSharedPrimaryUnLockNotification
diff --git a/dlls/d3d11/d3d11.spec b/dlls/d3d11/d3d11.spec
index 01bc8bfebc..606ddae3e3 100644
--- a/dlls/d3d11/d3d11.spec
+++ b/dlls/d3d11/d3d11.spec
@@ -35,7 +35,7 @@
@ stub D3DKMTSetDisplayMode
@ stub D3DKMTSetDisplayPrivateDriverFormat
@ stub D3DKMTSetGammaRamp
-@ stub D3DKMTSetVidPnSourceOwner
+@ stdcall D3DKMTSetVidPnSourceOwner(ptr) gdi32.D3DKMTSetVidPnSourceOwner
@ stub D3DKMTSignalSynchronizationObject
@ stub D3DKMTUnlock
@ stub D3DKMTWaitForSynchronizationObject
diff --git a/dlls/gdi32/dibdrv/dc.c b/dlls/gdi32/dibdrv/dc.c
index a3f84bd688..10c3fc6f69 100644
--- a/dlls/gdi32/dibdrv/dc.c
+++ b/dlls/gdi32/dibdrv/dc.c
@@ -520,6 +520,7 @@ const struct gdi_dc_funcs dib_driver =
dibdrv_StrokePath, /* pStrokePath */
NULL, /* pUnrealizePalette */
NULL, /* pWidenPath */
+ NULL, /* pD3DKMTSetVidPnSourceOwner */
dibdrv_wine_get_wgl_driver, /* wine_get_wgl_driver */
NULL, /* wine_get_vulkan_driver */
GDI_PRIORITY_DIB_DRV /* priority */
@@ -1143,6 +1144,7 @@ static const struct gdi_dc_funcs window_driver =
NULL, /* pStrokePath */
NULL, /* pUnrealizePalette */
NULL, /* pWidenPath */
+ NULL, /* pD3DKMTSetVidPnSourceOwner */
windrv_wine_get_wgl_driver, /* wine_get_wgl_driver */
NULL, /* wine_get_vulkan_driver */
GDI_PRIORITY_DIB_DRV + 10 /* priority */
diff --git a/dlls/gdi32/driver.c b/dlls/gdi32/driver.c
index 49ed081df1..71a52ed9fc 100644
--- a/dlls/gdi32/driver.c
+++ b/dlls/gdi32/driver.c
@@ -753,6 +753,11 @@ static BOOL nulldrv_UnrealizePalette( HPALETTE palette )
return FALSE;
}
+static NTSTATUS WINAPI nulldrv_D3DKMTSetVidPnSourceOwner( const D3DKMT_SETVIDPNSOURCEOWNER *desc )
+{
+ return STATUS_PROCEDURE_NOT_FOUND;
+}
+
static struct opengl_funcs *nulldrv_wine_get_wgl_driver( PHYSDEV dev, UINT version )
{
return (void *)-1;
@@ -892,6 +897,7 @@ const struct gdi_dc_funcs null_driver =
nulldrv_StrokePath, /* pStrokePath */
nulldrv_UnrealizePalette, /* pUnrealizePalette */
nulldrv_WidenPath, /* pWidenPath */
+ nulldrv_D3DKMTSetVidPnSourceOwner, /* pD3DKMTSetVidPnSourceOwner */
nulldrv_wine_get_wgl_driver, /* wine_get_wgl_driver */
nulldrv_wine_get_vulkan_driver, /* wine_get_vulkan_driver */
@@ -1422,6 +1428,7 @@ NTSTATUS WINAPI D3DKMTCreateDevice( D3DKMT_CREATEDEVICE *desc )
NTSTATUS WINAPI D3DKMTDestroyDevice( const D3DKMT_DESTROYDEVICE *desc )
{
NTSTATUS status = STATUS_INVALID_PARAMETER;
+ D3DKMT_SETVIDPNSOURCEOWNER set_owner_desc;
struct d3dkmt_device *device;
TRACE("(%p)\n", desc);
@@ -1434,6 +1441,9 @@ NTSTATUS WINAPI D3DKMTDestroyDevice( const D3DKMT_DESTROYDEVICE *desc )
{
if (device->handle == desc->hDevice)
{
+ memset( &set_owner_desc, 0, sizeof(set_owner_desc) );
+ set_owner_desc.hDevice = desc->hDevice;
+ D3DKMTSetVidPnSourceOwner( &set_owner_desc );
list_remove( &device->entry );
heap_free( device );
status = STATUS_SUCCESS;
@@ -1444,3 +1454,22 @@ NTSTATUS WINAPI D3DKMTDestroyDevice( const D3DKMT_DESTROYDEVICE *desc )
return status;
}
+
+/******************************************************************************
+ * D3DKMTSetVidPnSourceOwner [GDI32.@]
+ */
+NTSTATUS WINAPI D3DKMTSetVidPnSourceOwner( const D3DKMT_SETVIDPNSOURCEOWNER *desc )
+{
+ TRACE("(%p)\n", desc);
+
+ if (!get_display_driver()->pD3DKMTSetVidPnSourceOwner)
+ return STATUS_PROCEDURE_NOT_FOUND;
+
+ if (!desc || !desc->hDevice)
+ return STATUS_INVALID_PARAMETER;
+
+ /* Store VidPN source ownership info in user driver because user driver needs to changes ownership sometimes.
+ * For example, when a new window is moved to a VidPN source with an exclusive owner, such exclusive owner will be
+ * released before showing the new window */
+ return get_display_driver()->pD3DKMTSetVidPnSourceOwner( desc );
+}
diff --git a/dlls/gdi32/enhmfdrv/dc.c b/dlls/gdi32/enhmfdrv/dc.c
index 960d1b295c..80e54685c7 100644
--- a/dlls/gdi32/enhmfdrv/dc.c
+++ b/dlls/gdi32/enhmfdrv/dc.c
@@ -950,6 +950,7 @@ static const struct gdi_dc_funcs emfpath_driver =
NULL, /* pStrokePath */
NULL, /* pUnrealizePalette */
NULL, /* pWidenPath */
+ NULL, /* pD3DKMTSetVidPnSourceOwner */
NULL, /* wine_get_wgl_driver */
NULL, /* wine_get_vulkan_driver */
GDI_PRIORITY_PATH_DRV + 1 /* priority */
diff --git a/dlls/gdi32/enhmfdrv/init.c b/dlls/gdi32/enhmfdrv/init.c
index 1cd838ab8e..6938e45cbd 100644
--- a/dlls/gdi32/enhmfdrv/init.c
+++ b/dlls/gdi32/enhmfdrv/init.c
@@ -163,6 +163,7 @@ static const struct gdi_dc_funcs emfdrv_driver =
EMFDRV_StrokePath, /* pStrokePath */
NULL, /* pUnrealizePalette */
EMFDRV_WidenPath, /* pWidenPath */
+ NULL, /* pD3DKMTSetVidPnSourceOwner */
NULL, /* wine_get_wgl_driver */
NULL, /* wine_get_vulkan_driver */
GDI_PRIORITY_GRAPHICS_DRV /* priority */
diff --git a/dlls/gdi32/freetype.c b/dlls/gdi32/freetype.c
index 703dc3a997..b571611c13 100644
--- a/dlls/gdi32/freetype.c
+++ b/dlls/gdi32/freetype.c
@@ -9236,6 +9236,7 @@ static const struct gdi_dc_funcs freetype_funcs =
NULL, /* pStrokePath */
NULL, /* pUnrealizePalette */
NULL, /* pWidenPath */
+ NULL, /* pD3DKMTSetVidPnSourceOwner */
NULL, /* wine_get_wgl_driver */
NULL, /* wine_get_vulkan_driver */
GDI_PRIORITY_FONT_DRV /* priority */
diff --git a/dlls/gdi32/gdi32.spec b/dlls/gdi32/gdi32.spec
index 9abd82173c..597002c9a8 100644
--- a/dlls/gdi32/gdi32.spec
+++ b/dlls/gdi32/gdi32.spec
@@ -88,6 +88,7 @@
@ stdcall D3DKMTEscape(ptr)
@ stdcall D3DKMTOpenAdapterFromGdiDisplayName(ptr)
@ stdcall D3DKMTOpenAdapterFromHdc(ptr)
+@ stdcall D3DKMTSetVidPnSourceOwner(ptr)
@ stdcall DPtoLP(long ptr long)
@ stdcall DeleteColorSpace(long)
@ stdcall DeleteDC(long)
diff --git a/dlls/gdi32/mfdrv/init.c b/dlls/gdi32/mfdrv/init.c
index 4ef509a89f..fb568f1838 100644
--- a/dlls/gdi32/mfdrv/init.c
+++ b/dlls/gdi32/mfdrv/init.c
@@ -226,6 +226,7 @@ static const struct gdi_dc_funcs MFDRV_Funcs =
MFDRV_StrokePath, /* pStrokePath */
NULL, /* pUnrealizePalette */
MFDRV_WidenPath, /* pWidenPath */
+ NULL, /* pD3DKMTSetVidPnSourceOwner */
NULL, /* wine_get_wgl_driver */
NULL, /* wine_get_vulkan_driver */
GDI_PRIORITY_GRAPHICS_DRV /* priority */
diff --git a/dlls/gdi32/path.c b/dlls/gdi32/path.c
index 8cf86ccb2e..23c0162f64 100644
--- a/dlls/gdi32/path.c
+++ b/dlls/gdi32/path.c
@@ -2248,6 +2248,7 @@ const struct gdi_dc_funcs path_driver =
NULL, /* pStrokePath */
NULL, /* pUnrealizePalette */
NULL, /* pWidenPath */
+ NULL, /* pD3DKMTSetVidPnSourceOwner */
NULL, /* wine_get_wgl_driver */
NULL, /* wine_get_vulkan_driver */
GDI_PRIORITY_PATH_DRV /* priority */
diff --git a/dlls/wineandroid.drv/init.c b/dlls/wineandroid.drv/init.c
index 7a2945c80f..ec6c689b49 100644
--- a/dlls/wineandroid.drv/init.c
+++ b/dlls/wineandroid.drv/init.c
@@ -411,6 +411,7 @@ static const struct gdi_dc_funcs android_drv_funcs =
NULL, /* pStrokePath */
NULL, /* pUnrealizePalette */
NULL, /* pWidenPath */
+ NULL, /* pD3DKMTSetVidPnSourceOwner */
ANDROID_wine_get_wgl_driver, /* wine_get_wgl_driver */
NULL, /* wine_get_vulkan_driver */
GDI_PRIORITY_GRAPHICS_DRV /* priority */
diff --git a/dlls/winemac.drv/gdi.c b/dlls/winemac.drv/gdi.c
index 7156a3c3a8..32aeba04b4 100644
--- a/dlls/winemac.drv/gdi.c
+++ b/dlls/winemac.drv/gdi.c
@@ -390,6 +390,7 @@ static const struct gdi_dc_funcs macdrv_funcs =
NULL, /* pStrokePath */
NULL, /* pUnrealizePalette */
NULL, /* pWidenPath */
+ NULL, /* pD3DKMTSetVidPnSourceOwner */
macdrv_wine_get_wgl_driver, /* wine_get_wgl_driver */
macdrv_wine_get_vulkan_driver, /* wine_get_vulkan_driver */
GDI_PRIORITY_GRAPHICS_DRV /* priority */
diff --git a/dlls/wineps.drv/init.c b/dlls/wineps.drv/init.c
index 0dff6cc868..2183029058 100644
--- a/dlls/wineps.drv/init.c
+++ b/dlls/wineps.drv/init.c
@@ -908,6 +908,7 @@ static const struct gdi_dc_funcs psdrv_funcs =
PSDRV_StrokePath, /* pStrokePath */
NULL, /* pUnrealizePalette */
NULL, /* pWidenPath */
+ NULL, /* pD3DKMTSetVidPnSourceOwner */
NULL, /* wine_get_wgl_driver */
NULL, /* wine_get_vulkan_driver */
GDI_PRIORITY_GRAPHICS_DRV /* priority */
diff --git a/dlls/winex11.drv/init.c b/dlls/winex11.drv/init.c
index 20710cc0c9..baed875ba5 100644
--- a/dlls/winex11.drv/init.c
+++ b/dlls/winex11.drv/init.c
@@ -471,6 +471,7 @@ static const struct gdi_dc_funcs x11drv_funcs =
X11DRV_StrokePath, /* pStrokePath */
X11DRV_UnrealizePalette, /* pUnrealizePalette */
NULL, /* pWidenPath */
+ NULL, /* pD3DKMTSetVidPnSourceOwner */
X11DRV_wine_get_wgl_driver, /* wine_get_wgl_driver */
X11DRV_wine_get_vulkan_driver, /* wine_get_vulkan_driver */
GDI_PRIORITY_GRAPHICS_DRV /* priority */
diff --git a/dlls/winex11.drv/xrender.c b/dlls/winex11.drv/xrender.c
index 61729ecf29..e8dbf27c0d 100644
--- a/dlls/winex11.drv/xrender.c
+++ b/dlls/winex11.drv/xrender.c
@@ -2284,6 +2284,7 @@ static const struct gdi_dc_funcs xrender_funcs =
NULL, /* pStrokePath */
NULL, /* pUnrealizePalette */
NULL, /* pWidenPath */
+ NULL, /* pD3DKMTSetVidPnSourceOwner */
NULL, /* wine_get_wgl_driver */
NULL, /* wine_get_vulkan_driver */
GDI_PRIORITY_GRAPHICS_DRV + 10 /* priority */
diff --git a/include/ddk/d3dkmthk.h b/include/ddk/d3dkmthk.h
index 081758bf5d..05e2e65aea 100644
--- a/include/ddk/d3dkmthk.h
+++ b/include/ddk/d3dkmthk.h
@@ -171,6 +171,7 @@ NTSTATUS WINAPI D3DKMTCreateDCFromMemory(D3DKMT_CREATEDCFROMMEMORY *desc);
NTSTATUS WINAPI D3DKMTDestroyDCFromMemory(const D3DKMT_DESTROYDCFROMMEMORY *desc);
NTSTATUS WINAPI D3DKMTDestroyDevice(const D3DKMT_DESTROYDEVICE *desc);
NTSTATUS WINAPI D3DKMTOpenAdapterFromGdiDisplayName(D3DKMT_OPENADAPTERFROMGDIDISPLAYNAME *desc);
+NTSTATUS WINAPI D3DKMTSetVidPnSourceOwner(const D3DKMT_SETVIDPNSOURCEOWNER *desc);
#ifdef __cplusplus
}
diff --git a/include/wine/gdi_driver.h b/include/wine/gdi_driver.h
index d3e5bcefb4..fac25349d1 100644
--- a/include/wine/gdi_driver.h
+++ b/include/wine/gdi_driver.h
@@ -21,6 +21,8 @@
#ifndef __WINE_WINE_GDI_DRIVER_H
#define __WINE_WINE_GDI_DRIVER_H
+#include "winternl.h"
+#include "ddk/d3dkmthk.h"
#include "wine/list.h"
struct gdi_dc_funcs;
@@ -192,6 +194,7 @@ struct gdi_dc_funcs
BOOL (*pStrokePath)(PHYSDEV);
BOOL (*pUnrealizePalette)(HPALETTE);
BOOL (*pWidenPath)(PHYSDEV);
+ NTSTATUS (*pD3DKMTSetVidPnSourceOwner)(const D3DKMT_SETVIDPNSOURCEOWNER *);
struct opengl_funcs * (*wine_get_wgl_driver)(PHYSDEV,UINT);
const struct vulkan_funcs * (*wine_get_vulkan_driver)(PHYSDEV,UINT);
@@ -200,7 +203,7 @@ struct gdi_dc_funcs
};
/* increment this when you change the DC function table */
-#define WINE_GDI_DRIVER_VERSION 49
+#define WINE_GDI_DRIVER_VERSION 50
#define GDI_PRIORITY_NULL_DRV 0 /* null driver */
#define GDI_PRIORITY_FONT_DRV 100 /* any font driver */
--
2.20.1
July 4, 2019
[PATCH v2 1/5] gdi32: Support multiple monitors in D3DKMTOpenAdapterFromGdiDisplayName.
by Zhiyi Zhang
Signed-off-by: Zhiyi Zhang <zzhang(a)codeweavers.com>
---
v2: Fix dxgi d3d12 test failure. Supersede 167505~167509.
dlls/gdi32/driver.c | 17 +++++++----------
1 file changed, 7 insertions(+), 10 deletions(-)
diff --git a/dlls/gdi32/driver.c b/dlls/gdi32/driver.c
index dcbc480376..49ed081df1 100644
--- a/dlls/gdi32/driver.c
+++ b/dlls/gdi32/driver.c
@@ -55,7 +55,6 @@ struct graphics_driver
struct d3dkmt_adapter
{
D3DKMT_HANDLE handle; /* Kernel mode graphics adapter handle */
- INT ordinal; /* Graphics adapter ordinal */
struct list entry; /* List entry */
};
@@ -1339,21 +1338,20 @@ NTSTATUS WINAPI D3DKMTCloseAdapter( const D3DKMT_CLOSEADAPTER *desc )
*/
NTSTATUS WINAPI D3DKMTOpenAdapterFromGdiDisplayName( D3DKMT_OPENADAPTERFROMGDIDISPLAYNAME *desc )
{
- static const WCHAR display1W[] = {'\\','\\','.','\\','D','I','S','P','L','A','Y','1',0};
+ static const WCHAR displayW[] = {'\\','\\','.','\\','D','I','S','P','L','A','Y'};
static D3DKMT_HANDLE handle_start = 0;
struct d3dkmt_adapter *adapter;
+ WCHAR *end;
+ int id;
TRACE("(%p) semi-stub\n", desc);
- if (!desc)
+ if (!desc || strncmpiW( desc->DeviceName, displayW, ARRAY_SIZE(displayW) ))
return STATUS_UNSUCCESSFUL;
- /* FIXME: Support multiple monitors */
- if (lstrcmpiW( desc->DeviceName, display1W ))
- {
- FIXME("%s is unsupported\n", wine_dbgstr_w( desc->DeviceName ));
+ id = strtolW( desc->DeviceName + ARRAY_SIZE(displayW), &end, 10 ) - 1;
+ if (*end)
return STATUS_UNSUCCESSFUL;
- }
adapter = heap_alloc( sizeof( *adapter ) );
if (!adapter)
@@ -1362,7 +1360,6 @@ NTSTATUS WINAPI D3DKMTOpenAdapterFromGdiDisplayName( D3DKMT_OPENADAPTERFROMGDIDI
EnterCriticalSection( &driver_section );
/* D3DKMT_HANDLE is UINT, so we can't use pointer as handle */
adapter->handle = ++handle_start;
- adapter->ordinal = 0;
list_add_tail( &d3dkmt_adapters, &adapter->entry );
LeaveCriticalSection( &driver_section );
@@ -1370,7 +1367,7 @@ NTSTATUS WINAPI D3DKMTOpenAdapterFromGdiDisplayName( D3DKMT_OPENADAPTERFROMGDIDI
/* FIXME: Support AdapterLuid */
desc->AdapterLuid.LowPart = 0;
desc->AdapterLuid.HighPart = 0;
- desc->VidPnSourceId = 0;
+ desc->VidPnSourceId = id;
return STATUS_SUCCESS;
}
--
2.20.1
July 4, 2019
Re: [PATCH 1/2] user32/edit: In EM_POSFROMCHAR return correct position for empty lines
by Fabian Maurer
Any news on this patchset?
Regards,
Fabian Maurer
July 4, 2019
Re: [PATCH 1/3] ntdll/tests: Add more tests for RtlIpv4StringToAddress
by Marvin
Hi,
While running your changed tests, I think I found new failures.
Being a bot and all I'm not very good at pattern recognition, so I might be
wrong, but could you please double-check?
Full results can be found at:
https://testbot.winehq.org/JobDetails.pl?Key=54483
Your paranoid android.
=== w1064v1809 (32 bit report) ===
ntdll:
16e4:rtl: unhandled exception c0000005 at 77869D4B
July 4, 2019
[PATCH 3/3] ntdll: Implement RtlIpv4StringToAddress(Ex)W
by Alex Henrie
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=46149
Signed-off-by: Alex Henrie <alexhenrie24(a)gmail.com>
---
dlls/ntdll/rtl.c | 27 +++++++++++++++++++++++----
1 file changed, 23 insertions(+), 4 deletions(-)
diff --git a/dlls/ntdll/rtl.c b/dlls/ntdll/rtl.c
index 30fcb00e05..3eb8181e32 100644
--- a/dlls/ntdll/rtl.c
+++ b/dlls/ntdll/rtl.c
@@ -1044,8 +1044,17 @@ NTSTATUS WINAPI RtlIpv4StringToAddressA(const char *str, BOOLEAN strict, const c
*/
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;
+ char cstr[32];
+ ULONG clen;
+
+ TRACE("(%s, %u, %p, %p)\n", debugstr_w(str), strict, address, port);
+
+ if (!str || !address || !port)
+ return STATUS_INVALID_PARAMETER;
+
+ RtlUnicodeToMultiByteN(cstr, sizeof(cstr) - 1, &clen, str, strlenW(str));
+ cstr[clen] = 0;
+ return ipv4_string_to_address(cstr, strict, NULL, address, port);
}
/***********************************************************************
@@ -1053,8 +1062,18 @@ 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;
+ char cstr[32];
+ ULONG clen;
+ const char *cterminator;
+ NTSTATUS ret;
+
+ TRACE("(%s, %u, %p, %p)\n", debugstr_w(str), strict, terminator, address);
+
+ RtlUnicodeToMultiByteN(cstr, sizeof(cstr) - 1, &clen, str, strlenW(str));
+ cstr[clen] = 0;
+ ret = ipv4_string_to_address(cstr, strict, &cterminator, address, NULL);
+ if (terminator) *terminator = str + (cterminator - cstr);
+ return ret;
}
/***********************************************************************
--
2.22.0
July 4, 2019
[PATCH 2/3] ntdll: Implement RtlIpv4StringToAddress(Ex)A
by Alex Henrie
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=46149
Signed-off-by: Alex Henrie <alexhenrie24(a)gmail.com>
---
dlls/ntdll/ntdll.spec | 4 +-
dlls/ntdll/rtl.c | 155 ++++++++++++++++++++++++++++
dlls/ntoskrnl.exe/ntoskrnl.exe.spec | 4 +-
3 files changed, 159 insertions(+), 4 deletions(-)
diff --git a/dlls/ntdll/ntdll.spec b/dlls/ntdll/ntdll.spec
index 299bface9a..93beba07c1 100644
--- a/dlls/ntdll/ntdll.spec
+++ b/dlls/ntdll/ntdll.spec
@@ -757,8 +757,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 e0d855138f..30fcb00e05 100644
--- a/dlls/ntdll/rtl.c
+++ b/dlls/ntdll/rtl.c
@@ -884,6 +884,161 @@ void WINAPI RtlCopyLuidAndAttributesArray(
for (i = 0; i < Count; i++) Dest[i] = Src[i];
}
+static BOOL parse_ipv4_component(const char **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;
+ unsigned char c;
+ ULONG cur_value, prev_value = 0;
+ BOOL success = FALSE;
+
+ if (**str == '.')
+ {
+ *str += 1;
+ return FALSE;
+ }
+
+ if ((*str)[0] == '0')
+ {
+ if (tolower((*str)[1]) == 'x')
+ {
+ *str += 2;
+ if (strict) return FALSE;
+ base = 16;
+ }
+ else if (isdigit((*str)[1]))
+ {
+ *str += 1;
+ if (strict) return FALSE;
+ base = 8;
+ }
+ }
+
+ for (cur_value = 0; **str; *str += 1)
+ {
+ c = (unsigned char)**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 char *str, BOOL strict,
+ const char **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 = (fields[0] << 8) | (fields[0] >> 8);
+ if (terminator) *terminator = str;
+ }
+ }
+
+ if (!terminator && *str)
+ return STATUS_INVALID_PARAMETER;
+ return STATUS_SUCCESS;
+
+error:
+ if (terminator) *terminator = str;
+ return STATUS_INVALID_PARAMETER;
+}
+
+/***********************************************************************
+ * RtlIpv4StringToAddressExA [NTDLL.@]
+ */
+NTSTATUS WINAPI RtlIpv4StringToAddressExA(const char *str, BOOLEAN strict, IN_ADDR *address, USHORT *port)
+{
+ TRACE("(%s, %u, %p, %p)\n", debugstr_a(str), strict, address, port);
+ if (!str || !address || !port) return STATUS_INVALID_PARAMETER;
+ return ipv4_string_to_address(str, strict, NULL, address, port);
+}
+
+/***********************************************************************
+ * RtlIpv4StringToAddressA [NTDLL.@]
+ */
+NTSTATUS WINAPI RtlIpv4StringToAddressA(const char *str, BOOLEAN strict, const char **terminator, IN_ADDR *address)
+{
+ TRACE("(%s, %u, %p, %p)\n", debugstr_a(str), strict, terminator, address);
+ return ipv4_string_to_address(str, strict, terminator, address, NULL);
+}
+
/***********************************************************************
* RtlIpv4StringToAddressExW [NTDLL.@]
*/
diff --git a/dlls/ntoskrnl.exe/ntoskrnl.exe.spec b/dlls/ntoskrnl.exe/ntoskrnl.exe.spec
index 359e2d9e69..439cae3097 100644
--- a/dlls/ntoskrnl.exe/ntoskrnl.exe.spec
+++ b/dlls/ntoskrnl.exe/ntoskrnl.exe.spec
@@ -1101,8 +1101,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) ntdll.RtlIpv4StringToAddressA
+@ stdcall RtlIpv4StringToAddressExA(str long ptr ptr) ntdll.RtlIpv4StringToAddressExA
@ stdcall RtlIpv4StringToAddressExW(wstr long ptr ptr)
@ stdcall RtlIpv4StringToAddressW(wstr long ptr ptr)
@ stub RtlIpv6AddressToStringA
--
2.22.0
July 4, 2019
[PATCH 1/3] ntdll/tests: Add more tests for RtlIpv4StringToAddress
by Alex Henrie
Signed-off-by: Alex Henrie <alexhenrie24(a)gmail.com>
---
dlls/ntdll/tests/rtl.c | 29 +++++++++++++++++++++++++++++
1 file changed, 29 insertions(+)
diff --git a/dlls/ntdll/tests/rtl.c b/dlls/ntdll/tests/rtl.c
index 62662cb438..3e1d92c3d2 100644
--- a/dlls/ntdll/tests/rtl.c
+++ b/dlls/ntdll/tests/rtl.c
@@ -1212,12 +1212,23 @@ static struct
{ "1", STATUS_SUCCESS, 1, { 0, 0, 0, 1 }, strict_diff_4,
STATUS_INVALID_PARAMETER, 1, { -1 } },
{ "-1", STATUS_INVALID_PARAMETER, 0, { -1 } },
+ { "1.2", STATUS_SUCCESS, 3, { 1, 0, 0, 2 }, strict_diff_4,
+ STATUS_INVALID_PARAMETER, 3, { -1 } },
+ { "1000.2000", STATUS_INVALID_PARAMETER, 9, { -1 } },
+ { "1.2.", STATUS_INVALID_PARAMETER, 4, { -1 } },
+ { "1..2", STATUS_INVALID_PARAMETER, 3, { -1 } },
+ { "1...2", STATUS_INVALID_PARAMETER, 3, { -1 } },
+ { "1.2.3", STATUS_SUCCESS, 5, { 1, 2, 0, 3 }, strict_diff_4,
+ STATUS_INVALID_PARAMETER, 5, { -1 } },
+ { "1.2.3.", STATUS_INVALID_PARAMETER, 6, { -1 } },
{ "203569230", STATUS_SUCCESS, 9, { 12, 34, 56, 78 }, strict_diff_4,
STATUS_INVALID_PARAMETER, 9, { -1 } },
{ "1.223756", STATUS_SUCCESS, 8, { 1, 3, 106, 12 }, strict_diff_4,
STATUS_INVALID_PARAMETER, 8, { -1 } },
{ "3.4.756", STATUS_SUCCESS, 7, { 3, 4, 2, 244 }, strict_diff_4,
STATUS_INVALID_PARAMETER, 7, { -1 } },
+ { "756.3.4", STATUS_INVALID_PARAMETER, 7, { -1 } },
+ { "3.756.4", STATUS_INVALID_PARAMETER, 7, { -1 } },
{ "3.4.756.1", STATUS_INVALID_PARAMETER, 9, { -1 } },
{ "3.4.65536", STATUS_INVALID_PARAMETER, 9, { -1 } },
{ "3.4.5.6.7", STATUS_INVALID_PARAMETER, 7, { -1 } },
@@ -1233,9 +1244,27 @@ static struct
{ ".1", STATUS_INVALID_PARAMETER, 1, { -1 } },
{ ".1.", STATUS_INVALID_PARAMETER, 1, { -1 } },
{ ".1.2.3", STATUS_INVALID_PARAMETER, 1, { -1 } },
+ { ".1.2.3.4", STATUS_INVALID_PARAMETER, 1, { -1 } },
{ "0.1.2.3", STATUS_SUCCESS, 7, { 0, 1, 2, 3 } },
{ "0.1.2.3.", STATUS_INVALID_PARAMETER, 7, { -1 } },
{ "[0.1.2.3]", STATUS_INVALID_PARAMETER, 0, { -1 } },
+ { "0x00010203", STATUS_SUCCESS, 10, { 0, 1, 2, 3 }, strict_diff_4,
+ STATUS_INVALID_PARAMETER, 2, { -1 } },
+ { "0X00010203", STATUS_SUCCESS, 10, { 0, 1, 2, 3 }, strict_diff_4,
+ STATUS_INVALID_PARAMETER, 2, { -1 } },
+ { "0x1234", STATUS_SUCCESS, 6, { 0, 0, 18, 52 }, strict_diff_4,
+ STATUS_INVALID_PARAMETER, 2, { -1 } },
+ { "0x123456789", STATUS_SUCCESS, 11, { 35, 69, 103, 137 }, strict_diff_4,
+ STATUS_INVALID_PARAMETER, 2, { -1 } },
+ { "0x00010Q03", STATUS_SUCCESS, 7, { 0, 0, 0, 16 }, strict_diff_4 | ex_fail_4,
+ STATUS_INVALID_PARAMETER, 2, { -1 } },
+ { "x00010203", STATUS_INVALID_PARAMETER, 0, { -1 } },
+ { "1234BEEF", STATUS_SUCCESS, 4, { 0, 0, 4, 210 }, strict_diff_4 | ex_fail_4,
+ STATUS_INVALID_PARAMETER, 4, { -1 } },
+ { "017700000001", STATUS_SUCCESS, 12, { 127, 0, 0, 1 }, strict_diff_4,
+ STATUS_INVALID_PARAMETER, 1, { -1 } },
+ { "0777", STATUS_SUCCESS, 4, { 0, 0, 1, 255 }, strict_diff_4,
+ STATUS_INVALID_PARAMETER, 1, { -1 } },
{ "::1", STATUS_INVALID_PARAMETER, 0, { -1 } },
{ ":1", STATUS_INVALID_PARAMETER, 0, { -1 } },
};
--
2.22.0
July 4, 2019
[PATCH] gdi32/tests: Fix tests on Win10 1809 64bit.
by Zhiyi Zhang
Signed-off-by: Zhiyi Zhang <zzhang(a)codeweavers.com>
---
dlls/gdi32/tests/driver.c | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)
diff --git a/dlls/gdi32/tests/driver.c b/dlls/gdi32/tests/driver.c
index b5f6f75a83..a19aba2992 100644
--- a/dlls/gdi32/tests/driver.c
+++ b/dlls/gdi32/tests/driver.c
@@ -650,7 +650,9 @@ static void test_D3DKMTCheckOcclusion(void)
ShowWindow(hwnd, SW_MINIMIZE);
occlusion_desc.hWnd = hwnd;
status = pD3DKMTCheckOcclusion(&occlusion_desc);
- ok(status == STATUS_SUCCESS, "Got unexpected return code %#x.\n", status);
+ /* On Win10 1809 64bit, sometimes STATUS_GRAPHICS_PRESENT_OCCLUDED is returned, not sure why */
+ ok(status == STATUS_SUCCESS || broken(status == STATUS_GRAPHICS_PRESENT_OCCLUDED),
+ "Got unexpected return code %#x.\n", status);
ShowWindow(hwnd, SW_SHOWNORMAL);
/* Invisible state doesn't affect D3DKMTCheckOcclusion */
@@ -690,7 +692,9 @@ static void test_D3DKMTCheckOcclusion(void)
ShowWindow(hwnd, SW_MINIMIZE);
occlusion_desc.hWnd = hwnd;
status = pD3DKMTCheckOcclusion(&occlusion_desc);
- ok(status == STATUS_SUCCESS, "Got unexpected return code %#x.\n", status);
+ /* Broken on Win10 1809 64bit sometimes */
+ ok(status == STATUS_SUCCESS || broken(status == STATUS_GRAPHICS_PRESENT_OCCLUDED),
+ "Got unexpected return code %#x.\n", status);
ShowWindow(hwnd, SW_SHOWNORMAL);
ShowWindow(hwnd, SW_HIDE);
--
2.20.1
July 4, 2019
Re: [PATCH] mshtml: Fixed buffer size to WideCharToMultiByte
by Jacek Caban
Signed-off-by: Jacek Caban <jacek(a)codeweavers.com>
July 4, 2019
Re: [PATCH 4/5] winex11.drv: Implement X11DRV_D3DKMTSetVidPnSourceOwner.
by Zhiyi Zhang
On 7/4/19 11:08 PM, Marvin wrote:
> Hi,
>
> While running your changed tests, I think I found new failures.
> Being a bot and all I'm not very good at pattern recognition, so I might be
> wrong, but could you please double-check?
>
> Full results can be found at:
> https://testbot.winehq.org/JobDetails.pl?Key=54476
>
> Your paranoid android.
>
>
> === w1064v1809 (64 bit report) ===
>
> gdi32:
> driver.c:693: Test failed: Got unexpected return code 0xc01e0006.
This failure is unrelated to the changes. The return code seems to be changing sometime and
most of the time it's STATUS_SUCCESS. A successful run can be seen at https://testbot.winehq.org/JobDetails.pl?Key=54455
And I will submit a patch to fix this failure.
>
> === debian9 (32 bit report) ===
>
> d3d11:
> d3d11.c:6101: Test succeeded inside todo block: Got unexpected PrimitivesStorageNeeded: 0.
>
> === debian9 (32 bit Chinese:China report) ===
>
> d3d11:
> d3d11.c:6101: Test succeeded inside todo block: Got unexpected PrimitivesStorageNeeded: 0.
>
> === debian9 (32 bit WoW report) ===
>
> d3d11:
> d3d11.c:6101: Test succeeded inside todo block: Got unexpected PrimitivesStorageNeeded: 0.
>
> === debian9 (64 bit WoW report) ===
>
> d3d11:
> d3d11.c:16849: Test failed: Got {-1.00787401e+000, 0.00000000e+000, 1.00000000e+000, 5.03937006e-001}, expected {-1.00000000e+000, 0.00000000e+000, 1.00000000e+000, 5.03937006e-001} at (0, 0), sub-resource 0.
>
>
July 4, 2019