Wine-devel
Threads by month
- ----- 2026 -----
- 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
November 2019
- 85 participants
- 778 discussions
19 Nov '19
Hello. Is it possible to receive any nws about this patch and the following
ones?
Thanks in advance.
David
Le ven. 1 nov. 2019 à 10:49, Marvin <testbot(a)winehq.org> a écrit :
> Thank you for your contribution to Wine!
>
> This is an automated notification to let you know that your patch has
> been reviewed and its status set to "Assigned".
>
> This means that the patch has been assigned to a reviewer. If the
> reviewer signs off on the patch, it will be committed, otherwise
> you'll receive advice on how to improve it. If you don't hear anything
> after a couple of weeks, please resend the patch.
>
1
0
Signed-off-by: Hans Leidekker <hans(a)codeweavers.com>
---
configure.ac | 1 +
dlls/dhcpcsvc/dhcpcsvc.c | 78 +++++++++++++++--
dlls/dhcpcsvc/tests/Makefile.in | 5 ++
dlls/dhcpcsvc/tests/dhcpcsvc.c | 143 ++++++++++++++++++++++++++++++++
4 files changed, 221 insertions(+), 6 deletions(-)
create mode 100644 dlls/dhcpcsvc/tests/Makefile.in
create mode 100644 dlls/dhcpcsvc/tests/dhcpcsvc.c
diff --git a/configure.ac b/configure.ac
index 22ce5f33a3..93a74a27c8 100644
--- a/configure.ac
+++ b/configure.ac
@@ -3192,6 +3192,7 @@ WINE_CONFIG_MAKEFILE(dlls/ddrawex/tests)
WINE_CONFIG_MAKEFILE(dlls/devenum)
WINE_CONFIG_MAKEFILE(dlls/devenum/tests)
WINE_CONFIG_MAKEFILE(dlls/dhcpcsvc)
+WINE_CONFIG_MAKEFILE(dlls/dhcpcsvc/tests)
WINE_CONFIG_MAKEFILE(dlls/dhtmled.ocx)
WINE_CONFIG_MAKEFILE(dlls/difxapi)
WINE_CONFIG_MAKEFILE(dlls/dinput)
diff --git a/dlls/dhcpcsvc/dhcpcsvc.c b/dlls/dhcpcsvc/dhcpcsvc.c
index 95a467151b..d5df635012 100644
--- a/dlls/dhcpcsvc/dhcpcsvc.c
+++ b/dlls/dhcpcsvc/dhcpcsvc.c
@@ -1,5 +1,6 @@
/*
* Copyright 2011 Stefan Leichter
+ * Copyright 2019 Hans Leidekker for CodeWeavers
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -20,7 +21,12 @@
#include "windef.h"
#include "winbase.h"
#include "dhcpcsdk.h"
+#include "winioctl.h"
+#define WINE_MOUNTMGR_EXTENSIONS
+#include "ddk/mountmgr.h"
+
#include "wine/debug.h"
+#include "wine/heap.h"
WINE_DEFAULT_DEBUG_CHANNEL(dhcpcsvc);
@@ -51,11 +57,71 @@ DWORD WINAPI DhcpCApiInitialize(LPDWORD version)
return ERROR_SUCCESS;
}
-DWORD WINAPI DhcpRequestParams( DWORD flags, void *reserved, WCHAR *adaptername, DHCPCAPI_CLASSID *classid,
- DHCPCAPI_PARAMS_ARRAY sendparams, DHCPCAPI_PARAMS_ARRAY recdparams,
- BYTE *buffer, DWORD *size, WCHAR *requestidstr )
+DWORD WINAPI DhcpRequestParams( DWORD flags, void *reserved, WCHAR *adapter, DHCPCAPI_CLASSID *class_id,
+ DHCPCAPI_PARAMS_ARRAY send_params, DHCPCAPI_PARAMS_ARRAY recv_params, BYTE *buf,
+ DWORD *buflen, WCHAR *request_id )
{
- FIXME("(%08x, %p, %s, %p, %u, %u, %p, %p, %s): stub\n", flags, reserved, debugstr_w(adaptername), classid,
- sendparams.nParams, recdparams.nParams, buffer, size, debugstr_w(requestidstr));
- return ERROR_SUCCESS;
+ struct mountmgr_dhcp_request_params *query;
+ DWORD i, size, err = ERROR_OUTOFMEMORY;
+ BYTE *src, *dst;
+ HANDLE mgr;
+
+ TRACE( "(%08x, %p, %s, %p, %u, %u, %p, %p, %s)\n", flags, reserved, debugstr_w(adapter), class_id,
+ send_params.nParams, recv_params.nParams, buf, buflen, debugstr_w(request_id) );
+
+ if (!adapter || lstrlenW(adapter) > IF_MAX_STRING_SIZE || !buflen) return ERROR_INVALID_PARAMETER;
+ if (flags != DHCPCAPI_REQUEST_SYNCHRONOUS) FIXME( "unsupported flags %08x\n", flags );
+
+ for (i = 0; i < send_params.nParams; i++)
+ FIXME( "send option %u not supported\n", send_params.Params->OptionId );
+
+ mgr = CreateFileW( MOUNTMGR_DOS_DEVICE_NAME, GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL,
+ OPEN_EXISTING, 0, 0 );
+ if (mgr == INVALID_HANDLE_VALUE) return GetLastError();
+
+ size = FIELD_OFFSET(struct mountmgr_dhcp_request_params, params[recv_params.nParams]) + *buflen;
+ if (!(query = heap_alloc_zero( size ))) goto done;
+
+ for (i = 0; i < recv_params.nParams; i++) query->params[i].id = recv_params.Params[i].OptionId;
+ query->count = recv_params.nParams;
+ lstrcpyW( query->adapter, adapter );
+
+ if (!DeviceIoControl( mgr, IOCTL_MOUNTMGR_QUERY_DHCP_REQUEST_PARAMS, query, size, query, size, NULL, NULL ))
+ {
+ err = GetLastError();
+ if (err == ERROR_MORE_DATA) *buflen = query->size - (size - *buflen);
+ goto done;
+ }
+
+ dst = buf;
+ for (i = 0; i < query->count; i++)
+ {
+ if (buf)
+ {
+ recv_params.Params[i].OptionId = query->params[i].id;
+ recv_params.Params[i].IsVendor = FALSE; /* FIXME */
+ if (query->params[i].size)
+ {
+ src = (BYTE *)query + query->params[i].offset;
+ memcpy( dst, src, query->params[i].size );
+
+ recv_params.Params[i].Data = dst;
+ recv_params.Params[i].nBytesData = query->params[i].size;
+ }
+ else
+ {
+ recv_params.Params[i].Data = NULL;
+ recv_params.Params[i].nBytesData = 0;
+ }
+ }
+ dst += query->params[i].size;
+ }
+
+ *buflen = dst - buf;
+ err = ERROR_SUCCESS;
+
+done:
+ heap_free( query );
+ CloseHandle( mgr );
+ return err;
}
diff --git a/dlls/dhcpcsvc/tests/Makefile.in b/dlls/dhcpcsvc/tests/Makefile.in
new file mode 100644
index 0000000000..47440eb2cd
--- /dev/null
+++ b/dlls/dhcpcsvc/tests/Makefile.in
@@ -0,0 +1,5 @@
+TESTDLL = dhcpcsvc.dll
+IMPORTS = dhcpcsvc iphlpapi
+
+C_SRCS = \
+ dhcpcsvc.c
diff --git a/dlls/dhcpcsvc/tests/dhcpcsvc.c b/dlls/dhcpcsvc/tests/dhcpcsvc.c
new file mode 100644
index 0000000000..8b47fe57d5
--- /dev/null
+++ b/dlls/dhcpcsvc/tests/dhcpcsvc.c
@@ -0,0 +1,143 @@
+/*
+ * Copyright 2019 Hans Leidekker for CodeWeavers
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include <stdarg.h>
+#include "winsock2.h"
+#include "windef.h"
+#include "winbase.h"
+#include "iphlpapi.h"
+#include "dhcpcsdk.h"
+#include "wine/test.h"
+
+static IP_ADAPTER_ADDRESSES *get_adapters(void)
+{
+ ULONG err, size = 1024;
+ IP_ADAPTER_ADDRESSES *ret = HeapAlloc( GetProcessHeap(), 0, size );
+ for (;;)
+ {
+ err = GetAdaptersAddresses( AF_UNSPEC, GAA_FLAG_SKIP_ANYCAST | GAA_FLAG_SKIP_MULTICAST |
+ GAA_FLAG_SKIP_DNS_SERVER | GAA_FLAG_SKIP_FRIENDLY_NAME,
+ NULL, ret, &size );
+ if (err != ERROR_BUFFER_OVERFLOW) break;
+ ret = HeapReAlloc( GetProcessHeap(), 0, ret, size );
+ }
+ if (err == ERROR_SUCCESS) return ret;
+ HeapFree( GetProcessHeap(), 0, ret );
+ return NULL;
+}
+
+static void test_DhcpRequestParams(void)
+{
+ static WCHAR nosuchW[] = {'n','o','s','u','c','h','a','d','a','p','t','e','r',0};
+ DHCPCAPI_PARAMS params[6];
+ DHCPCAPI_PARAMS_ARRAY send_params, recv_params;
+ IP_ADAPTER_ADDRESSES *adapters, *ptr;
+ BYTE *buf;
+ WCHAR name[MAX_ADAPTER_NAME_LENGTH + 1];
+ DWORD err, size, i;
+
+ if (!(adapters = get_adapters())) return;
+
+ for (ptr = adapters; ptr; ptr = ptr->Next)
+ {
+ MultiByteToWideChar( CP_ACP, 0, ptr->AdapterName, -1, name, ARRAY_SIZE(name) );
+ trace( "adapter '%s' type %u dhcpv4 enabled %d\n", wine_dbgstr_w(ptr->Description), ptr->IfType, ptr->Dhcpv4Enabled );
+
+ if (ptr->IfType == IF_TYPE_SOFTWARE_LOOPBACK) continue;
+
+ memset( &send_params, 0, sizeof(send_params) );
+ memset( &recv_params, 0, sizeof(recv_params) );
+ err = DhcpRequestParams( DHCPCAPI_REQUEST_SYNCHRONOUS, NULL, NULL, NULL, send_params, recv_params, NULL, NULL, NULL );
+ ok( err == ERROR_INVALID_PARAMETER, "got %u\n", err );
+
+ err = DhcpRequestParams( DHCPCAPI_REQUEST_SYNCHRONOUS, NULL, nosuchW, NULL, send_params, recv_params, NULL, NULL, NULL );
+ ok( err == ERROR_INVALID_PARAMETER, "got %u\n", err );
+
+ err = DhcpRequestParams( DHCPCAPI_REQUEST_SYNCHRONOUS, NULL, name, NULL, send_params, recv_params, NULL, NULL, NULL );
+ ok( err == ERROR_INVALID_PARAMETER, "got %u\n", err );
+
+ size = 0;
+ err = DhcpRequestParams( DHCPCAPI_REQUEST_SYNCHRONOUS, NULL, name, NULL, send_params, recv_params, NULL, &size, NULL );
+ ok( err == ERROR_INVALID_PARAMETER, "got %u\n", err );
+
+ memset( params, 0, sizeof(params) );
+ params[0].OptionId = OPTION_SUBNET_MASK;
+ params[1].OptionId = OPTION_ROUTER_ADDRESS;
+ params[2].OptionId = OPTION_HOST_NAME;
+ params[3].OptionId = OPTION_DOMAIN_NAME;
+ params[4].OptionId = OPTION_BROADCAST_ADDRESS;
+ params[5].OptionId = OPTION_MSFT_IE_PROXY;
+ recv_params.nParams = 6;
+ recv_params.Params = params;
+
+ size = 0;
+ buf = HeapAlloc( GetProcessHeap(), 0, size );
+ err = DhcpRequestParams( DHCPCAPI_REQUEST_SYNCHRONOUS, NULL, name, NULL, send_params, recv_params,
+ buf, &size, NULL );
+ while (err == ERROR_MORE_DATA)
+ {
+ buf = HeapReAlloc( GetProcessHeap(), 0, buf, size );
+ err = DhcpRequestParams( DHCPCAPI_REQUEST_SYNCHRONOUS, NULL, name, NULL, send_params, recv_params,
+ buf, &size, NULL );
+ }
+ if (err == ERROR_SUCCESS)
+ {
+ for (i = 0; i < ARRAY_SIZE(params); i++)
+ {
+ switch( params[i].OptionId )
+ {
+ case OPTION_SUBNET_MASK:
+ case OPTION_ROUTER_ADDRESS:
+ case OPTION_BROADCAST_ADDRESS:
+ if (params[i].Data)
+ {
+ ok( params[i].nBytesData == sizeof(DWORD), "got %u\n", params[i].nBytesData );
+ trace( "%u: Data %p (%08x) nBytesData %u OptionId %u Flags %08x IsVendor %d\n",
+ i, params[i].Data, *(DWORD *)params[i].Data, params[i].nBytesData, params[i].OptionId,
+ params[i].Flags, params[i].IsVendor );
+ }
+ break;
+ case OPTION_HOST_NAME:
+ case OPTION_DOMAIN_NAME:
+ case OPTION_MSFT_IE_PROXY:
+ if (params[i].Data)
+ {
+ char *str = HeapAlloc( GetProcessHeap(), 0, params[i].nBytesData + 1 );
+ memcpy( str, params[i].Data, params[i].nBytesData );
+ str[params[i].nBytesData] = 0;
+ trace( "%u: Data %p (%s) nBytesData %u OptionId %u Flags %08x IsVendor %d\n",
+ i, params[i].Data, str, params[i].nBytesData, params[i].OptionId,
+ params[i].Flags, params[i].IsVendor );
+ HeapFree( GetProcessHeap(), 0, str );
+ }
+ break;
+ default:
+ ok( 0, "unexpected option %u\n", params[i].OptionId );
+ break;
+ }
+ }
+ }
+ HeapFree( GetProcessHeap(), 0, buf );
+ }
+ HeapFree( GetProcessHeap(), 0, adapters );
+}
+
+START_TEST(dhcpcsvc)
+{
+ test_DhcpRequestParams();
+}
--
2.20.1
2
1
[PATCH 3/4] mountmgr.sys: Add support for querying DHCP parameters on macOS.
by Hans Leidekker 19 Nov '19
by Hans Leidekker 19 Nov '19
19 Nov '19
Signed-off-by: Hans Leidekker <hans(a)codeweavers.com>
---
configure.ac | 3 +
dlls/mountmgr.sys/Makefile.in | 2 +-
dlls/mountmgr.sys/diskarb.c | 167 ++++++++++++++++++++++++++++++++++
3 files changed, 171 insertions(+), 1 deletion(-)
diff --git a/configure.ac b/configure.ac
index 64721e9644..22ce5f33a3 100644
--- a/configure.ac
+++ b/configure.ac
@@ -436,6 +436,8 @@ AC_CHECK_HEADERS(\
OpenCL/opencl.h \
QuickTime/ImageCompression.h \
Security/Security.h \
+ SystemConfiguration/SCDynamicStoreCopyDHCPInfo.h \
+ SystemConfiguration/SCNetworkConfiguration.h \
alias.h \
arpa/inet.h \
arpa/nameser.h \
@@ -759,6 +761,7 @@ case $host_os in
AC_SUBST(APPLICATIONSERVICES_LIBS,"-framework ApplicationServices")
AC_SUBST(CORESERVICES_LIBS,"-framework CoreServices")
AC_SUBST(APPKIT_LIBS,"-framework AppKit")
+ AC_SUBST(SYSTEMCONFIGURATION_LIBS,"-framework SystemConfiguration")
WINELOADER_LDFLAGS="-Wl,-pie,-pagezero_size,0x1000,-sectcreate,__TEXT,__info_plist,wine_info.plist"
diff --git a/dlls/mountmgr.sys/Makefile.in b/dlls/mountmgr.sys/Makefile.in
index 738f071390..e229164280 100644
--- a/dlls/mountmgr.sys/Makefile.in
+++ b/dlls/mountmgr.sys/Makefile.in
@@ -3,7 +3,7 @@ IMPORTS = uuid advapi32 ntoskrnl
DELAYIMPORTS = user32 iphlpapi
EXTRADLLFLAGS = -Wl,--subsystem,native
EXTRAINCL = $(DBUS_CFLAGS) $(HAL_CFLAGS)
-EXTRALIBS = $(DISKARBITRATION_LIBS)
+EXTRALIBS = $(DISKARBITRATION_LIBS) $(SYSTEMCONFIGURATION_LIBS) $(CORESERVICES_LIBS)
C_SRCS = \
dbus.c \
diff --git a/dlls/mountmgr.sys/diskarb.c b/dlls/mountmgr.sys/diskarb.c
index 9a7616ecc6..66c121e114 100644
--- a/dlls/mountmgr.sys/diskarb.c
+++ b/dlls/mountmgr.sys/diskarb.c
@@ -29,8 +29,18 @@
#ifdef HAVE_DISKARBITRATION_DISKARBITRATION_H
#include <DiskArbitration/DiskArbitration.h>
#endif
+#if defined(HAVE_SYSTEMCONFIGURATION_SCDYNAMICSTORECOPYDHCPINFO_H) && defined(HAVE_SYSTEMCONFIGURATION_SCNETWORKCONFIGURATION_H)
+#include <SystemConfiguration/SCDynamicStoreCopyDHCPInfo.h>
+#include <SystemConfiguration/SCNetworkConfiguration.h>
+#endif
#include "mountmgr.h"
+#define USE_WS_PREFIX
+#include "winsock2.h"
+#include "ws2ipdef.h"
+#include "nldef.h"
+#include "netioapi.h"
+#include "dhcpcsdk.h"
#include "wine/debug.h"
WINE_DEFAULT_DEBUG_CHANNEL(mountmgr);
@@ -152,3 +162,160 @@ void initialize_diskarbitration(void)
}
#endif /* HAVE_DISKARBITRATION_DISKARBITRATION_H */
+
+#if defined(HAVE_SYSTEMCONFIGURATION_SCDYNAMICSTORECOPYDHCPINFO_H) && defined(HAVE_SYSTEMCONFIGURATION_SCNETWORKCONFIGURATION_H)
+
+static UInt8 map_option( ULONG option )
+{
+ switch (option)
+ {
+ case OPTION_SUBNET_MASK: return 1;
+ case OPTION_ROUTER_ADDRESS: return 3;
+ case OPTION_HOST_NAME: return 12;
+ case OPTION_DOMAIN_NAME: return 15;
+ case OPTION_BROADCAST_ADDRESS: return 28;
+ case OPTION_MSFT_IE_PROXY: return 252;
+ default:
+ FIXME( "unhandled option %u\n", option );
+ return 0;
+ }
+}
+
+#define IF_NAMESIZE 16
+static BOOL map_adapter_name( const WCHAR *name, WCHAR *unix_name, DWORD len )
+{
+ WCHAR buf[IF_NAMESIZE];
+ UNICODE_STRING str;
+ GUID guid;
+
+ RtlInitUnicodeString( &str, name );
+ if (!RtlGUIDFromString( &str, &guid ))
+ {
+ NET_LUID luid;
+ if (ConvertInterfaceGuidToLuid( &guid, &luid ) ||
+ ConvertInterfaceLuidToNameW( &luid, buf, ARRAY_SIZE(buf) )) return FALSE;
+
+ name = buf;
+ }
+ if (lstrlenW( name ) >= len) return FALSE;
+ lstrcpyW( unix_name, name );
+ return TRUE;
+}
+
+static CFStringRef find_service_id( const WCHAR *adapter )
+{
+ SCPreferencesRef prefs;
+ SCNetworkSetRef set = NULL;
+ CFArrayRef services = NULL;
+ CFStringRef id, ret = NULL;
+ WCHAR unix_name[IF_NAMESIZE];
+ CFIndex i;
+
+ if (!map_adapter_name( adapter, unix_name, ARRAY_SIZE(unix_name) )) return NULL;
+ if (!(prefs = SCPreferencesCreate( NULL, CFSTR("mountmgr.sys"), NULL ))) return NULL;
+ if (!(set = SCNetworkSetCopyCurrent( prefs ))) goto done;
+ if (!(services = SCNetworkSetCopyServices( set ))) goto done;
+
+ for (i = 0; i < CFArrayGetCount( services ); i++)
+ {
+ SCNetworkServiceRef service;
+ UniChar buf[IF_NAMESIZE] = {0};
+ CFStringRef name;
+
+ service = CFArrayGetValueAtIndex( services, i );
+ name = SCNetworkInterfaceGetBSDName( SCNetworkServiceGetInterface(service) );
+ if (CFStringGetLength( name ) < ARRAY_SIZE( buf ))
+ {
+ CFStringGetCharacters( name, CFRangeMake(0, CFStringGetLength(name)), buf );
+ if (!lstrcmpW( buf, unix_name ) && (id = SCNetworkServiceGetServiceID( service )))
+ {
+ ret = CFStringCreateCopy( NULL, id );
+ break;
+ }
+ }
+ }
+
+done:
+ if (services) CFRelease( services );
+ if (set) CFRelease( set );
+ CFRelease( prefs );
+ return ret;
+}
+
+ULONG get_dhcp_request_param( const WCHAR *adapter, struct mountmgr_dhcp_request_param *param, char *buf, ULONG offset,
+ ULONG size )
+{
+ CFStringRef service_id = find_service_id( adapter );
+ CFDictionaryRef dict;
+ CFDataRef value;
+ DWORD ret = 0;
+ CFIndex len;
+
+ param->offset = 0;
+ param->size = 0;
+
+ if (!service_id) return 0;
+ if (!(dict = SCDynamicStoreCopyDHCPInfo( NULL, service_id )))
+ {
+ CFRelease( service_id );
+ return 0;
+ }
+ CFRelease( service_id );
+ if (!(value = DHCPInfoGetOptionData( dict, map_option(param->id) )))
+ {
+ CFRelease( dict );
+ return 0;
+ }
+ len = CFDataGetLength( value );
+
+ switch (param->id)
+ {
+ case OPTION_SUBNET_MASK:
+ case OPTION_ROUTER_ADDRESS:
+ case OPTION_BROADCAST_ADDRESS:
+ {
+ DWORD *ptr = (DWORD *)(buf + offset);
+ if (len == sizeof(*ptr) && size >= sizeof(*ptr))
+ {
+ CFDataGetBytes( value, CFRangeMake(0, len), (UInt8 *)ptr );
+ param->offset = offset;
+ param->size = sizeof(*ptr);
+ TRACE( "returning %08x\n", *ptr );
+ }
+ ret = sizeof(*ptr);
+ break;
+ }
+ case OPTION_HOST_NAME:
+ case OPTION_DOMAIN_NAME:
+ case OPTION_MSFT_IE_PROXY:
+ {
+ char *ptr = buf + offset;
+ if (size >= len)
+ {
+ CFDataGetBytes( value, CFRangeMake(0, len), (UInt8 *)ptr );
+ param->offset = offset;
+ param->size = len;
+ TRACE( "returning %s\n", debugstr_an(ptr, len) );
+ }
+ ret = len;
+ break;
+ }
+ default:
+ FIXME( "option %u not supported\n", param->id );
+ break;
+ }
+
+ CFRelease( dict );
+ return ret;
+}
+
+#elif !defined(SONAME_LIBDBUS_1)
+
+ULONG get_dhcp_request_param( const WCHAR *adapter, struct mountmgr_dhcp_request_param *param, char *buf, ULONG offset,
+ ULONG size )
+{
+ FIXME( "support not compiled in\n" );
+ return 0;
+}
+
+#endif
--
2.20.1
1
0
[PATCH 2/4] mountmgr.sys: Add support for querying DHCP parameters on Linux.
by Hans Leidekker 19 Nov '19
by Hans Leidekker 19 Nov '19
19 Nov '19
Signed-off-by: Hans Leidekker <hans(a)codeweavers.com>
---
dlls/mountmgr.sys/Makefile.in | 2 +-
dlls/mountmgr.sys/dbus.c | 271 ++++++++++++++++++++++++++++++++++
dlls/mountmgr.sys/mountmgr.c | 40 +++++
dlls/mountmgr.sys/mountmgr.h | 3 +
include/ddk/mountmgr.h | 21 +++
5 files changed, 336 insertions(+), 1 deletion(-)
diff --git a/dlls/mountmgr.sys/Makefile.in b/dlls/mountmgr.sys/Makefile.in
index 511484b10b..738f071390 100644
--- a/dlls/mountmgr.sys/Makefile.in
+++ b/dlls/mountmgr.sys/Makefile.in
@@ -1,6 +1,6 @@
MODULE = mountmgr.sys
IMPORTS = uuid advapi32 ntoskrnl
-DELAYIMPORTS = user32
+DELAYIMPORTS = user32 iphlpapi
EXTRADLLFLAGS = -Wl,--subsystem,native
EXTRAINCL = $(DBUS_CFLAGS) $(HAL_CFLAGS)
EXTRALIBS = $(DISKARBITRATION_LIBS)
diff --git a/dlls/mountmgr.sys/dbus.c b/dlls/mountmgr.sys/dbus.c
index 7e373e6f91..b96cb0df4c 100644
--- a/dlls/mountmgr.sys/dbus.c
+++ b/dlls/mountmgr.sys/dbus.c
@@ -36,6 +36,13 @@
#include "mountmgr.h"
#include "winnls.h"
#include "excpt.h"
+#include "winsock2.h"
+#include "ws2ipdef.h"
+#include "nldef.h"
+#include "netioapi.h"
+#include "inaddr.h"
+#include "ip2string.h"
+#include "dhcpcsdk.h"
#include "wine/library.h"
#include "wine/exception.h"
@@ -48,6 +55,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(mountmgr);
#define DBUS_FUNCS \
DO_FUNC(dbus_bus_add_match); \
DO_FUNC(dbus_bus_get); \
+ DO_FUNC(dbus_bus_get_private); \
DO_FUNC(dbus_bus_remove_match); \
DO_FUNC(dbus_connection_add_filter); \
DO_FUNC(dbus_connection_read_write_dispatch); \
@@ -762,6 +770,269 @@ void initialize_dbus(void)
CloseHandle( handle );
}
+/* The udisks dispatch loop will block all threads using the same connection, so we'll
+ use a private connection. Multiple threads can make methods calls at the same time
+ on the same connection, according to the documentation.
+ */
+static DBusConnection *dhcp_connection;
+static DBusConnection *get_dhcp_connection(void)
+{
+ if (!dhcp_connection)
+ {
+ DBusError error;
+ p_dbus_error_init( &error );
+ if (!(dhcp_connection = p_dbus_bus_get_private( DBUS_BUS_SYSTEM, &error )))
+ {
+ WARN( "failed to get system dbus connection: %s\n", error.message );
+ p_dbus_error_free( &error );
+ }
+ }
+ return dhcp_connection;
+}
+
+static DBusMessage *device_by_iface_request( const char *iface )
+{
+ DBusMessage *request, *reply;
+ DBusMessageIter iter;
+ DBusError error;
+
+ request = p_dbus_message_new_method_call( "org.freedesktop.NetworkManager", "/org/freedesktop/NetworkManager",
+ "org.freedesktop.NetworkManager", "GetDeviceByIpIface" );
+ if (!request) return NULL;
+
+ p_dbus_message_iter_init_append( request, &iter );
+ p_dbus_message_iter_append_basic( &iter, DBUS_TYPE_STRING, &iface );
+
+ p_dbus_error_init( &error );
+ reply = p_dbus_connection_send_with_reply_and_block( get_dhcp_connection(), request, -1, &error );
+ p_dbus_message_unref( request );
+ if (!reply)
+ {
+ WARN( "failed: %s\n", error.message );
+ p_dbus_error_free( &error );
+ return NULL;
+ }
+
+ p_dbus_error_free( &error );
+ return reply;
+}
+
+#define IF_NAMESIZE 16
+static BOOL map_adapter_name( const WCHAR *name, char *unix_name, DWORD len )
+{
+ WCHAR unix_nameW[IF_NAMESIZE];
+ UNICODE_STRING str;
+ GUID guid;
+
+ RtlInitUnicodeString( &str, name );
+ if (!RtlGUIDFromString( &str, &guid ))
+ {
+ NET_LUID luid;
+ if (ConvertInterfaceGuidToLuid( &guid, &luid ) ||
+ ConvertInterfaceLuidToNameW( &luid, unix_nameW, ARRAY_SIZE(unix_nameW) )) return FALSE;
+
+ name = unix_nameW;
+ }
+ return WideCharToMultiByte( CP_UNIXCP, 0, name, -1, unix_name, len, NULL, NULL ) != 0;
+}
+
+static DBusMessage *dhcp4_config_request( const WCHAR *adapter )
+{
+ static const char *device = "org.freedesktop.NetworkManager.Device";
+ static const char *dhcp4_config = "Dhcp4Config";
+ char iface[IF_NAMESIZE];
+ DBusMessage *request, *reply;
+ DBusMessageIter iter;
+ DBusError error;
+ const char *path = NULL;
+
+ if (!map_adapter_name( adapter, iface, sizeof(iface) )) return NULL;
+ if (!(reply = device_by_iface_request( iface ))) return NULL;
+
+ p_dbus_message_iter_init( reply, &iter );
+ if (p_dbus_message_iter_get_arg_type( &iter ) == DBUS_TYPE_OBJECT_PATH) p_dbus_message_iter_get_basic( &iter, &path );
+ p_dbus_message_unref( reply );
+ if (!path) return NULL;
+
+ request = p_dbus_message_new_method_call( "org.freedesktop.NetworkManager", path,
+ "org.freedesktop.DBus.Properties", "Get" );
+ if (!request) return NULL;
+
+ p_dbus_message_iter_init_append( request, &iter );
+ p_dbus_message_iter_append_basic( &iter, DBUS_TYPE_STRING, &device );
+ p_dbus_message_iter_append_basic( &iter, DBUS_TYPE_STRING, &dhcp4_config );
+
+ p_dbus_error_init( &error );
+ reply = p_dbus_connection_send_with_reply_and_block( get_dhcp_connection(), request, -1, &error );
+ p_dbus_message_unref( request );
+ if (!reply)
+ {
+ WARN( "failed: %s\n", error.message );
+ p_dbus_error_free( &error );
+ return NULL;
+ }
+
+ p_dbus_error_free( &error );
+ return reply;
+}
+
+static DBusMessage *dhcp4_config_options_request( const WCHAR *adapter )
+{
+ static const char *dhcp4_config = "org.freedesktop.NetworkManager.DHCP4Config";
+ static const char *options = "Options";
+ DBusMessage *request, *reply;
+ DBusMessageIter iter, sub;
+ DBusError error;
+ const char *path = NULL;
+
+ if (!(reply = dhcp4_config_request( adapter ))) return NULL;
+
+ p_dbus_message_iter_init( reply, &iter );
+ if (p_dbus_message_iter_get_arg_type( &iter ) == DBUS_TYPE_VARIANT)
+ {
+ p_dbus_message_iter_recurse( &iter, &sub );
+ p_dbus_message_iter_get_basic( &sub, &path );
+ }
+ if (!path)
+ {
+ p_dbus_message_unref( reply );
+ return NULL;
+ }
+
+ request = p_dbus_message_new_method_call( "org.freedesktop.NetworkManager", path,
+ "org.freedesktop.DBus.Properties", "Get" );
+ p_dbus_message_unref( reply );
+ if (!request) return NULL;
+
+ p_dbus_message_iter_init_append( request, &iter );
+ p_dbus_message_iter_append_basic( &iter, DBUS_TYPE_STRING, &dhcp4_config );
+ p_dbus_message_iter_append_basic( &iter, DBUS_TYPE_STRING, &options );
+
+ p_dbus_error_init( &error );
+ reply = p_dbus_connection_send_with_reply_and_block( get_dhcp_connection(), request, -1, &error );
+ p_dbus_message_unref( request );
+ if (!reply)
+ {
+ p_dbus_error_free( &error );
+ return NULL;
+ }
+
+ p_dbus_error_free( &error );
+ return reply;
+}
+
+static const char *dhcp4_config_option_next_dict_entry( DBusMessageIter *iter, DBusMessageIter *variant )
+{
+ DBusMessageIter sub;
+ const char *name;
+
+ if (p_dbus_message_iter_get_arg_type( iter ) != DBUS_TYPE_DICT_ENTRY) return NULL;
+ p_dbus_message_iter_recurse( iter, &sub );
+ p_dbus_message_iter_next( iter );
+ p_dbus_message_iter_get_basic( &sub, &name );
+ p_dbus_message_iter_next( &sub );
+ p_dbus_message_iter_recurse( &sub, variant );
+ return name;
+}
+
+static DBusMessage *dhcp4_config_option_request( const WCHAR *adapter, const char *option, const char **value )
+{
+ DBusMessage *reply;
+ DBusMessageIter iter, variant;
+ const char *name;
+
+ if (!(reply = dhcp4_config_options_request( adapter ))) return NULL;
+
+ *value = NULL;
+ p_dbus_message_iter_init( reply, &iter );
+ if (p_dbus_message_iter_get_arg_type( &iter ) == DBUS_TYPE_VARIANT)
+ {
+ p_dbus_message_iter_recurse( &iter, &iter );
+ if (p_dbus_message_iter_get_arg_type( &iter ) == DBUS_TYPE_ARRAY)
+ {
+ p_dbus_message_iter_recurse( &iter, &iter );
+ while ((name = dhcp4_config_option_next_dict_entry( &iter, &variant )))
+ {
+ if (!strcmp( name, option ))
+ {
+ p_dbus_message_iter_get_basic( &variant, value );
+ break;
+ }
+ }
+ }
+ }
+
+ return reply;
+}
+
+static const char *map_option( ULONG option )
+{
+ switch (option)
+ {
+ case OPTION_SUBNET_MASK: return "subnet_mask";
+ case OPTION_ROUTER_ADDRESS: return "next_server";
+ case OPTION_HOST_NAME: return "host_name";
+ case OPTION_DOMAIN_NAME: return "domain_name";
+ case OPTION_BROADCAST_ADDRESS: return "broadcast_address";
+ case OPTION_MSFT_IE_PROXY: return "wpad";
+ default:
+ FIXME( "unhandled option %u\n", option );
+ return "";
+ }
+}
+
+ULONG get_dhcp_request_param( const WCHAR *adapter, struct mountmgr_dhcp_request_param *param, char *buf, ULONG offset,
+ ULONG size )
+{
+ DBusMessage *reply;
+ const char *value;
+ ULONG ret = 0;
+
+ param->offset = param->size = 0;
+
+ if (!(reply = dhcp4_config_option_request( adapter, map_option(param->id), &value ))) return 0;
+
+ switch (param->id)
+ {
+ case OPTION_SUBNET_MASK:
+ case OPTION_ROUTER_ADDRESS:
+ case OPTION_BROADCAST_ADDRESS:
+ {
+ IN_ADDR *ptr = (IN_ADDR *)(buf + offset);
+ if (value && size >= sizeof(IN_ADDR) && !RtlIpv4StringToAddressA( value, TRUE, NULL, ptr ))
+ {
+ param->offset = offset;
+ param->size = sizeof(*ptr);
+ TRACE( "returning %08x\n", *(DWORD *)ptr );
+ }
+ ret = sizeof(*ptr);
+ break;
+ }
+ case OPTION_HOST_NAME:
+ case OPTION_DOMAIN_NAME:
+ case OPTION_MSFT_IE_PROXY:
+ {
+ char *ptr = buf + offset;
+ int len = value ? strlen( value ) : 0;
+ if (len && size >= len)
+ {
+ memcpy( ptr, value, len );
+ param->offset = offset;
+ param->size = len;
+ TRACE( "returning %s\n", debugstr_an(ptr, len) );
+ }
+ ret = len;
+ break;
+ }
+ default:
+ FIXME( "option %u not supported\n", param->id );
+ break;
+ }
+
+ p_dbus_message_unref( reply );
+ return ret;
+}
+
#else /* SONAME_LIBDBUS_1 */
void initialize_dbus(void)
diff --git a/dlls/mountmgr.sys/mountmgr.c b/dlls/mountmgr.sys/mountmgr.c
index 2f43a227dc..bc2b776a92 100644
--- a/dlls/mountmgr.sys/mountmgr.c
+++ b/dlls/mountmgr.sys/mountmgr.c
@@ -359,6 +359,35 @@ done:
return status;
}
+/* implementation of IOCTL_MOUNTMGR_QUERY_DHCP_REQUEST_PARAMS */
+static NTSTATUS query_dhcp_request_params( void *buff, SIZE_T insize,
+ SIZE_T outsize, IO_STATUS_BLOCK *iosb )
+{
+ struct mountmgr_dhcp_request_params *query = buff;
+ ULONG i, offset;
+
+ /* sanity checks */
+ if (FIELD_OFFSET(struct mountmgr_dhcp_request_params, params[query->count]) > insize ||
+ !memchrW( query->adapter, 0, ARRAY_SIZE(query->adapter) )) return STATUS_INVALID_PARAMETER;
+ for (i = 0; i < query->count; i++)
+ if (query->params[i].offset + query->params[i].size > insize) return STATUS_INVALID_PARAMETER;
+
+ offset = FIELD_OFFSET(struct mountmgr_dhcp_request_params, params[query->count]);
+ for (i = 0; i < query->count; i++)
+ {
+ offset += get_dhcp_request_param( query->adapter, &query->params[i], buff, offset, outsize - offset );
+ if (offset > outsize)
+ {
+ if (offset >= sizeof(query->size)) query->size = offset;
+ iosb->Information = sizeof(query->size);
+ return STATUS_MORE_ENTRIES;
+ }
+ }
+
+ iosb->Information = offset;
+ return STATUS_SUCCESS;
+}
+
/* handler for ioctls on the mount manager device */
static NTSTATUS WINAPI mountmgr_ioctl( DEVICE_OBJECT *device, IRP *irp )
{
@@ -403,6 +432,17 @@ static NTSTATUS WINAPI mountmgr_ioctl( DEVICE_OBJECT *device, IRP *irp )
irpsp->Parameters.DeviceIoControl.OutputBufferLength,
&irp->IoStatus );
break;
+ case IOCTL_MOUNTMGR_QUERY_DHCP_REQUEST_PARAMS:
+ if (irpsp->Parameters.DeviceIoControl.InputBufferLength < sizeof(struct mountmgr_dhcp_request_params))
+ {
+ irp->IoStatus.u.Status = STATUS_INVALID_PARAMETER;
+ break;
+ }
+ irp->IoStatus.u.Status = query_dhcp_request_params( irp->AssociatedIrp.SystemBuffer,
+ irpsp->Parameters.DeviceIoControl.InputBufferLength,
+ irpsp->Parameters.DeviceIoControl.OutputBufferLength,
+ &irp->IoStatus );
+ break;
default:
FIXME( "ioctl %x not supported\n", irpsp->Parameters.DeviceIoControl.IoControlCode );
irp->IoStatus.u.Status = STATUS_NOT_SUPPORTED;
diff --git a/dlls/mountmgr.sys/mountmgr.h b/dlls/mountmgr.sys/mountmgr.h
index 79f72a3c83..95386a44f8 100644
--- a/dlls/mountmgr.sys/mountmgr.h
+++ b/dlls/mountmgr.sys/mountmgr.h
@@ -70,3 +70,6 @@ extern struct mount_point *add_volume_mount_point( DEVICE_OBJECT *device, UNICOD
const GUID *guid ) DECLSPEC_HIDDEN;
extern void delete_mount_point( struct mount_point *mount ) DECLSPEC_HIDDEN;
extern void set_mount_point_id( struct mount_point *mount, const void *id, unsigned int id_len ) DECLSPEC_HIDDEN;
+
+extern ULONG get_dhcp_request_param( const WCHAR *adapter, struct mountmgr_dhcp_request_param *param, char *buf,
+ ULONG offset, ULONG size ) DECLSPEC_HIDDEN;
diff --git a/include/ddk/mountmgr.h b/include/ddk/mountmgr.h
index fc3199c5ca..cb5822bf3d 100644
--- a/include/ddk/mountmgr.h
+++ b/include/ddk/mountmgr.h
@@ -61,6 +61,27 @@ struct mountmgr_unix_drive
USHORT device_offset;
};
+#define IOCTL_MOUNTMGR_QUERY_DHCP_REQUEST_PARAMS CTL_CODE(MOUNTMGRCONTROLTYPE, 64, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
+
+struct mountmgr_dhcp_request_param
+{
+ ULONG id;
+ ULONG offset;
+ ULONG size;
+};
+
+#ifndef IF_MAX_STRING_SIZE
+#define IF_MAX_STRING_SIZE 256
+#endif
+
+struct mountmgr_dhcp_request_params
+{
+ ULONG size;
+ ULONG count;
+ WCHAR adapter[IF_MAX_STRING_SIZE + 1];
+ struct mountmgr_dhcp_request_param params[1];
+};
+
#endif
typedef struct _MOUNTMGR_CREATE_POINT_INPUT
--
2.20.1
1
0
Signed-off-by: Hans Leidekker <hans(a)codeweavers.com>
---
include/dhcpcsdk.h | 81 ++++++++++++++++++++++++++++++++++++++++++++--
1 file changed, 78 insertions(+), 3 deletions(-)
diff --git a/include/dhcpcsdk.h b/include/dhcpcsdk.h
index 93c7af6e08..8f96a8212d 100644
--- a/include/dhcpcsdk.h
+++ b/include/dhcpcsdk.h
@@ -18,6 +18,75 @@
#ifndef _DHCPCSDK_
#define _DHCPCSDK_
+#define OPTION_PAD 0
+#define OPTION_SUBNET_MASK 1
+#define OPTION_TIME_OFFSET 2
+#define OPTION_ROUTER_ADDRESS 3
+#define OPTION_TIME_SERVERS 4
+#define OPTION_IEN116_NAME_SERVERS 5
+#define OPTION_DOMAIN_NAME_SERVERS 6
+#define OPTION_LOG_SERVERS 7
+#define OPTION_COOKIE_SERVERS 8
+#define OPTION_LPR_SERVERS 9
+#define OPTION_IMPRESS_SERVERS 10
+#define OPTION_RLP_SERVERS 11
+#define OPTION_HOST_NAME 12
+#define OPTION_BOOT_FILE_SIZE 13
+#define OPTION_MERIT_DUMP_FILE 14
+#define OPTION_DOMAIN_NAME 15
+#define OPTION_SWAP_SERVER 16
+#define OPTION_ROOT_DISK 17
+#define OPTION_EXTENSIONS_PATH 18
+#define OPTION_BE_A_ROUTER 19
+#define OPTION_NON_LOCAL_SOURCE_ROUTING 20
+#define OPTION_POLICY_FILTER_FOR_NLSR 21
+#define OPTION_MAX_REASSEMBLY_SIZE 22
+#define OPTION_DEFAULT_TTL 23
+#define OPTION_PMTU_AGING_TIMEOUT 24
+#define OPTION_PMTU_PLATEAU_TABLE 25
+#define OPTION_MTU 26
+#define OPTION_ALL_SUBNETS_MTU 27
+#define OPTION_BROADCAST_ADDRESS 28
+#define OPTION_PERFORM_MASK_DISCOVERY 29
+#define OPTION_BE_A_MASK_SUPPLIER 30
+#define OPTION_PERFORM_ROUTER_DISCOVERY 31
+#define OPTION_ROUTER_SOLICITATION_ADDR 32
+#define OPTION_STATIC_ROUTES 33
+#define OPTION_TRAILERS 34
+#define OPTION_ARP_CACHE_TIMEOUT 35
+#define OPTION_ETHERNET_ENCAPSULATION 36
+#define OPTION_TTL 37
+#define OPTION_KEEP_ALIVE_INTERVAL 38
+#define OPTION_KEEP_ALIVE_DATA_SIZE 39
+#define OPTION_NETWORK_INFO_SERVICE_DOM 40
+#define OPTION_NETWORK_INFO_SERVERS 41
+#define OPTION_NETWORK_TIME_SERVERS 42
+#define OPTION_VENDOR_SPEC_INFO 43
+#define OPTION_NETBIOS_NAME_SERVER 44
+#define OPTION_NETBIOS_DATAGRAM_SERVER 45
+#define OPTION_NETBIOS_NODE_TYPE 46
+#define OPTION_NETBIOS_SCOPE_OPTION 47
+#define OPTION_XWINDOW_FONT_SERVER 48
+#define OPTION_XWINDOW_DISPLAY_MANAGER 49
+#define OPTION_REQUESTED_ADDRESS 50
+#define OPTION_LEASE_TIME 51
+#define OPTION_OK_TO_OVERLAY 52
+#define OPTION_MESSAGE_TYPE 53
+#define OPTION_SERVER_IDENTIFIER 54
+#define OPTION_PARAMETER_REQUEST_LIST 55
+#define OPTION_MESSAGE 56
+#define OPTION_MESSAGE_LENGTH 57
+#define OPTION_RENEWAL_TIME 58
+#define OPTION_REBIND_TIME 59
+#define OPTION_CLIENT_CLASS_INFO 60
+#define OPTION_CLIENT_ID 61
+
+#define OPTION_TFTP_SERVER_NAME 66
+#define OPTION_BOOTFILE_NAME 67
+
+#define OPTION_MSFT_IE_PROXY 252
+#define OPTION_END 255
+
typedef struct _DHCPAPI_PARAMS
{
ULONG Flags;
@@ -42,9 +111,15 @@ typedef struct _DHCPCAPI_CLASSID
ULONG nBytesData;
} DHCPCAPI_CLASSID, *PDHCPCAPI_CLASSID, *LPDHCPCAPI_CLASSID;
+#define DHCPCAPI_REQUEST_PERSISTENT 0x1
+#define DHCPCAPI_REQUEST_SYNCHRONOUS 0x2
+#define DHCPCAPI_REQUEST_ASYNCHRONOUS 0x4
+#define DHCPCAPI_REQUEST_CANCEL 0x8
+#define DHCPCAPI_REQUEST_MASK 0xf
-DWORD WINAPI DhcpRequestParams( DWORD flags, void *reserved, WCHAR *adaptername, DHCPCAPI_CLASSID *classid,
- DHCPCAPI_PARAMS_ARRAY sendparams, DHCPCAPI_PARAMS_ARRAY recdparams,
- BYTE *buffer, DWORD *size, WCHAR *requestidstr );
+void WINAPI DhcpCApiCleanup(void);
+DWORD WINAPI DhcpCApiInitialize(DWORD *);
+DWORD WINAPI DhcpRequestParams(DWORD, void *, WCHAR *, DHCPCAPI_CLASSID *, DHCPCAPI_PARAMS_ARRAY,
+ DHCPCAPI_PARAMS_ARRAY, BYTE *, DWORD *, WCHAR *);
#endif
--
2.20.1
1
0
[PATCH v3] user32: WM_MOUSEACTIVATE should return MA_NOACTIVATE for WM_LBUTTONDOWN/HTCAPTION message.
by Alistair Leslie-Hughes 19 Nov '19
by Alistair Leslie-Hughes 19 Nov '19
19 Nov '19
Supercedes: 171968
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=47945
Signed-off-by: Alistair Leslie-Hughes <leslie_alistair(a)hotmail.com>
---
dlls/user32/defwnd.c | 2 +-
dlls/user32/tests/msg.c | 2 +-
dlls/user32/tests/win.c | 60 +++++++++++++++++++++--------------------
3 files changed, 33 insertions(+), 31 deletions(-)
diff --git a/dlls/user32/defwnd.c b/dlls/user32/defwnd.c
index c0d1190710..9cd1298923 100644
--- a/dlls/user32/defwnd.c
+++ b/dlls/user32/defwnd.c
@@ -409,7 +409,7 @@ static LRESULT DEFWND_DefWinProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lPa
}
/* Caption clicks are handled by NC_HandleNCLButtonDown() */
- return MA_ACTIVATE;
+ return ( HIWORD(lParam) == WM_LBUTTONDOWN && LOWORD(lParam) == HTCAPTION ? MA_NOACTIVATE : MA_ACTIVATE );
case WM_ACTIVATE:
/* The default action in Windows is to set the keyboard focus to
diff --git a/dlls/user32/tests/msg.c b/dlls/user32/tests/msg.c
index 477661ab62..d2342c8b14 100644
--- a/dlls/user32/tests/msg.c
+++ b/dlls/user32/tests/msg.c
@@ -5163,7 +5163,7 @@ static void test_messages(void)
ShowWindow(hwnd, SW_MINIMIZE);
flush_events();
- ok_sequence(WmShowMinOverlappedSeq, "ShowWindow(SW_SHOWMINIMIZED):overlapped", TRUE);
+ ok_sequence(WmShowMinOverlappedSeq, "ShowWindow(SW_SHOWMINIMIZED):overlapped", FALSE);
flush_sequence();
if (GetWindowLongW( hwnd, GWL_STYLE ) & WS_MINIMIZE)
diff --git a/dlls/user32/tests/win.c b/dlls/user32/tests/win.c
index 784849b2ba..78dc55f00a 100644
--- a/dlls/user32/tests/win.c
+++ b/dlls/user32/tests/win.c
@@ -2717,7 +2717,7 @@ static void test_SetWindowPos(HWND hwnd, HWND hwnd2)
ret = SetWindowPos(hwnd_child, NULL, 0, 0, 0, 0, SWP_NOSIZE|SWP_NOMOVE|SWP_NOACTIVATE|SWP_SHOWWINDOW);
ok(ret, "Got %d\n", ret);
flush_events( TRUE );
- todo_wine check_active_state(hwnd2, hwnd2, hwnd2);
+ check_active_state(hwnd2, hwnd2, hwnd2);
DestroyWindow(hwnd_child);
}
@@ -3371,8 +3371,8 @@ static void test_SetForegroundWindow(HWND hwnd)
while (PeekMessageA(&msg, 0, 0, 0, PM_REMOVE)) DispatchMessageA(&msg);
if (0) check_wnd_state(hwnd2, hwnd2, hwnd2, 0);
- todo_wine ok(GetActiveWindow() == hwnd2, "Expected active window %p, got %p.\n", hwnd2, GetActiveWindow());
- todo_wine ok(GetFocus() == hwnd2, "Expected focus window %p, got %p.\n", hwnd2, GetFocus());
+ ok(GetActiveWindow() == hwnd2, "Expected active window %p, got %p.\n", hwnd2, GetActiveWindow());
+ ok(GetFocus() == hwnd2, "Expected focus window %p, got %p.\n", hwnd2, GetFocus());
SetForegroundWindow(hwnd);
check_wnd_state(hwnd, hwnd, hwnd, 0);
@@ -3936,34 +3936,36 @@ static void test_mouse_input(HWND hwnd)
ok(peek_message(&msg), "no message available\n");
/* Test WM_MOUSEACTIVATE */
-#define TEST_MOUSEACTIVATE(A,B) \
+#define TEST_MOUSEACTIVATE(A,B,C) \
res = SendMessageA(hwnd, WM_MOUSEACTIVATE, (WPARAM)hwnd, (LPARAM)MAKELRESULT(A,0)); \
- ok(res == B, "WM_MOUSEACTIVATE for %s returned %ld\n", #A, res);
+ ok(res == B, "WM_MOUSEACTIVATE for %s returned %ld\n", #A, res); \
+ res = SendMessageA(hwnd, WM_MOUSEACTIVATE, (WPARAM)hwnd, (LPARAM)MAKELRESULT(A,WM_LBUTTONDOWN)); \
+ ok(res == C, "WM_MOUSEACTIVATE for %s returned %ld\n", #A, res);
- TEST_MOUSEACTIVATE(HTERROR,MA_ACTIVATE);
- TEST_MOUSEACTIVATE(HTTRANSPARENT,MA_ACTIVATE);
- TEST_MOUSEACTIVATE(HTNOWHERE,MA_ACTIVATE);
- TEST_MOUSEACTIVATE(HTCLIENT,MA_ACTIVATE);
- TEST_MOUSEACTIVATE(HTCAPTION,MA_ACTIVATE);
- TEST_MOUSEACTIVATE(HTSYSMENU,MA_ACTIVATE);
- TEST_MOUSEACTIVATE(HTSIZE,MA_ACTIVATE);
- TEST_MOUSEACTIVATE(HTMENU,MA_ACTIVATE);
- TEST_MOUSEACTIVATE(HTHSCROLL,MA_ACTIVATE);
- TEST_MOUSEACTIVATE(HTVSCROLL,MA_ACTIVATE);
- TEST_MOUSEACTIVATE(HTMINBUTTON,MA_ACTIVATE);
- TEST_MOUSEACTIVATE(HTMAXBUTTON,MA_ACTIVATE);
- TEST_MOUSEACTIVATE(HTLEFT,MA_ACTIVATE);
- TEST_MOUSEACTIVATE(HTRIGHT,MA_ACTIVATE);
- TEST_MOUSEACTIVATE(HTTOP,MA_ACTIVATE);
- TEST_MOUSEACTIVATE(HTTOPLEFT,MA_ACTIVATE);
- TEST_MOUSEACTIVATE(HTTOPRIGHT,MA_ACTIVATE);
- TEST_MOUSEACTIVATE(HTBOTTOM,MA_ACTIVATE);
- TEST_MOUSEACTIVATE(HTBOTTOMLEFT,MA_ACTIVATE);
- TEST_MOUSEACTIVATE(HTBOTTOMRIGHT,MA_ACTIVATE);
- TEST_MOUSEACTIVATE(HTBORDER,MA_ACTIVATE);
- TEST_MOUSEACTIVATE(HTOBJECT,MA_ACTIVATE);
- TEST_MOUSEACTIVATE(HTCLOSE,MA_ACTIVATE);
- TEST_MOUSEACTIVATE(HTHELP,MA_ACTIVATE);
+ TEST_MOUSEACTIVATE(HTERROR, MA_ACTIVATE, MA_ACTIVATE);
+ TEST_MOUSEACTIVATE(HTTRANSPARENT, MA_ACTIVATE, MA_ACTIVATE);
+ TEST_MOUSEACTIVATE(HTNOWHERE, MA_ACTIVATE, MA_ACTIVATE);
+ TEST_MOUSEACTIVATE(HTCLIENT, MA_ACTIVATE, MA_ACTIVATE);
+ TEST_MOUSEACTIVATE(HTCAPTION, MA_ACTIVATE, MA_NOACTIVATE);
+ TEST_MOUSEACTIVATE(HTSYSMENU, MA_ACTIVATE, MA_ACTIVATE);
+ TEST_MOUSEACTIVATE(HTSIZE, MA_ACTIVATE, MA_ACTIVATE);
+ TEST_MOUSEACTIVATE(HTMENU, MA_ACTIVATE, MA_ACTIVATE);
+ TEST_MOUSEACTIVATE(HTHSCROLL, MA_ACTIVATE, MA_ACTIVATE);
+ TEST_MOUSEACTIVATE(HTVSCROLL, MA_ACTIVATE, MA_ACTIVATE);
+ TEST_MOUSEACTIVATE(HTMINBUTTON, MA_ACTIVATE, MA_ACTIVATE);
+ TEST_MOUSEACTIVATE(HTMAXBUTTON, MA_ACTIVATE, MA_ACTIVATE);
+ TEST_MOUSEACTIVATE(HTLEFT, MA_ACTIVATE, MA_ACTIVATE);
+ TEST_MOUSEACTIVATE(HTRIGHT, MA_ACTIVATE, MA_ACTIVATE);
+ TEST_MOUSEACTIVATE(HTTOP, MA_ACTIVATE, MA_ACTIVATE);
+ TEST_MOUSEACTIVATE(HTTOPLEFT, MA_ACTIVATE, MA_ACTIVATE);
+ TEST_MOUSEACTIVATE(HTTOPRIGHT, MA_ACTIVATE, MA_ACTIVATE);
+ TEST_MOUSEACTIVATE(HTBOTTOM, MA_ACTIVATE, MA_ACTIVATE);
+ TEST_MOUSEACTIVATE(HTBOTTOMLEFT, MA_ACTIVATE, MA_ACTIVATE);
+ TEST_MOUSEACTIVATE(HTBOTTOMRIGHT, MA_ACTIVATE, MA_ACTIVATE);
+ TEST_MOUSEACTIVATE(HTBORDER, MA_ACTIVATE, MA_ACTIVATE);
+ TEST_MOUSEACTIVATE(HTOBJECT, MA_ACTIVATE, MA_ACTIVATE);
+ TEST_MOUSEACTIVATE(HTCLOSE, MA_ACTIVATE, MA_ACTIVATE);
+ TEST_MOUSEACTIVATE(HTHELP, MA_ACTIVATE, MA_ACTIVATE);
ShowWindow(popup, SW_HIDE);
--
2.17.1
3
2
Not all XInput events contain axes information. In particular, libinput
does not seem to provide axes information on button_event.
In effect, before this patch, with some configurations, wintab32 clients
would see a point at 0, 0 before and after each stroke.
Signed-off-by: John Chadwick <john(a)jchw.io>
---
dlls/winex11.drv/wintab.c | 9 +++++++--
1 file changed, 7 insertions(+), 2 deletions(-)
diff --git a/dlls/winex11.drv/wintab.c b/dlls/winex11.drv/wintab.c
index fe3d4a8ff4..2a4af41af7 100644
--- a/dlls/winex11.drv/wintab.c
+++ b/dlls/winex11.drv/wintab.c
@@ -929,8 +929,13 @@ static BOOL button_event( HWND hwnd, XEvent *event )
gMsgPacket.pkTime = EVENT_x11_time_to_win32_time(button->time);
gMsgPacket.pkSerialNumber = gSerial++;
gMsgPacket.pkCursor = curnum;
- gMsgPacket.pkX = button->axis_data[0];
- gMsgPacket.pkY = button->axis_data[1];
+ if (button->axes_count > 0) {
+ gMsgPacket.pkX = button->axis_data[0];
+ gMsgPacket.pkY = button->axis_data[1];
+ } else {
+ gMsgPacket.pkX = last_packet.pkX;
+ gMsgPacket.pkY = last_packet.pkY;
+ }
gMsgPacket.pkOrientation.orAzimuth = figure_deg(button->axis_data[3],button->axis_data[4]);
gMsgPacket.pkOrientation.orAltitude = ((1000 - 15 * max(abs(button->axis_data[3]),
abs(button->axis_data[4])))
--
2.23.0
2
1
19 Nov '19
Signed-off-by: Paul Gofman <gofmanp(a)gmail.com>
---
v4:
rename parameter_get_update_data() to param_get_and_flag_data().
dlls/d3dx9_36/effect.c | 242 +++++++++++++++++++++++++----------
dlls/d3dx9_36/tests/effect.c | 38 ++++--
2 files changed, 205 insertions(+), 75 deletions(-)
diff --git a/dlls/d3dx9_36/effect.c b/dlls/d3dx9_36/effect.c
index a573d88fcf..a8819f3a6b 100644
--- a/dlls/d3dx9_36/effect.c
+++ b/dlls/d3dx9_36/effect.c
@@ -36,6 +36,7 @@ static const char parameter_block_magic_string[4] = {'@', '!', '#', '\xFE'};
#define PARAMETER_FLAG_SHARED 1
#define INITIAL_POOL_SIZE 16
+#define INITIAL_PARAM_BLOCK_SIZE 1024
WINE_DEFAULT_DEBUG_CHANNEL(d3dx);
@@ -153,6 +154,15 @@ struct d3dx_parameter_block
{
char magic_string[ARRAY_SIZE(parameter_block_magic_string)];
struct list entry;
+ size_t buffer_size;
+ size_t current_size;
+ BYTE *buffer;
+};
+
+struct d3dx_recorded_parameter
+{
+ struct d3dx_parameter *param;
+ unsigned int bytes;
};
struct d3dx_effect
@@ -706,11 +716,27 @@ static void free_technique(struct d3dx_technique *technique)
technique->name = NULL;
}
+static unsigned int get_recorded_parameter_size(const struct d3dx_recorded_parameter *record)
+{
+ return sizeof(*record) + record->bytes;
+}
+
static void free_parameter_block(struct d3dx_parameter_block *block)
{
+ struct d3dx_recorded_parameter *record;
+
if (!block)
return;
+ record = (struct d3dx_recorded_parameter *)block->buffer;
+ while ((BYTE *)record < block->buffer + block->current_size)
+ {
+ free_parameter_object_data(record->param, record + 1, record->bytes);
+ record = (struct d3dx_recorded_parameter *)((BYTE *)record + get_recorded_parameter_size(record));
+ }
+ assert((BYTE *)record == block->buffer + block->current_size);
+
+ heap_free(block->buffer);
heap_free(block);
}
@@ -778,14 +804,12 @@ static void get_vector(struct d3dx_parameter *param, D3DXVECTOR4 *vector)
}
}
-static void set_vector(struct d3dx_parameter *param, const D3DXVECTOR4 *vector)
+static void set_vector(struct d3dx_parameter *param, const D3DXVECTOR4 *vector, void *dst_data)
{
UINT i;
for (i = 0; i < param->columns; ++i)
- {
- set_number((FLOAT *)param->data + i, param->type, (FLOAT *)vector + i, D3DXPT_FLOAT);
- }
+ set_number((FLOAT *)dst_data + i, param->type, (FLOAT *)vector + i, D3DXPT_FLOAT);
}
static void get_matrix(struct d3dx_parameter *param, D3DXMATRIX *matrix, BOOL transpose)
@@ -806,31 +830,33 @@ static void get_matrix(struct d3dx_parameter *param, D3DXMATRIX *matrix, BOOL tr
}
}
-static void set_matrix(struct d3dx_parameter *param, const D3DXMATRIX *matrix)
+static void set_matrix(struct d3dx_parameter *param, const D3DXMATRIX *matrix, void *dst_data)
{
UINT i, k;
if (param->type == D3DXPT_FLOAT)
{
if (param->columns == 4)
- memcpy(param->data, matrix->u.m, param->rows * 4 * sizeof(float));
+ {
+ memcpy(dst_data, matrix->u.m, param->rows * 4 * sizeof(float));
+ }
else
+ {
for (i = 0; i < param->rows; ++i)
- memcpy((float *)param->data + i * param->columns, matrix->u.m + i, param->columns * sizeof(float));
+ memcpy((float *)dst_data + i * param->columns, matrix->u.m + i, param->columns * sizeof(float));
+ }
return;
}
for (i = 0; i < param->rows; ++i)
{
for (k = 0; k < param->columns; ++k)
- {
- set_number((FLOAT *)param->data + i * param->columns + k, param->type,
+ set_number((FLOAT *)dst_data + i * param->columns + k, param->type,
&matrix->u.m[i][k], D3DXPT_FLOAT);
- }
}
}
-static void set_matrix_transpose(struct d3dx_parameter *param, const D3DXMATRIX *matrix)
+static void set_matrix_transpose(struct d3dx_parameter *param, const D3DXMATRIX *matrix, void *dst_data)
{
UINT i, k;
@@ -838,7 +864,7 @@ static void set_matrix_transpose(struct d3dx_parameter *param, const D3DXMATRIX
{
for (k = 0; k < param->columns; ++k)
{
- set_number((FLOAT *)param->data + i * param->columns + k, param->type,
+ set_number((FLOAT *)dst_data + i * param->columns + k, param->type,
&matrix->u.m[k][i], D3DXPT_FLOAT);
}
}
@@ -857,7 +883,8 @@ static HRESULT set_string(char **param_data, const char *string)
return D3D_OK;
}
-static HRESULT set_value(struct d3dx_parameter *param, const void *data, unsigned int bytes)
+static HRESULT set_value(struct d3dx_parameter *param, const void *data, unsigned int bytes,
+ void *dst_data)
{
unsigned int i, count;
@@ -873,7 +900,7 @@ static HRESULT set_value(struct d3dx_parameter *param, const void *data, unsigne
case D3DXPT_TEXTURECUBE:
for (i = 0; i < count; ++i)
{
- IUnknown *old_texture = ((IUnknown **)param->data)[i];
+ IUnknown *old_texture = ((IUnknown **)dst_data)[i];
IUnknown *new_texture = ((IUnknown **)data)[i];
if (new_texture == old_texture)
@@ -890,7 +917,7 @@ static HRESULT set_value(struct d3dx_parameter *param, const void *data, unsigne
case D3DXPT_INT:
case D3DXPT_FLOAT:
TRACE("Copy %u bytes.\n", bytes);
- memcpy(param->data, data, bytes);
+ memcpy(dst_data, data, bytes);
break;
case D3DXPT_STRING:
@@ -898,7 +925,7 @@ static HRESULT set_value(struct d3dx_parameter *param, const void *data, unsigne
HRESULT hr;
for (i = 0; i < count; ++i)
- if (FAILED(hr = set_string(&((char **)param->data)[i], ((const char **)data)[i])))
+ if (FAILED(hr = set_string(&((char **)dst_data)[i], ((const char **)data)[i])))
return hr;
break;
}
@@ -1248,6 +1275,43 @@ static ULONG64 next_effect_update_version(struct d3dx_effect *effect)
return next_update_version(get_version_counter_ptr(effect));
}
+static void *record_parameter(struct d3dx_effect *effect, struct d3dx_parameter *param, unsigned int bytes)
+{
+ struct d3dx_parameter_block *block = effect->current_parameter_block;
+ struct d3dx_recorded_parameter new_record, *record;
+ unsigned int new_size, alloc_size;
+
+ new_record.param = param;
+ new_record.bytes = bytes;
+ new_size = block->current_size + get_recorded_parameter_size(&new_record);
+
+ if (new_size > block->buffer_size)
+ {
+ BYTE *new_alloc;
+
+ alloc_size = max(block->buffer_size * 2, max(new_size, INITIAL_PARAM_BLOCK_SIZE));
+ if (block->buffer_size)
+ new_alloc = heap_realloc(block->buffer, alloc_size);
+ else
+ new_alloc = heap_alloc(alloc_size);
+
+ if (!new_alloc)
+ {
+ ERR("Out of memory.\n");
+ return param->data;
+ }
+ /* Data update functions may want to free some references upon setting value. */
+ memset(new_alloc + block->buffer_size, 0, alloc_size - block->buffer_size);
+
+ block->buffer_size = alloc_size;
+ block->buffer = new_alloc;
+ }
+ record = (struct d3dx_recorded_parameter *)(block->buffer + block->current_size);
+ *record = new_record;
+ block->current_size = new_size;
+ return record + 1;
+}
+
static void set_dirty(struct d3dx_parameter *param)
{
struct d3dx_shared_data *shared_data;
@@ -1260,6 +1324,17 @@ static void set_dirty(struct d3dx_parameter *param)
top_param->update_version = new_update_version;
}
+static void *param_get_and_flag_data(struct d3dx_effect *effect, struct d3dx_parameter *param,
+ unsigned int bytes, BOOL value_changed)
+{
+ assert(bytes <= param->bytes);
+
+ if (value_changed && !effect->current_parameter_block)
+ set_dirty(param);
+
+ return effect->current_parameter_block ? record_parameter(effect, param, bytes) : param->data;
+}
+
static void d3dx9_set_light_parameter(enum LIGHT_TYPE op, D3DLIGHT9 *light, void *value)
{
static const struct
@@ -2364,10 +2439,7 @@ static HRESULT WINAPI d3dx_effect_SetValue(ID3DXEffect *iface, D3DXHANDLE parame
}
if (data && param->bytes <= bytes)
- {
- set_dirty(param);
- return set_value(param, data, bytes);
- }
+ return set_value(param, data, bytes, param_get_and_flag_data(effect, param, param->bytes, TRUE));
WARN("Invalid argument specified.\n");
@@ -2448,8 +2520,8 @@ static HRESULT WINAPI d3dx_effect_SetBool(ID3DXEffect *iface, D3DXHANDLE paramet
if (param && !param->element_count && param->rows == 1 && param->columns == 1)
{
- set_number(param->data, param->type, &b, D3DXPT_BOOL);
- set_dirty(param);
+ set_number(param_get_and_flag_data(effect, param, sizeof(int), TRUE),
+ param->type, &b, D3DXPT_BOOL);
return D3D_OK;
}
@@ -2481,6 +2553,7 @@ static HRESULT WINAPI d3dx_effect_SetBoolArray(ID3DXEffect *iface, D3DXHANDLE pa
{
struct d3dx_effect *effect = impl_from_ID3DXEffect(iface);
struct d3dx_parameter *param = get_valid_parameter(effect, parameter);
+ void *data;
TRACE("iface %p, parameter %p, b %p, count %u.\n", iface, parameter, b, count);
@@ -2495,12 +2568,12 @@ static HRESULT WINAPI d3dx_effect_SetBoolArray(ID3DXEffect *iface, D3DXHANDLE pa
case D3DXPC_SCALAR:
case D3DXPC_VECTOR:
case D3DXPC_MATRIX_ROWS:
+ data = param_get_and_flag_data(effect, param, size * sizeof(int), TRUE);
for (i = 0; i < size; ++i)
{
/* don't crop the input, use D3DXPT_INT instead of D3DXPT_BOOL */
- set_number((DWORD *)param->data + i, param->type, &b[i], D3DXPT_INT);
+ set_number((DWORD *)data + i, param->type, &b[i], D3DXPT_INT);
}
- set_dirty(param);
return D3D_OK;
case D3DXPC_OBJECT:
@@ -2558,9 +2631,8 @@ static HRESULT WINAPI d3dx_effect_SetInt(ID3DXEffect *iface, D3DXHANDLE paramete
DWORD value;
set_number(&value, param->type, &n, D3DXPT_INT);
- if (value != *(DWORD *)param->data)
- set_dirty(param);
- *(DWORD *)param->data = value;
+ *(DWORD *)param_get_and_flag_data(effect, param, sizeof(int),
+ value != *(DWORD *)param->data) = value;
return D3D_OK;
}
@@ -2569,14 +2641,19 @@ static HRESULT WINAPI d3dx_effect_SetInt(ID3DXEffect *iface, D3DXHANDLE paramete
&& ((param->class == D3DXPC_VECTOR && param->columns != 2)
|| (param->class == D3DXPC_MATRIX_ROWS && param->rows != 2 && param->columns == 1)))
{
+ void *data;
+
TRACE("Vector fixup.\n");
- *(float *)param->data = ((n & 0xff0000) >> 16) * INT_FLOAT_MULTI_INVERSE;
- ((float *)param->data)[1] = ((n & 0xff00) >> 8) * INT_FLOAT_MULTI_INVERSE;
- ((float *)param->data)[2] = (n & 0xff) * INT_FLOAT_MULTI_INVERSE;
+ data = param_get_and_flag_data(effect, param,
+ min(4, param->rows * param->columns) * sizeof(float), TRUE);
+
+ *(float *)data = ((n & 0xff0000) >> 16) * INT_FLOAT_MULTI_INVERSE;
+ ((float *)data)[1] = ((n & 0xff00) >> 8) * INT_FLOAT_MULTI_INVERSE;
+ ((float *)data)[2] = (n & 0xff) * INT_FLOAT_MULTI_INVERSE;
if (param->rows * param->columns > 3)
- ((float *)param->data)[3] = ((n & 0xff000000) >> 24) * INT_FLOAT_MULTI_INVERSE;
- set_dirty(param);
+ ((float *)data)[3] = ((n & 0xff000000) >> 24) * INT_FLOAT_MULTI_INVERSE;
+
return D3D_OK;
}
}
@@ -2628,6 +2705,7 @@ static HRESULT WINAPI d3dx_effect_SetIntArray(ID3DXEffect *iface, D3DXHANDLE par
{
struct d3dx_effect *effect = impl_from_ID3DXEffect(iface);
struct d3dx_parameter *param = get_valid_parameter(effect, parameter);
+ void *data;
TRACE("iface %p, parameter %p, n %p, count %u.\n", iface, parameter, n, count);
@@ -2642,9 +2720,9 @@ static HRESULT WINAPI d3dx_effect_SetIntArray(ID3DXEffect *iface, D3DXHANDLE par
case D3DXPC_SCALAR:
case D3DXPC_VECTOR:
case D3DXPC_MATRIX_ROWS:
+ data = param_get_and_flag_data(effect, param, size * sizeof(int), TRUE);
for (i = 0; i < size; ++i)
- set_number((DWORD *)param->data + i, param->type, &n[i], D3DXPT_INT);
- set_dirty(param);
+ set_number((DWORD *)data + i, param->type, &n[i], D3DXPT_INT);
return D3D_OK;
case D3DXPC_OBJECT:
@@ -2698,9 +2776,8 @@ static HRESULT WINAPI d3dx_effect_SetFloat(ID3DXEffect *iface, D3DXHANDLE parame
DWORD value;
set_number(&value, param->type, &f, D3DXPT_FLOAT);
- if (value != *(DWORD *)param->data)
- set_dirty(param);
- *(DWORD *)param->data = value;
+ *(DWORD *)param_get_and_flag_data(effect, param, sizeof(float),
+ value != *(DWORD *)param->data) = value;
return D3D_OK;
}
@@ -2733,6 +2810,7 @@ static HRESULT WINAPI d3dx_effect_SetFloatArray(ID3DXEffect *iface, D3DXHANDLE p
{
struct d3dx_effect *effect = impl_from_ID3DXEffect(iface);
struct d3dx_parameter *param = get_valid_parameter(effect, parameter);
+ void *data;
TRACE("iface %p, parameter %p, f %p, count %u.\n", iface, parameter, f, count);
@@ -2747,9 +2825,9 @@ static HRESULT WINAPI d3dx_effect_SetFloatArray(ID3DXEffect *iface, D3DXHANDLE p
case D3DXPC_SCALAR:
case D3DXPC_VECTOR:
case D3DXPC_MATRIX_ROWS:
+ data = param_get_and_flag_data(effect, param, size * sizeof(float), TRUE);
for (i = 0; i < size; ++i)
- set_number((DWORD *)param->data + i, param->type, &f[i], D3DXPT_FLOAT);
- set_dirty(param);
+ set_number((DWORD *)data + i, param->type, &f[i], D3DXPT_FLOAT);
return D3D_OK;
case D3DXPC_OBJECT:
@@ -2806,7 +2884,6 @@ static HRESULT WINAPI d3dx_effect_SetVector(ID3DXEffect *iface, D3DXHANDLE param
{
case D3DXPC_SCALAR:
case D3DXPC_VECTOR:
- set_dirty(param);
if (param->type == D3DXPT_INT && param->bytes == 4)
{
DWORD tmp;
@@ -2817,16 +2894,17 @@ static HRESULT WINAPI d3dx_effect_SetVector(ID3DXEffect *iface, D3DXHANDLE param
tmp += ((DWORD)(max(min(vector->x, 1.0f), 0.0f) * INT_FLOAT_MULTI)) << 16;
tmp += ((DWORD)(max(min(vector->w, 1.0f), 0.0f) * INT_FLOAT_MULTI)) << 24;
- *(int *)param->data = tmp;
+ *(int *)param_get_and_flag_data(effect, param, sizeof(int), TRUE) = tmp;
return D3D_OK;
}
if (param->type == D3DXPT_FLOAT)
{
- memcpy(param->data, vector, param->columns * sizeof(float));
+ memcpy(param_get_and_flag_data(effect, param, param->columns * sizeof(float), TRUE),
+ vector, param->columns * sizeof(float));
return D3D_OK;
}
- set_vector(param, vector);
+ set_vector(param, vector, param_get_and_flag_data(effect, param, param->columns * sizeof(float), TRUE));
return D3D_OK;
case D3DXPC_MATRIX_ROWS:
@@ -2899,26 +2977,34 @@ static HRESULT WINAPI d3dx_effect_SetVectorArray(ID3DXEffect *iface, D3DXHANDLE
if (param && param->element_count && param->element_count >= count)
{
unsigned int i;
+ BYTE *data;
TRACE("Class %s.\n", debug_d3dxparameter_class(param->class));
switch (param->class)
{
case D3DXPC_VECTOR:
- set_dirty(param);
+ data = (BYTE *)param_get_and_flag_data(effect, param,
+ count * param->columns * sizeof(float), TRUE);
+
if (param->type == D3DXPT_FLOAT)
{
if (param->columns == 4)
- memcpy(param->data, vector, count * 4 * sizeof(float));
+ {
+ memcpy(data, vector, count * 4 * sizeof(float));
+ }
else
+ {
for (i = 0; i < count; ++i)
- memcpy((float *)param->data + param->columns * i, vector + i,
+ memcpy((float *)data + param->columns * i, vector + i,
param->columns * sizeof(float));
+ }
return D3D_OK;
}
for (i = 0; i < count; ++i)
- set_vector(¶m->members[i], &vector[i]);
+ set_vector(¶m->members[i], &vector[i], data + i * param->columns * sizeof(float));
+
return D3D_OK;
case D3DXPC_SCALAR:
@@ -2993,8 +3079,8 @@ static HRESULT WINAPI d3dx_effect_SetMatrix(ID3DXEffect *iface, D3DXHANDLE param
switch (param->class)
{
case D3DXPC_MATRIX_ROWS:
- set_matrix(param, matrix);
- set_dirty(param);
+ set_matrix(param, matrix, param_get_and_flag_data(effect, param,
+ param->rows * param->columns * sizeof(float), TRUE));
return D3D_OK;
case D3DXPC_SCALAR:
@@ -3059,15 +3145,20 @@ static HRESULT WINAPI d3dx_effect_SetMatrixArray(ID3DXEffect *iface, D3DXHANDLE
if (param && param->element_count >= count)
{
unsigned int i;
+ BYTE *data;
TRACE("Class %s.\n", debug_d3dxparameter_class(param->class));
switch (param->class)
{
case D3DXPC_MATRIX_ROWS:
- set_dirty(param);
+ data = param_get_and_flag_data(effect, param, count * param->rows
+ * param->columns * sizeof(float), TRUE);
+
for (i = 0; i < count; ++i)
- set_matrix(¶m->members[i], &matrix[i]);
+ set_matrix(¶m->members[i], &matrix[i],
+ data + i * param->rows * param->columns * sizeof(float));
+
return D3D_OK;
case D3DXPC_SCALAR:
@@ -3139,13 +3230,18 @@ static HRESULT WINAPI d3dx_effect_SetMatrixPointerArray(ID3DXEffect *iface, D3DX
if (param && count <= param->element_count)
{
unsigned int i;
+ BYTE *data;
switch (param->class)
{
case D3DXPC_MATRIX_ROWS:
- set_dirty(param);
+ data = param_get_and_flag_data(effect, param, count * param->rows
+ * param->columns * sizeof(float), TRUE);
+
for (i = 0; i < count; ++i)
- set_matrix(¶m->members[i], matrix[i]);
+ set_matrix(¶m->members[i], matrix[i], data + i * param->rows
+ * param->columns * sizeof(float));
+
return D3D_OK;
case D3DXPC_SCALAR:
@@ -3219,8 +3315,8 @@ static HRESULT WINAPI d3dx_effect_SetMatrixTranspose(ID3DXEffect *iface, D3DXHAN
switch (param->class)
{
case D3DXPC_MATRIX_ROWS:
- set_dirty(param);
- set_matrix_transpose(param, matrix);
+ set_matrix_transpose(param, matrix, param_get_and_flag_data(effect, param,
+ param->rows * param->columns * sizeof(float), TRUE));
return D3D_OK;
case D3DXPC_SCALAR:
@@ -3289,15 +3385,20 @@ static HRESULT WINAPI d3dx_effect_SetMatrixTransposeArray(ID3DXEffect *iface, D3
if (param && param->element_count >= count)
{
unsigned int i;
+ BYTE *data;
TRACE("Class %s.\n", debug_d3dxparameter_class(param->class));
switch (param->class)
{
case D3DXPC_MATRIX_ROWS:
- set_dirty(param);
+ data = param_get_and_flag_data(effect, param, count * param->rows
+ * param->columns * sizeof(float), TRUE);
+
for (i = 0; i < count; ++i)
- set_matrix_transpose(¶m->members[i], &matrix[i]);
+ set_matrix_transpose(¶m->members[i], &matrix[i], data
+ + i * param->rows * param->columns * sizeof(float));
+
return D3D_OK;
case D3DXPC_SCALAR:
@@ -3369,13 +3470,18 @@ static HRESULT WINAPI d3dx_effect_SetMatrixTransposePointerArray(ID3DXEffect *if
if (param && count <= param->element_count)
{
unsigned int i;
+ BYTE *data;
switch (param->class)
{
case D3DXPC_MATRIX_ROWS:
- set_dirty(param);
+ data = param_get_and_flag_data(effect, param, count * param->rows
+ * param->columns * sizeof(float), TRUE);
+
for (i = 0; i < count; ++i)
- set_matrix_transpose(¶m->members[i], matrix[i]);
+ set_matrix_transpose(¶m->members[i], matrix[i], data
+ + i * param->rows * param->columns * sizeof(float));
+
return D3D_OK;
case D3DXPC_SCALAR:
@@ -3442,10 +3548,7 @@ static HRESULT WINAPI d3dx_effect_SetString(ID3DXEffect *iface, D3DXHANDLE param
TRACE("iface %p, parameter %p, string %s.\n", iface, parameter, debugstr_a(string));
if (param && param->type == D3DXPT_STRING)
- {
- set_dirty(param);
- return set_string(param->data, string);
- }
+ return set_string(param_get_and_flag_data(effect, param, sizeof(void *), TRUE), string);
WARN("Parameter not found.\n");
@@ -3484,7 +3587,11 @@ static HRESULT WINAPI d3dx_effect_SetTexture(ID3DXEffect *iface, D3DXHANDLE para
|| param->type == D3DXPT_TEXTURE2D || param->type == D3DXPT_TEXTURE3D
|| param->type == D3DXPT_TEXTURECUBE))
{
- IDirect3DBaseTexture9 *old_texture = *(IDirect3DBaseTexture9 **)param->data;
+ IDirect3DBaseTexture9 **data = param_get_and_flag_data(effect, param,
+ sizeof(void *), texture != *(IDirect3DBaseTexture9 **)param->data);
+ IDirect3DBaseTexture9 *old_texture = *data;
+
+ *data = texture;
if (texture == old_texture)
return D3D_OK;
@@ -3494,9 +3601,6 @@ static HRESULT WINAPI d3dx_effect_SetTexture(ID3DXEffect *iface, D3DXHANDLE para
if (old_texture)
IDirect3DBaseTexture9_Release(old_texture);
- *(IDirect3DBaseTexture9 **)param->data = texture;
- set_dirty(param);
-
return D3D_OK;
}
@@ -4137,6 +4241,10 @@ static D3DXHANDLE WINAPI d3dx_effect_EndParameterBlock(ID3DXEffect *iface)
return NULL;
}
ret = effect->current_parameter_block;
+
+ ret->buffer = heap_realloc(ret->buffer, ret->current_size);
+ ret->buffer_size = ret->current_size;
+
effect->current_parameter_block = NULL;
list_add_tail(&effect->parameter_block_list, &ret->entry);
return (D3DXHANDLE)ret;
diff --git a/dlls/d3dx9_36/tests/effect.c b/dlls/d3dx9_36/tests/effect.c
index f1cbe49287..706ae126b8 100644
--- a/dlls/d3dx9_36/tests/effect.c
+++ b/dlls/d3dx9_36/tests/effect.c
@@ -8020,12 +8020,12 @@ static void test_effect_parameter_block(void)
IDirect3DTexture9 *texture, *tex_test;
D3DXHANDLE block, block2, handle;
ID3DXEffect *effect, *effect2;
+ D3DXMATRIX mat, mat_arr[2];
IDirect3DDevice9 *device;
ID3DXEffectPool *pool;
float float_array[4];
float float_value;
IDirect3D9 *d3d;
- D3DXMATRIX mat;
ULONG refcount;
HWND window;
HRESULT hr;
@@ -8115,9 +8115,7 @@ static void test_effect_parameter_block(void)
ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
hr = effect->lpVtbl->GetTexture(effect, "tex1", (IDirect3DBaseTexture9 **)&tex_test);
- todo_wine ok(hr == D3D_OK && !tex_test, "Got unexpected hr %#x, tex_test %p.\n", hr, tex_test);
- if (tex_test)
- IDirect3DTexture9_Release(tex_test);
+ ok(hr == D3D_OK && !tex_test, "Got unexpected hr %#x, tex_test %p.\n", hr, tex_test);
/* Child parameters and array members are recorded separately (the whole
* parameter is not updated when parameter block is applied). */
@@ -8126,13 +8124,13 @@ static void test_effect_parameter_block(void)
hr = effect->lpVtbl->SetFloat(effect, "ts1[0].fv", 28.0f);
ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
hr = effect->lpVtbl->GetFloat(effect, "ts1[0].fv", &float_value);
- todo_wine ok(hr == D3D_OK && float_value == 12.0, "Got unexpected hr %#x, float_value %g.\n", hr, float_value);
+ ok(hr == D3D_OK && float_value == 12.0, "Got unexpected hr %#x, float_value %g.\n", hr, float_value);
float_array[0] = -29.0f;
hr = effect->lpVtbl->SetFloatArray(effect, "ts1[0].v2", float_array, 1);
ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
hr = effect->lpVtbl->GetFloatArray(effect, "ts1[0].v2", float_array, 1);
- todo_wine ok(hr == D3D_OK && float_array[0] == 13.0, "Got unexpected hr %#x, float_array[0] %g.\n",
+ ok(hr == D3D_OK && float_array[0] == 13.0, "Got unexpected hr %#x, float_array[0] %g.\n",
hr, float_array[0]);
memset(&mat, 0, sizeof(mat));
@@ -8140,13 +8138,13 @@ static void test_effect_parameter_block(void)
ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
hr = effect->lpVtbl->GetMatrix(effect, "m3x2row", &mat);
ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
- todo_wine ok(!memcmp(&mat, &effect_orig_mat, sizeof(mat)), "Got unexpected matrix.\n");
+ ok(!memcmp(&mat, &effect_orig_mat, sizeof(mat)), "Got unexpected matrix.\n");
hr = effect->lpVtbl->SetMatrix(effect, "m3x2column", &test_mat);
ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
hr = effect->lpVtbl->GetMatrix(effect, "m3x2column", &mat);
ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
- todo_wine ok(!memcmp(&mat, &effect_orig_mat, sizeof(mat)), "Got unexpected matrix.\n");
+ ok(!memcmp(&mat, &effect_orig_mat, sizeof(mat)), "Got unexpected matrix.\n");
/* Setting shared parameter through effect2 is not recorded to effect
* parameter block. */
@@ -8321,6 +8319,30 @@ static void test_effect_parameter_block(void)
refcount = pool->lpVtbl->Release(pool);
ok(!refcount, "Got unexpected refcount %u.\n", refcount);
+ hr = D3DXCreateEffect(device, test_effect_parameter_value_blob_float, sizeof(test_effect_parameter_value_blob_float),
+ NULL, NULL, 0, NULL, &effect, NULL);
+ hr = effect->lpVtbl->BeginParameterBlock(effect);
+ ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
+ mat_arr[0] = mat_arr[1] = test_mat;
+ hr = effect->lpVtbl->SetMatrixArray(effect, "f33_2", mat_arr, 2);
+ ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
+ block = effect->lpVtbl->EndParameterBlock(effect);
+ ok(!!block, "Got unexpected block %p.\n", block);
+
+ memset(mat_arr, 0, sizeof(mat_arr));
+ hr = effect->lpVtbl->SetMatrixArray(effect, "f33_2", mat_arr, 2);
+ ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
+ hr = effect->lpVtbl->ApplyParameterBlock(effect, block);
+ todo_wine ok(hr == D3D_OK, "Got result %#x.\n", hr);
+
+ hr = effect->lpVtbl->GetMatrixArray(effect, "f33_2", mat_arr, 2);
+ ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
+ todo_wine ok(!memcmp(&mat_arr[0], &test_mat, sizeof(test_mat))
+ && !memcmp(&mat_arr[1], &test_mat, sizeof(test_mat)), "Got unexpected matrix array.\n");
+
+ refcount = effect->lpVtbl->Release(effect);
+ ok(!refcount, "Got unexpected refcount %u.\n", refcount);
+
refcount = IDirect3DDevice9_Release(device);
ok(!refcount, "Device has %u references left.\n", refcount);
IDirect3D9_Release(d3d);
--
2.23.0
2
2
Signed-off-by: Serge Gautherie <winehq-git_serge_180711(a)gautherie.fr>
---
dlls/ole32/stg_prop.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/dlls/ole32/stg_prop.c b/dlls/ole32/stg_prop.c
index 9e13c13..dfe6a6a 100644
--- a/dlls/ole32/stg_prop.c
+++ b/dlls/ole32/stg_prop.c
@@ -958,7 +958,7 @@ static void PropertyStorage_PropNameDestroy(void *k, void *d, void *extra)
static int PropertyStorage_PropCompare(const void *a, const void *b,
void *extra)
{
- TRACE("(%d, %d)\n", PtrToUlong(a), PtrToUlong(b));
+ TRACE("(%u, %u)\n", PtrToUlong(a), PtrToUlong(b));
return PtrToUlong(a) - PtrToUlong(b);
}
--
2.10.0.windows.1
1
0
19 Nov '19
Signed-off-by: Paul Gofman <gofmanp(a)gmail.com>
---
v4:
- do not update parameter values if parameter block is being recorded.
v5:
- remove conditional compilation for get_valid_parameter_block()
(fixes compilation of d3dx9_[24,25].dll).
dlls/d3dx9_36/effect.c | 22 +++++++++++++++-----
dlls/d3dx9_36/tests/effect.c | 40 ++++++++++++++++++------------------
2 files changed, 37 insertions(+), 25 deletions(-)
diff --git a/dlls/d3dx9_36/effect.c b/dlls/d3dx9_36/effect.c
index a8819f3a6b..39cb10234c 100644
--- a/dlls/d3dx9_36/effect.c
+++ b/dlls/d3dx9_36/effect.c
@@ -153,6 +153,7 @@ struct d3dx_technique
struct d3dx_parameter_block
{
char magic_string[ARRAY_SIZE(parameter_block_magic_string)];
+ struct d3dx_effect *effect;
struct list entry;
size_t buffer_size;
size_t current_size;
@@ -519,7 +520,6 @@ static struct d3dx_parameter *get_valid_parameter(struct d3dx_effect *effect, D3
return effect->flags & D3DXFX_LARGEADDRESSAWARE ? NULL : get_parameter_by_name(effect, NULL, parameter);
}
-#if D3DX_SDK_VERSION >= 26
static struct d3dx_parameter_block *get_valid_parameter_block(D3DXHANDLE handle)
{
struct d3dx_parameter_block *block = (struct d3dx_parameter_block *)handle;
@@ -527,7 +527,6 @@ static struct d3dx_parameter_block *get_valid_parameter_block(D3DXHANDLE handle)
return block && !strncmp(block->magic_string, parameter_block_magic_string,
sizeof(parameter_block_magic_string)) ? block : NULL;
}
-#endif
static void free_state(struct d3dx_state *state)
{
@@ -4224,6 +4223,7 @@ static HRESULT WINAPI d3dx_effect_BeginParameterBlock(ID3DXEffect *iface)
effect->current_parameter_block = heap_alloc_zero(sizeof(*effect->current_parameter_block));
memcpy(effect->current_parameter_block->magic_string, parameter_block_magic_string,
sizeof(parameter_block_magic_string));
+ effect->current_parameter_block->effect = effect;
return D3D_OK;
}
@@ -4252,11 +4252,23 @@ static D3DXHANDLE WINAPI d3dx_effect_EndParameterBlock(ID3DXEffect *iface)
static HRESULT WINAPI d3dx_effect_ApplyParameterBlock(ID3DXEffect *iface, D3DXHANDLE parameter_block)
{
- struct d3dx_effect *This = impl_from_ID3DXEffect(iface);
+ struct d3dx_parameter_block *block = get_valid_parameter_block(parameter_block);
+ struct d3dx_recorded_parameter *record;
- FIXME("(%p)->(%p): stub\n", This, parameter_block);
+ TRACE("iface %p, paramater_block %p.\n", iface, parameter_block);
- return E_NOTIMPL;
+ if (!block || !block->current_size)
+ return D3DERR_INVALIDCALL;
+
+ record = (struct d3dx_recorded_parameter *)block->buffer;
+ while ((BYTE *)record < block->buffer + block->current_size)
+ {
+ set_value(record->param, record + 1, record->bytes,
+ param_get_and_flag_data(block->effect, record->param, record->bytes, TRUE));
+ record = (struct d3dx_recorded_parameter *)((BYTE *)record + get_recorded_parameter_size(record));
+ }
+ assert((BYTE *)record == block->buffer + block->current_size);
+ return D3D_OK;
}
#if D3DX_SDK_VERSION >= 26
diff --git a/dlls/d3dx9_36/tests/effect.c b/dlls/d3dx9_36/tests/effect.c
index 706ae126b8..c72049d553 100644
--- a/dlls/d3dx9_36/tests/effect.c
+++ b/dlls/d3dx9_36/tests/effect.c
@@ -8079,7 +8079,7 @@ static void test_effect_parameter_block(void)
ok(refcount == 1, "Got unexpected refcount %u.\n", refcount);
hr = effect->lpVtbl->ApplyParameterBlock(effect, block);
- todo_wine ok(hr == D3DERR_INVALIDCALL, "Got unexpected hr %#x.\n", hr);
+ ok(hr == D3DERR_INVALIDCALL, "Got unexpected hr %#x.\n", hr);
hr = effect->lpVtbl->DeleteParameterBlock(effect, block);
ok(hr == D3D_OK, "Got result %#x.\n", hr);
@@ -8092,7 +8092,7 @@ static void test_effect_parameter_block(void)
block = effect->lpVtbl->EndParameterBlock(effect);
ok(!!block, "Got unexpected block %p.\n", block);
hr = effect->lpVtbl->ApplyParameterBlock(effect, block);
- todo_wine ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
+ ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
hr = effect->lpVtbl->DeleteParameterBlock(effect2, block);
ok(hr == D3DERR_INVALIDCALL, "Got result %#x.\n", hr);
@@ -8100,9 +8100,9 @@ static void test_effect_parameter_block(void)
ok(hr == D3D_OK, "Got result %#x.\n", hr);
hr = effect->lpVtbl->ApplyParameterBlock(effect, NULL);
- todo_wine ok(hr == D3DERR_INVALIDCALL, "Got unexpected hr %#x.\n", hr);
+ ok(hr == D3DERR_INVALIDCALL, "Got unexpected hr %#x.\n", hr);
hr = effect->lpVtbl->ApplyParameterBlock(effect, "parameter_block");
- todo_wine ok(hr == D3DERR_INVALIDCALL, "Got unexpected hr %#x.\n", hr);
+ ok(hr == D3DERR_INVALIDCALL, "Got unexpected hr %#x.\n", hr);
hr = D3DXCreateTexture(device, D3DX_DEFAULT, D3DX_DEFAULT, D3DX_DEFAULT, 0, 0, D3DPOOL_DEFAULT, &texture);
ok(hr == D3D_OK, "Got result %#x, expected 0 (D3D_OK).\n", hr);
@@ -8188,14 +8188,14 @@ static void test_effect_parameter_block(void)
ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
hr = effect->lpVtbl->ApplyParameterBlock(effect, block);
- todo_wine ok(hr == D3D_OK, "Got result %#x.\n", hr);
+ ok(hr == D3D_OK, "Got result %#x.\n", hr);
IDirect3DTexture9_AddRef(texture);
refcount = IDirect3DTexture9_Release(texture);
- todo_wine ok(refcount == 3, "Got unexpected refcount %u.\n", refcount);
+ ok(refcount == 3, "Got unexpected refcount %u.\n", refcount);
hr = effect->lpVtbl->GetFloat(effect, "arr2[0]", &float_value);
- todo_wine ok(hr == D3D_OK && float_value == 92.0f, "Got unexpected hr %#x, float_value %g.\n", hr, float_value);
+ ok(hr == D3D_OK && float_value == 92.0f, "Got unexpected hr %#x, float_value %g.\n", hr, float_value);
hr = effect->lpVtbl->GetFloat(effect, "arr2[1]", &float_value);
ok(hr == D3D_OK && float_value == 0.0f, "Got unexpected hr %#x, float_value %g.\n", hr, float_value);
@@ -8206,16 +8206,16 @@ static void test_effect_parameter_block(void)
hr = effect->lpVtbl->GetMatrix(effect, "m3x2row", &mat);
ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
- todo_wine ok(!memcmp(&mat, &test_mat, sizeof(mat)), "Got unexpected matrix.\n");
+ ok(!memcmp(&mat, &test_mat, sizeof(mat)), "Got unexpected matrix.\n");
hr = effect->lpVtbl->GetMatrix(effect, "m3x2column", &mat);
ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
- todo_wine ok(!memcmp(&mat, &test_mat, sizeof(mat)), "Got unexpected matrix.\n");
+ ok(!memcmp(&mat, &test_mat, sizeof(mat)), "Got unexpected matrix.\n");
hr = effect->lpVtbl->GetFloat(effect, "ts1[0].fv", &float_value);
- todo_wine ok(hr == D3D_OK && float_value == 28.0f, "Got unexpected hr %#x, float_value %g.\n", hr, float_value);
+ ok(hr == D3D_OK && float_value == 28.0f, "Got unexpected hr %#x, float_value %g.\n", hr, float_value);
hr = effect->lpVtbl->GetFloatArray(effect, "ts1[0].v2", float_array, 4);
- todo_wine ok(hr == D3D_OK && float_array[0] == -29.0f
+ ok(hr == D3D_OK && float_array[0] == -29.0f
&& !memcmp(float_array + 1, float_array_zero, 3 * sizeof(*float_array)),
"Got unexpected hr %#x, ts1[0].v2 (%g, %g, %g, %g).\n", hr,
float_array[0], float_array[1], float_array[2], float_array[3]);
@@ -8240,7 +8240,7 @@ static void test_effect_parameter_block(void)
hr = effect->lpVtbl->BeginParameterBlock(effect);
ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
hr = effect->lpVtbl->ApplyParameterBlock(effect, block);
- todo_wine ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
+ ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
hr = effect->lpVtbl->GetFloat(effect, "arr2[0]", &float_value);
ok(hr == D3D_OK && float_value == 0.0f, "Got unexpected hr %#x, float_value %g.\n", hr, float_value);
@@ -8272,10 +8272,10 @@ static void test_effect_parameter_block(void)
ok(!!block2, "Got unexpected block %p.\n", block2);
hr = effect->lpVtbl->ApplyParameterBlock(effect, block2);
- todo_wine ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
+ ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
hr = effect->lpVtbl->GetFloat(effect, "arr2[0]", &float_value);
- todo_wine ok(hr == D3D_OK && float_value == 92.0f, "Got unexpected hr %#x, float_value %g.\n", hr, float_value);
+ ok(hr == D3D_OK && float_value == 92.0f, "Got unexpected hr %#x, float_value %g.\n", hr, float_value);
hr = effect->lpVtbl->GetFloat(effect, "arr2[1]", &float_value);
ok(hr == D3D_OK && float_value == 0.0f, "Got unexpected hr %#x, float_value %g.\n", hr, float_value);
@@ -8286,16 +8286,16 @@ static void test_effect_parameter_block(void)
hr = effect->lpVtbl->GetMatrix(effect, "m3x2row", &mat);
ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
- todo_wine ok(!memcmp(&mat, &test_mat, sizeof(mat)), "Got unexpected matrix.\n");
+ ok(!memcmp(&mat, &test_mat, sizeof(mat)), "Got unexpected matrix.\n");
hr = effect->lpVtbl->GetMatrix(effect, "m3x2column", &mat);
ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
- todo_wine ok(!memcmp(&mat, &test_mat, sizeof(mat)), "Got unexpected matrix.\n");
+ ok(!memcmp(&mat, &test_mat, sizeof(mat)), "Got unexpected matrix.\n");
hr = effect->lpVtbl->GetFloat(effect, "ts1[0].fv", &float_value);
- todo_wine ok(hr == D3D_OK && float_value == 28.0f, "Got unexpected hr %#x, float_value %g.\n", hr, float_value);
+ ok(hr == D3D_OK && float_value == 28.0f, "Got unexpected hr %#x, float_value %g.\n", hr, float_value);
hr = effect->lpVtbl->GetFloatArray(effect, "ts1[0].v2", float_array, 4);
- todo_wine ok(hr == D3D_OK && float_array[0] == -29.0f
+ ok(hr == D3D_OK && float_array[0] == -29.0f
&& !memcmp(float_array + 1, float_array_zero, 3 * sizeof(*float_array)),
"Got unexpected hr %#x, ts1[0].v2 (%g, %g, %g, %g).\n", hr,
float_array[0], float_array[1], float_array[2], float_array[3]);
@@ -8333,11 +8333,11 @@ static void test_effect_parameter_block(void)
hr = effect->lpVtbl->SetMatrixArray(effect, "f33_2", mat_arr, 2);
ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
hr = effect->lpVtbl->ApplyParameterBlock(effect, block);
- todo_wine ok(hr == D3D_OK, "Got result %#x.\n", hr);
+ ok(hr == D3D_OK, "Got result %#x.\n", hr);
hr = effect->lpVtbl->GetMatrixArray(effect, "f33_2", mat_arr, 2);
ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
- todo_wine ok(!memcmp(&mat_arr[0], &test_mat, sizeof(test_mat))
+ ok(!memcmp(&mat_arr[0], &test_mat, sizeof(test_mat))
&& !memcmp(&mat_arr[1], &test_mat, sizeof(test_mat)), "Got unexpected matrix array.\n");
refcount = effect->lpVtbl->Release(effect);
--
2.23.0
1
0