Added mailing list patchset

This commit is contained in:
Alistair Leslie-Hughes
2019-07-11 08:58:48 +10:00
parent e0bf5ac738
commit 5ed9211eab
28 changed files with 2129 additions and 33 deletions

View File

@@ -0,0 +1,2 @@
Fixes: Fixes compile warnings.
Depends: mailing-list-patches

View File

@@ -0,0 +1,67 @@
From c7768e2ba1a86ba18c78115f2e6306dd2e08abf1 Mon Sep 17 00:00:00 2001
From: Zebediah Figura <z.figura12@gmail.com>
Date: Thu, 27 Jun 2019 22:30:12 -0500
Subject: [PATCH] winebus.inf: Add new INF file and copy it to the INF
directory.
Signed-off-by: Zebediah Figura <z.figura12@gmail.com>
---
loader/Makefile.in | 1 +
loader/wine.inf.in | 1 +
loader/winebus.inf.in | 22 ++++++++++++++++++++++
3 files changed, 24 insertions(+)
create mode 100644 loader/winebus.inf.in
diff --git a/loader/Makefile.in b/loader/Makefile.in
index 3ada656408..11a476103c 100644
--- a/loader/Makefile.in
+++ b/loader/Makefile.in
@@ -10,6 +10,7 @@ SOURCES = \
wine.man.in \
wine.pl.UTF-8.man.in \
wine_info.plist.in \
+ winebus.inf.in \
winehid.inf.in
PROGRAMS = $(WINELOADER_PROGRAMS)
diff --git a/loader/wine.inf.in b/loader/wine.inf.in
index c3d3b770b5..63f8cb064e 100644
--- a/loader/wine.inf.in
+++ b/loader/wine.inf.in
@@ -3691,4 +3691,5 @@ inf_section = 17
l_intl.nls
[inf_section]
+winebus.inf
winehid.inf
diff --git a/loader/winebus.inf.in b/loader/winebus.inf.in
new file mode 100644
index 0000000000..3950c3dfc4
--- /dev/null
+++ b/loader/winebus.inf.in
@@ -0,0 +1,22 @@
+[Version]
+Signature="$CHICAGO$"
+ClassGuid={4d36e97d-e325-11ce-bfc1-08002be10318}
+Class=System
+
+[Manufacturer]
+Wine=mfg_section
+
+[mfg_section]
+Wine HID bus driver=device_section,root\winebus
+
+[device_section.Services]
+AddService = winebus,0x2,svc_section
+
+[svc_section]
+Description="Wine HID bus driver"
+DisplayName="Wine HID bus"
+ServiceBinary="%12%\winebus.sys"
+LoadOrderGroup="WinePlugPlay"
+ServiceType=1
+StartType=3
+ErrorControl=1
--
2.17.1

View File

@@ -0,0 +1,127 @@
From f80abf3ac3b0ddc4937a50217c654af38a839560 Mon Sep 17 00:00:00 2001
From: Zebediah Figura <z.figura12@gmail.com>
Date: Thu, 27 Jun 2019 22:30:13 -0500
Subject: [PATCH] winebus.sys: Implement AddDevice().
Signed-off-by: Zebediah Figura <z.figura12@gmail.com>
---
dlls/winebus.sys/main.c | 66 ++++++++++++++++++++++++++++++++++++++++-
1 file changed, 65 insertions(+), 1 deletion(-)
diff --git a/dlls/winebus.sys/main.c b/dlls/winebus.sys/main.c
index 89ea65bba6..d9ceb83760 100644
--- a/dlls/winebus.sys/main.c
+++ b/dlls/winebus.sys/main.c
@@ -69,8 +69,12 @@ static const WORD PID_XBOX_CONTROLLERS[] = {
static DRIVER_OBJECT *driver_obj;
+
static DEVICE_OBJECT *mouse_obj;
+/* The root-enumerated device stack. */
+static DEVICE_OBJECT *bus_pdo, *bus_fdo;
+
HANDLE driver_key;
struct pnp_device
@@ -469,7 +473,33 @@ static NTSTATUS handle_IRP_MN_QUERY_ID(DEVICE_OBJECT *device, IRP *irp)
return status;
}
-static NTSTATUS WINAPI common_pnp_dispatch(DEVICE_OBJECT *device, IRP *irp)
+static NTSTATUS fdo_pnp_dispatch(DEVICE_OBJECT *device, IRP *irp)
+{
+ IO_STACK_LOCATION *irpsp = IoGetCurrentIrpStackLocation(irp);
+ NTSTATUS ret;
+
+ switch (irpsp->MinorFunction)
+ {
+ case IRP_MN_START_DEVICE:
+ case IRP_MN_SURPRISE_REMOVAL:
+ irp->IoStatus.u.Status = STATUS_SUCCESS;
+ break;
+ case IRP_MN_REMOVE_DEVICE:
+ irp->IoStatus.u.Status = STATUS_SUCCESS;
+ IoSkipCurrentIrpStackLocation(irp);
+ ret = IoCallDriver(bus_pdo, irp);
+ IoDetachDevice(bus_pdo);
+ IoDeleteDevice(device);
+ return ret;
+ default:
+ FIXME("Unhandled minor function %#x.\n", irpsp->MinorFunction);
+ }
+
+ IoSkipCurrentIrpStackLocation(irp);
+ return IoCallDriver(bus_pdo, irp);
+}
+
+static NTSTATUS pdo_pnp_dispatch(DEVICE_OBJECT *device, IRP *irp)
{
NTSTATUS status = irp->IoStatus.u.Status;
IO_STACK_LOCATION *irpsp = IoGetCurrentIrpStackLocation(irp);
@@ -498,6 +528,13 @@ static NTSTATUS WINAPI common_pnp_dispatch(DEVICE_OBJECT *device, IRP *irp)
return status;
}
+static NTSTATUS WINAPI common_pnp_dispatch(DEVICE_OBJECT *device, IRP *irp)
+{
+ if (device == bus_fdo)
+ return fdo_pnp_dispatch(device, irp);
+ return pdo_pnp_dispatch(device, irp);
+}
+
static NTSTATUS deliver_last_report(struct device_extension *ext, DWORD buffer_length, BYTE* buffer, ULONG_PTR *out_length)
{
if (buffer_length < ext->last_report_size)
@@ -522,6 +559,12 @@ static NTSTATUS WINAPI hid_internal_dispatch(DEVICE_OBJECT *device, IRP *irp)
TRACE("(%p, %p)\n", device, irp);
+ if (device == bus_fdo)
+ {
+ IoSkipCurrentIrpStackLocation(irp);
+ return IoCallDriver(bus_pdo, irp);
+ }
+
switch (irpsp->Parameters.DeviceIoControl.IoControlCode)
{
case IOCTL_HID_GET_DEVICE_ATTRIBUTES:
@@ -764,6 +807,26 @@ BOOL is_xbox_gamepad(WORD vid, WORD pid)
return FALSE;
}
+static NTSTATUS WINAPI driver_add_device(DRIVER_OBJECT *driver, DEVICE_OBJECT *pdo)
+{
+ NTSTATUS ret;
+
+ TRACE("driver %p, pdo %p.\n", driver, pdo);
+
+ if ((ret = IoCreateDevice(driver, 0, NULL, FILE_DEVICE_BUS_EXTENDER, 0, FALSE, &bus_fdo)))
+ {
+ ERR("Failed to create FDO, status %#x.\n", ret);
+ return ret;
+ }
+
+ IoAttachDeviceToDeviceStack(bus_fdo, pdo);
+ bus_pdo = pdo;
+
+ bus_fdo->Flags &= ~DO_DEVICE_INITIALIZING;
+
+ return STATUS_SUCCESS;
+}
+
static void WINAPI driver_unload(DRIVER_OBJECT *driver)
{
udev_driver_unload();
@@ -861,6 +924,7 @@ NTSTATUS WINAPI DriverEntry( DRIVER_OBJECT *driver, UNICODE_STRING *path )
driver->MajorFunction[IRP_MJ_PNP] = common_pnp_dispatch;
driver->MajorFunction[IRP_MJ_INTERNAL_DEVICE_CONTROL] = hid_internal_dispatch;
+ driver->DriverExtension->AddDevice = driver_add_device;
driver->DriverUnload = driver_unload;
mouse_device_create();
--
2.17.1

View File

@@ -0,0 +1,108 @@
From 34c20aa62799b2e08cb751d040a4f1cc3b0b6894 Mon Sep 17 00:00:00 2001
From: Zebediah Figura <z.figura12@gmail.com>
Date: Thu, 27 Jun 2019 22:30:14 -0500
Subject: [PATCH] wineboot: Create a root-enumerated device object for winebus.
Signed-off-by: Zebediah Figura <z.figura12@gmail.com>
---
programs/wineboot/Makefile.in | 2 +-
programs/wineboot/wineboot.c | 56 +++++++++++++++++++++++++++++++++++
2 files changed, 57 insertions(+), 1 deletion(-)
diff --git a/programs/wineboot/Makefile.in b/programs/wineboot/Makefile.in
index eaea154057..3921fa9644 100644
--- a/programs/wineboot/Makefile.in
+++ b/programs/wineboot/Makefile.in
@@ -1,7 +1,7 @@
MODULE = wineboot.exe
APPMODE = -mconsole
IMPORTS = uuid advapi32
-DELAYIMPORTS = shell32 shlwapi version user32
+DELAYIMPORTS = shell32 shlwapi version user32 setupapi newdev
EXTRADLLFLAGS = -mno-cygwin
diff --git a/programs/wineboot/wineboot.c b/programs/wineboot/wineboot.c
index 55f2c6ca0c..5190dcc701 100644
--- a/programs/wineboot/wineboot.c
+++ b/programs/wineboot/wineboot.c
@@ -69,6 +69,8 @@
#include <shobjidl.h>
#include <shlwapi.h>
#include <shellapi.h>
+#include <setupapi.h>
+#include <newdev.h>
#include "resource.h"
WINE_DEFAULT_DEBUG_CHANNEL(wineboot);
@@ -1116,6 +1118,57 @@ static HANDLE start_rundll32( const WCHAR *inf_path, BOOL wow64 )
return pi.hProcess;
}
+static void install_root_pnp_devices(void)
+{
+ static const struct
+ {
+ const char *name;
+ const char *hardware_id;
+ const char *infpath;
+ }
+ root_devices[] =
+ {
+ {"root\\wine\\winebus", "root\\winebus\0", "C:\\windows\\inf\\winebus.inf"},
+ };
+ SP_DEVINFO_DATA device = {sizeof(device)};
+ unsigned int i;
+ HDEVINFO set;
+
+ if ((set = SetupDiCreateDeviceInfoList( NULL, NULL )) == INVALID_HANDLE_VALUE)
+ {
+ WINE_ERR("Failed to create device info list, error %#x.\n", GetLastError());
+ return;
+ }
+
+ for (i = 0; i < ARRAY_SIZE(root_devices); ++i)
+ {
+ if (!SetupDiCreateDeviceInfoA( set, root_devices[i].name, &GUID_NULL, NULL, NULL, 0, &device))
+ {
+ if (GetLastError() != ERROR_DEVINST_ALREADY_EXISTS)
+ WINE_ERR("Failed to create device %s, error %#x.\n", debugstr_a(root_devices[i].name), GetLastError());
+ continue;
+ }
+
+ if (!SetupDiSetDeviceRegistryPropertyA(set, &device, SPDRP_HARDWAREID,
+ (const BYTE *)root_devices[i].hardware_id, (strlen(root_devices[i].hardware_id) + 2) * sizeof(WCHAR)))
+ {
+ WINE_ERR("Failed to set hardware id for %s, error %#x.\n", debugstr_a(root_devices[i].name), GetLastError());
+ continue;
+ }
+
+ if (!SetupDiCallClassInstaller(DIF_REGISTERDEVICE, set, &device))
+ {
+ WINE_ERR("Failed to register device %s, error %#x.\n", debugstr_a(root_devices[i].name), GetLastError());
+ continue;
+ }
+
+ if (!UpdateDriverForPlugAndPlayDevicesA(NULL, root_devices[i].hardware_id, root_devices[i].infpath, 0, NULL))
+ WINE_ERR("Failed to install drivers for %s, error %#x.\n", debugstr_a(root_devices[i].name), GetLastError());
+ }
+
+ SetupDiDestroyDeviceInfoList(set);
+}
+
/* execute rundll32 on the wine.inf file if necessary */
static void update_wineprefix( BOOL force )
{
@@ -1159,6 +1212,9 @@ static void update_wineprefix( BOOL force )
}
DestroyWindow( hwnd );
}
+
+ install_root_pnp_devices();
+
WINE_MESSAGE( "wine: configuration in '%s' has been updated.\n", prettyprint_configdir() );
}
--
2.17.1

View File

@@ -0,0 +1,85 @@
From cf2328c46895754b40bf6017d2c300f7a153d0c4 Mon Sep 17 00:00:00 2001
From: Zebediah Figura <z.figura12@gmail.com>
Date: Thu, 27 Jun 2019 22:30:16 -0500
Subject: [PATCH] winebus.sys: Initialize and teardown the HID backends while
the bus FDO is still extant.
Signed-off-by: Zebediah Figura <z.figura12@gmail.com>
---
dlls/winebus.sys/main.c | 30 +++++++++++++++---------------
1 file changed, 15 insertions(+), 15 deletions(-)
diff --git a/dlls/winebus.sys/main.c b/dlls/winebus.sys/main.c
index d9ceb83760..b96e38c538 100644
--- a/dlls/winebus.sys/main.c
+++ b/dlls/winebus.sys/main.c
@@ -475,16 +475,31 @@ static NTSTATUS handle_IRP_MN_QUERY_ID(DEVICE_OBJECT *device, IRP *irp)
static NTSTATUS fdo_pnp_dispatch(DEVICE_OBJECT *device, IRP *irp)
{
+ static const WCHAR SDL_enabledW[] = {'E','n','a','b','l','e',' ','S','D','L',0};
+ static const UNICODE_STRING SDL_enabled = {sizeof(SDL_enabledW) - sizeof(WCHAR), sizeof(SDL_enabledW), (WCHAR*)SDL_enabledW};
IO_STACK_LOCATION *irpsp = IoGetCurrentIrpStackLocation(irp);
NTSTATUS ret;
switch (irpsp->MinorFunction)
{
case IRP_MN_START_DEVICE:
+ if (check_bus_option(&SDL_enabled, 1))
+ {
+ if (sdl_driver_init() == STATUS_SUCCESS)
+ return STATUS_SUCCESS;
+ }
+ udev_driver_init();
+ iohid_driver_init();
+ irp->IoStatus.u.Status = STATUS_SUCCESS;
+ break;
case IRP_MN_SURPRISE_REMOVAL:
irp->IoStatus.u.Status = STATUS_SUCCESS;
break;
case IRP_MN_REMOVE_DEVICE:
+ udev_driver_unload();
+ iohid_driver_unload();
+ sdl_driver_unload();
+
irp->IoStatus.u.Status = STATUS_SUCCESS;
IoSkipCurrentIrpStackLocation(irp);
ret = IoCallDriver(bus_pdo, irp);
@@ -829,9 +844,6 @@ static NTSTATUS WINAPI driver_add_device(DRIVER_OBJECT *driver, DEVICE_OBJECT *p
static void WINAPI driver_unload(DRIVER_OBJECT *driver)
{
- udev_driver_unload();
- iohid_driver_unload();
- sdl_driver_unload();
NtClose(driver_key);
}
@@ -907,8 +919,6 @@ static void mouse_device_create(void)
NTSTATUS WINAPI DriverEntry( DRIVER_OBJECT *driver, UNICODE_STRING *path )
{
- static const WCHAR SDL_enabledW[] = {'E','n','a','b','l','e',' ','S','D','L',0};
- static const UNICODE_STRING SDL_enabled = {sizeof(SDL_enabledW) - sizeof(WCHAR), sizeof(SDL_enabledW), (WCHAR*)SDL_enabledW};
OBJECT_ATTRIBUTES attr = {0};
NTSTATUS ret;
@@ -927,15 +937,5 @@ NTSTATUS WINAPI DriverEntry( DRIVER_OBJECT *driver, UNICODE_STRING *path )
driver->DriverExtension->AddDevice = driver_add_device;
driver->DriverUnload = driver_unload;
- mouse_device_create();
-
- if (check_bus_option(&SDL_enabled, 1))
- {
- if (sdl_driver_init() == STATUS_SUCCESS)
- return STATUS_SUCCESS;
- }
- udev_driver_init();
- iohid_driver_init();
-
return STATUS_SUCCESS;
}
--
2.17.1

View File

@@ -0,0 +1,285 @@
From cdc9b0c079ab9001800e97d2b6303f743f8c2175 Mon Sep 17 00:00:00 2001
From: Zebediah Figura <z.figura12@gmail.com>
Date: Thu, 27 Jun 2019 22:30:17 -0500
Subject: [PATCH] ntoskrnl.exe: IoInvalidateDeviceRelations() receives the
parent PDO.
Signed-off-by: Zebediah Figura <z.figura12@gmail.com>
---
dlls/ntoskrnl.exe/ntoskrnl.c | 8 ++-
dlls/ntoskrnl.exe/ntoskrnl_private.h | 6 ++
dlls/ntoskrnl.exe/pnp.c | 86 ++++++++++++++++++++++++----
dlls/winebus.sys/bus.h | 1 +
dlls/winebus.sys/bus_iohid.c | 2 +-
dlls/winebus.sys/bus_sdl.c | 2 +-
dlls/winebus.sys/bus_udev.c | 2 +-
dlls/winebus.sys/main.c | 11 ++--
8 files changed, 97 insertions(+), 21 deletions(-)
diff --git a/dlls/ntoskrnl.exe/ntoskrnl.c b/dlls/ntoskrnl.exe/ntoskrnl.c
index 92f9afab33..620f9572da 100644
--- a/dlls/ntoskrnl.exe/ntoskrnl.c
+++ b/dlls/ntoskrnl.exe/ntoskrnl.c
@@ -1469,6 +1469,7 @@ NTSTATUS WINAPI IoCreateDevice( DRIVER_OBJECT *driver, ULONG ext_size,
{
static const WCHAR auto_format[] = {'\\','D','e','v','i','c','e','\\','%','0','8','x',0};
NTSTATUS status;
+ struct wine_device *wine_device;
DEVICE_OBJECT *device;
HANDLE manager = get_device_manager();
static unsigned int auto_idx = 0;
@@ -1477,11 +1478,12 @@ NTSTATUS WINAPI IoCreateDevice( DRIVER_OBJECT *driver, ULONG ext_size,
TRACE( "(%p, %u, %s, %u, %x, %u, %p)\n",
driver, ext_size, debugstr_us(name), type, characteristics, exclusive, ret_device );
- if (!(device = alloc_kernel_object( IoDeviceObjectType, NULL, sizeof(DEVICE_OBJECT) + ext_size, 1 )))
+ if (!(wine_device = alloc_kernel_object( IoDeviceObjectType, NULL, sizeof(struct wine_device) + ext_size, 1 )))
return STATUS_NO_MEMORY;
+ device = &wine_device->device_obj;
device->DriverObject = driver;
- device->DeviceExtension = device + 1;
+ device->DeviceExtension = wine_device + 1;
device->DeviceType = type;
device->StackSize = 1;
@@ -1547,9 +1549,11 @@ void WINAPI IoDeleteDevice( DEVICE_OBJECT *device )
if (status == STATUS_SUCCESS)
{
+ struct wine_device *wine_device = CONTAINING_RECORD(device, struct wine_device, device_obj);
DEVICE_OBJECT **prev = &device->DriverObject->DeviceObject;
while (*prev && *prev != device) prev = &(*prev)->NextDevice;
if (*prev) *prev = (*prev)->NextDevice;
+ ExFreePool( wine_device->children );
ObDereferenceObject( device );
}
}
diff --git a/dlls/ntoskrnl.exe/ntoskrnl_private.h b/dlls/ntoskrnl.exe/ntoskrnl_private.h
index b5244ef164..256e945e6f 100644
--- a/dlls/ntoskrnl.exe/ntoskrnl_private.h
+++ b/dlls/ntoskrnl.exe/ntoskrnl_private.h
@@ -86,4 +86,10 @@ static const WCHAR servicesW[] = {'\\','R','e','g','i','s','t','r','y',
'\\','C','u','r','r','e','n','t','C','o','n','t','r','o','l','S','e','t',
'\\','S','e','r','v','i','c','e','s',
'\\',0};
+
+struct wine_device
+{
+ DEVICE_OBJECT device_obj;
+ DEVICE_RELATIONS *children;
+};
#endif
diff --git a/dlls/ntoskrnl.exe/pnp.c b/dlls/ntoskrnl.exe/pnp.c
index 30865a05dc..c618885d42 100644
--- a/dlls/ntoskrnl.exe/pnp.c
+++ b/dlls/ntoskrnl.exe/pnp.c
@@ -316,25 +316,18 @@ static void start_device( DEVICE_OBJECT *device, HDEVINFO set, SP_DEVINFO_DATA *
}
}
-static void handle_bus_relations( DEVICE_OBJECT *device )
+static void enumerate_new_device( DEVICE_OBJECT *device, HDEVINFO set )
{
static const WCHAR infpathW[] = {'I','n','f','P','a','t','h',0};
SP_DEVINFO_DATA sp_device = {sizeof(sp_device)};
WCHAR device_instance_id[MAX_DEVICE_ID_LEN];
BOOL need_driver = TRUE;
- HDEVINFO set;
HKEY key;
- /* We could (should?) do a full IRP_MN_QUERY_DEVICE_RELATIONS query,
- * but we don't have to, we have the DEVICE_OBJECT of the new device
- * so we can simply handle the process here */
-
if (get_device_instance_id( device, device_instance_id ))
return;
- set = SetupDiCreateDeviceInfoList( NULL, NULL );
-
if (!SetupDiCreateDeviceInfoW( set, device_instance_id, &GUID_NULL, NULL, NULL, 0, &sp_device )
&& !SetupDiOpenDeviceInfoW( set, device_instance_id, NULL, 0, &sp_device ))
{
@@ -362,19 +355,92 @@ static void handle_bus_relations( DEVICE_OBJECT *device )
}
start_device( device, set, &sp_device );
-
- SetupDiDestroyDeviceInfoList( set );
}
static void remove_device( DEVICE_OBJECT *device )
{
+ struct wine_device *wine_device = CONTAINING_RECORD(device, struct wine_device, device_obj);
+
TRACE("Removing device %p.\n", device);
+ if (wine_device->children)
+ {
+ ULONG i;
+ for (i = 0; i < wine_device->children->Count; ++i)
+ remove_device( wine_device->children->Objects[i] );
+ }
+
send_power_irp( device, PowerDeviceD3 );
send_pnp_irp( device, IRP_MN_SURPRISE_REMOVAL );
send_pnp_irp( device, IRP_MN_REMOVE_DEVICE );
}
+static BOOL device_in_list( const DEVICE_RELATIONS *list, const DEVICE_OBJECT *device )
+{
+ ULONG i;
+ for (i = 0; i < list->Count; ++i)
+ {
+ if (list->Objects[i] == device)
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static void handle_bus_relations( DEVICE_OBJECT *parent )
+{
+ struct wine_device *wine_parent = CONTAINING_RECORD(parent, struct wine_device, device_obj);
+ SP_DEVINFO_DATA sp_device = {sizeof(sp_device)};
+ DEVICE_RELATIONS *relations;
+ IO_STATUS_BLOCK irp_status;
+ IO_STACK_LOCATION *irpsp;
+ NTSTATUS status;
+ HDEVINFO set;
+ IRP *irp;
+ ULONG i;
+
+ TRACE( "(%p)\n", parent );
+
+ set = SetupDiCreateDeviceInfoList( NULL, NULL );
+
+ parent = IoGetAttachedDevice( parent );
+
+ if (!(irp = IoBuildSynchronousFsdRequest( IRP_MJ_PNP, parent, NULL, 0, NULL, NULL, &irp_status )))
+ {
+ SetupDiDestroyDeviceInfoList( set );
+ return;
+ }
+
+ irpsp = IoGetNextIrpStackLocation( irp );
+ irpsp->MinorFunction = IRP_MN_QUERY_DEVICE_RELATIONS;
+ irpsp->Parameters.QueryDeviceRelations.Type = BusRelations;
+ if ((status = send_device_irp( parent, irp, (ULONG_PTR *)&relations )))
+ {
+ ERR("Failed to enumerate child devices, status %#x.\n", status);
+ SetupDiDestroyDeviceInfoList( set );
+ return;
+ }
+
+ TRACE("Got %u devices.\n", relations->Count);
+
+ for (i = 0; i < relations->Count; ++i)
+ {
+ DEVICE_OBJECT *child = relations->Objects[i];
+
+ TRACE("%p, %p\n", wine_parent, wine_parent->children);
+
+ if (!wine_parent->children || !device_in_list( wine_parent->children, child ))
+ {
+ TRACE("Adding new device %p.\n", child);
+ enumerate_new_device( child, set );
+ }
+ }
+
+ ExFreePool( wine_parent->children );
+ wine_parent->children = relations;
+
+ SetupDiDestroyDeviceInfoList( set );
+}
+
/***********************************************************************
* IoInvalidateDeviceRelations (NTOSKRNL.EXE.@)
*/
diff --git a/dlls/winebus.sys/bus.h b/dlls/winebus.sys/bus.h
index de8ddf7ad9..a250878489 100644
--- a/dlls/winebus.sys/bus.h
+++ b/dlls/winebus.sys/bus.h
@@ -54,3 +54,4 @@ DWORD check_bus_option(const UNICODE_STRING *option, DWORD default_value) DECLSP
BOOL is_xbox_gamepad(WORD vid, WORD pid) DECLSPEC_HIDDEN;
HANDLE driver_key DECLSPEC_HIDDEN;
+DEVICE_OBJECT *bus_pdo DECLSPEC_HIDDEN;
diff --git a/dlls/winebus.sys/bus_iohid.c b/dlls/winebus.sys/bus_iohid.c
index 7933374007..e992db8376 100644
--- a/dlls/winebus.sys/bus_iohid.c
+++ b/dlls/winebus.sys/bus_iohid.c
@@ -357,7 +357,7 @@ static void handle_DeviceMatchingCallback(void *context, IOReturn result, void *
struct platform_private *private = impl_from_DEVICE_OBJECT(device);
private->device = IOHIDDevice;
private->buffer = NULL;
- IoInvalidateDeviceRelations(device, BusRelations);
+ IoInvalidateDeviceRelations(bus_pdo, BusRelations);
}
}
diff --git a/dlls/winebus.sys/bus_sdl.c b/dlls/winebus.sys/bus_sdl.c
index d24e21cff8..781deda767 100644
--- a/dlls/winebus.sys/bus_sdl.c
+++ b/dlls/winebus.sys/bus_sdl.c
@@ -988,7 +988,7 @@ static void try_add_device(SDL_JoystickID index)
HeapFree(GetProcessHeap(), 0, serial);
return;
}
- IoInvalidateDeviceRelations(device, BusRelations);
+ IoInvalidateDeviceRelations(bus_pdo, BusRelations);
}
else
{
diff --git a/dlls/winebus.sys/bus_udev.c b/dlls/winebus.sys/bus_udev.c
index 08ad8765af..9a3df9ea6b 100644
--- a/dlls/winebus.sys/bus_udev.c
+++ b/dlls/winebus.sys/bus_udev.c
@@ -1241,7 +1241,7 @@ static void try_add_device(struct udev_device *dev)
return;
}
#endif
- IoInvalidateDeviceRelations(device, BusRelations);
+ IoInvalidateDeviceRelations(bus_pdo, BusRelations);
}
else
{
diff --git a/dlls/winebus.sys/main.c b/dlls/winebus.sys/main.c
index b96e38c538..26200bde3e 100644
--- a/dlls/winebus.sys/main.c
+++ b/dlls/winebus.sys/main.c
@@ -73,7 +73,8 @@ static DRIVER_OBJECT *driver_obj;
static DEVICE_OBJECT *mouse_obj;
/* The root-enumerated device stack. */
-static DEVICE_OBJECT *bus_pdo, *bus_fdo;
+DEVICE_OBJECT *bus_pdo;
+static DEVICE_OBJECT *bus_fdo;
HANDLE driver_key;
@@ -482,6 +483,9 @@ static NTSTATUS fdo_pnp_dispatch(DEVICE_OBJECT *device, IRP *irp)
switch (irpsp->MinorFunction)
{
+ case IRP_MN_QUERY_DEVICE_RELATIONS:
+ irp->IoStatus.u.Status = handle_IRP_MN_QUERY_DEVICE_RELATIONS(irp);
+ break;
case IRP_MN_START_DEVICE:
if (check_bus_option(&SDL_enabled, 1))
{
@@ -521,11 +525,6 @@ static NTSTATUS pdo_pnp_dispatch(DEVICE_OBJECT *device, IRP *irp)
switch (irpsp->MinorFunction)
{
- case IRP_MN_QUERY_DEVICE_RELATIONS:
- TRACE("IRP_MN_QUERY_DEVICE_RELATIONS\n");
- status = handle_IRP_MN_QUERY_DEVICE_RELATIONS(irp);
- irp->IoStatus.u.Status = status;
- break;
case IRP_MN_QUERY_ID:
TRACE("IRP_MN_QUERY_ID\n");
status = handle_IRP_MN_QUERY_ID(device, irp);
--
2.17.1

View File

@@ -0,0 +1,218 @@
From 43d1b91c72b4151422bfd642ddf538f71935a78b Mon Sep 17 00:00:00 2001
From: Dmitry Timoshkov <dmitry@baikal.ru>
Date: Fri, 5 Jul 2019 13:20:23 +0800
Subject: [PATCH] cryptext: Implement CryptExtOpenCER.
Signed-off-by: Dmitry Timoshkov <dmitry@baikal.ru>
---
configure.ac | 1 +
dlls/cryptext/Makefile.in | 3 +-
dlls/cryptext/cryptext.spec | 4 +--
dlls/cryptext/cryptext_main.c | 64 +++++++++++++++++++++++++++++++++
dlls/cryptext/tests/Makefile.in | 4 +++
dlls/cryptext/tests/cryptext.c | 61 +++++++++++++++++++++++++++++++
6 files changed, 134 insertions(+), 3 deletions(-)
create mode 100644 dlls/cryptext/tests/Makefile.in
create mode 100644 dlls/cryptext/tests/cryptext.c
diff --git a/configure.ac b/configure.ac
index a7c45ace73..e801c35c46 100644
--- a/configure.ac
+++ b/configure.ac
@@ -3049,6 +3049,7 @@ WINE_CONFIG_MAKEFILE(dlls/crypt32/tests)
WINE_CONFIG_MAKEFILE(dlls/cryptdlg)
WINE_CONFIG_MAKEFILE(dlls/cryptdll)
WINE_CONFIG_MAKEFILE(dlls/cryptext)
+WINE_CONFIG_MAKEFILE(dlls/cryptext/tests)
WINE_CONFIG_MAKEFILE(dlls/cryptnet)
WINE_CONFIG_MAKEFILE(dlls/cryptnet/tests)
WINE_CONFIG_MAKEFILE(dlls/cryptui)
diff --git a/dlls/cryptext/Makefile.in b/dlls/cryptext/Makefile.in
index 9c9f84cee8..0e817ffda6 100644
--- a/dlls/cryptext/Makefile.in
+++ b/dlls/cryptext/Makefile.in
@@ -1,4 +1,5 @@
-MODULE = cryptext.dll
+MODULE = cryptext.dll
+IMPORTS = crypt32 cryptui user32
EXTRADLLFLAGS = -mno-cygwin
diff --git a/dlls/cryptext/cryptext.spec b/dlls/cryptext/cryptext.spec
index 0dba38e393..911ab2f4ba 100644
--- a/dlls/cryptext/cryptext.spec
+++ b/dlls/cryptext/cryptext.spec
@@ -12,8 +12,8 @@
@ stub CryptExtAddSPCW
@ stub CryptExtOpenCAT
@ stub CryptExtOpenCATW
-@ stub CryptExtOpenCER
-@ stub CryptExtOpenCERW
+@ stdcall CryptExtOpenCER(long ptr str long)
+@ stdcall CryptExtOpenCERW(long ptr wstr long)
@ stub CryptExtOpenCRL
@ stub CryptExtOpenCRLW
@ stub CryptExtOpenCTL
diff --git a/dlls/cryptext/cryptext_main.c b/dlls/cryptext/cryptext_main.c
index f7c7bd1f55..2a381782d6 100644
--- a/dlls/cryptext/cryptext_main.c
+++ b/dlls/cryptext/cryptext_main.c
@@ -22,10 +22,29 @@
#include "windef.h"
#include "winbase.h"
+#include "winnls.h"
+#include "wincrypt.h"
+#include "winuser.h"
+#include "cryptuiapi.h"
+
+#include "wine/heap.h"
#include "wine/debug.h"
WINE_DEFAULT_DEBUG_CHANNEL(cryptext);
+static WCHAR *heap_strdupAtoW(const char *str)
+{
+ WCHAR *ret;
+ INT len;
+
+ if (!str) return NULL;
+ len = MultiByteToWideChar(CP_ACP, 0, str, -1, NULL, 0);
+ ret = heap_alloc(len * sizeof(WCHAR));
+ if (ret)
+ MultiByteToWideChar(CP_ACP, 0, str, -1, ret, len);
+ return ret;
+}
+
BOOL WINAPI DllMain(HINSTANCE instance, DWORD reason, LPVOID reserved)
{
TRACE("(%p, %u, %p)\n", instance, reason, reserved);
@@ -59,3 +78,48 @@ HRESULT WINAPI CryptExtAddPFXW(LPCWSTR filename)
FIXME("stub: %s\n", debugstr_w(filename));
return E_NOTIMPL;
}
+
+/***********************************************************************
+ * CryptExtOpenCERW (CRYPTEXT.@)
+ */
+HRESULT WINAPI CryptExtOpenCERW(HWND hwnd, HINSTANCE hinst, LPCWSTR filename, DWORD showcmd)
+{
+ PCCERT_CONTEXT ctx;
+ CRYPTUI_VIEWCERTIFICATE_STRUCTW info;
+
+ TRACE("(%p, %p, %s, %u)\n", hwnd, hinst, debugstr_w(filename), showcmd);
+
+ if (!CryptQueryObject(CERT_QUERY_OBJECT_FILE, filename, CERT_QUERY_CONTENT_FLAG_CERT,
+ CERT_QUERY_FORMAT_FLAG_ALL, 0, NULL, NULL, NULL, NULL, NULL,
+ (const void **)&ctx))
+ {
+ /* FIXME: move to the resources */
+ static const WCHAR msg[] = {'T','h','i','s',' ','i','s',' ','n','o','t',' ','a',' ','v','a','l','i','d',' ','c','e','r','t','i','f','i','c','a','t','e',0};
+ MessageBoxW(NULL, msg, filename, MB_OK | MB_ICONERROR);
+ return S_OK; /* according to the tests */
+ }
+
+ memset(&info, 0, sizeof(info));
+ info.dwSize = sizeof(info);
+ info.pCertContext = ctx;
+ CryptUIDlgViewCertificateW(&info, NULL);
+ CertFreeCertificateContext(ctx);
+
+ return S_OK;
+}
+
+/***********************************************************************
+ * CryptExtOpenCER (CRYPTEXT.@)
+ */
+HRESULT WINAPI CryptExtOpenCER(HWND hwnd, HINSTANCE hinst, LPCSTR filename, DWORD showcmd)
+{
+ HRESULT hr;
+ LPWSTR filenameW;
+
+ TRACE("(%p, %p, %s, %u)\n", hwnd, hinst, debugstr_a(filename), showcmd);
+
+ filenameW = heap_strdupAtoW(filename);
+ hr = CryptExtOpenCERW(hwnd, hinst, filenameW, showcmd);
+ heap_free(filenameW);
+ return hr;
+}
diff --git a/dlls/cryptext/tests/Makefile.in b/dlls/cryptext/tests/Makefile.in
new file mode 100644
index 0000000000..522fc60a4a
--- /dev/null
+++ b/dlls/cryptext/tests/Makefile.in
@@ -0,0 +1,4 @@
+TESTDLL = cryptext.dll
+
+C_SRCS = \
+ cryptext.c
diff --git a/dlls/cryptext/tests/cryptext.c b/dlls/cryptext/tests/cryptext.c
new file mode 100644
index 0000000000..cc62a772b5
--- /dev/null
+++ b/dlls/cryptext/tests/cryptext.c
@@ -0,0 +1,61 @@
+/*
+ * Copyright 2019 Dmitry Timoshkov
+ *
+ * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#include <stdarg.h>
+#include <assert.h>
+#include <windef.h>
+#include <winbase.h>
+#include <winuser.h>
+#include <winerror.h>
+
+#include "wine/test.h"
+
+static HRESULT (WINAPI *pCryptExtOpenCER)(HWND,HINSTANCE,LPCSTR,DWORD);
+
+static void test_CryptExtOpenCER(void)
+{
+ HRESULT hr;
+
+ if (!pCryptExtOpenCER)
+ {
+ win_skip("CryptExtOpenCER is not available on this platform\n");
+ return;
+ }
+
+ if (!winetest_interactive)
+ {
+ skip("CryptExtOpenCER test needs user interaction\n");
+ return;
+ }
+
+ SetLastError(0xdeadbeef);
+ hr = pCryptExtOpenCER(0, 0, "dead.beef", SW_HIDE);
+ ok(hr == S_OK, "got %#x\n", hr);
+
+ hr = pCryptExtOpenCER(0, 0, "VeriSign Class 3 Public Primary Certification Authority - G4.txt", SW_SHOW);
+ ok(hr == S_OK, "got %#x\n", hr);
+}
+
+START_TEST(cryptext)
+{
+ HMODULE hmod = LoadLibraryA("cryptext.dll");
+
+ pCryptExtOpenCER = (void *)GetProcAddress(hmod, "CryptExtOpenCER");
+
+ test_CryptExtOpenCER();
+}
--
2.17.1

View File

@@ -0,0 +1,48 @@
From d8c945b3d420e284fd4a8eda4879202ace7e712e Mon Sep 17 00:00:00 2001
From: Zhiyi Zhang <zzhang@codeweavers.com>
Date: Mon, 8 Jul 2019 22:15:59 +0800
Subject: [PATCH] dxgi/tests: Test output after using Alt+Enter to switch
fullscreen.
Signed-off-by: Henri Verbeet <hverbeet@codeweavers.com>
Signed-off-by: Zhiyi Zhang <zzhang@codeweavers.com>
---
dlls/dxgi/tests/dxgi.c | 9 +++++++--
1 file changed, 7 insertions(+), 2 deletions(-)
diff --git a/dlls/dxgi/tests/dxgi.c b/dlls/dxgi/tests/dxgi.c
index d8176bb1c0..38aeba17bd 100644
--- a/dlls/dxgi/tests/dxgi.c
+++ b/dlls/dxgi/tests/dxgi.c
@@ -5306,6 +5306,7 @@ static void test_window_association(void)
LONG_PTR original_wndproc, wndproc;
IDXGIFactory *factory, *factory2;
IDXGISwapChain *swapchain;
+ IDXGIOutput *output;
IDXGIAdapter *adapter;
IDXGIDevice *device;
HWND hwnd, hwnd2;
@@ -5449,14 +5450,18 @@ static void test_window_association(void)
PostMessageA(swapchain_desc.OutputWindow, WM_SYSKEYDOWN, VK_RETURN,
(MapVirtualKeyA(VK_RETURN, MAPVK_VK_TO_VSC) << 16) | 0x20000001);
flush_events();
- hr = IDXGISwapChain_GetFullscreenState(swapchain, &fullscreen, NULL);
+ output = NULL;
+ hr = IDXGISwapChain_GetFullscreenState(swapchain, &fullscreen, &output);
ok(hr == S_OK, "Test %u: Got unexpected hr %#x.\n", i, hr);
ok(fullscreen == tests[i].expect_fullscreen
|| broken(tests[i].broken_d3d10 && fullscreen),
"Test %u: Got unexpected fullscreen %#x.\n", i, fullscreen);
+ todo_wine_if(fullscreen) ok(fullscreen ? !!output : !output, "Test %u: Got wrong output.\n", i);
+ if (output)
+ IDXGIOutput_Release(output);
wndproc = GetWindowLongPtrW(swapchain_desc.OutputWindow, GWLP_WNDPROC);
- ok(wndproc == original_wndproc, "Text %u: Got unexpected wndproc %#lx, expected %#lx.\n",
+ ok(wndproc == original_wndproc, "Test %u: Got unexpected wndproc %#lx, expected %#lx.\n",
i, wndproc, original_wndproc);
}
}
--
2.17.1

View File

@@ -0,0 +1,76 @@
From a26681c535b622ef02ae588fa58b86e95b2a581c Mon Sep 17 00:00:00 2001
From: Zhiyi Zhang <zzhang@codeweavers.com>
Date: Mon, 8 Jul 2019 22:16:41 +0800
Subject: [PATCH] dxgi: Fix possible null output from
d3d11_swapchain_GetFullscreenState.
When swapchain is created in windowed mode, and then enter fullscreen
via Alt+Enter. Calling d3d11_swapchain_GetFullscreenState will return
a null output because swapchain->target wasn't initialized.
Signed-off-by: Henri Verbeet <hverbeet@codeweavers.com>
Signed-off-by: Zhiyi Zhang <zzhang@codeweavers.com>
---
dlls/dxgi/swapchain.c | 20 ++++++++++++++++----
dlls/dxgi/tests/dxgi.c | 2 +-
2 files changed, 17 insertions(+), 5 deletions(-)
diff --git a/dlls/dxgi/swapchain.c b/dlls/dxgi/swapchain.c
index 8dbbfab805..caf0863609 100644
--- a/dlls/dxgi/swapchain.c
+++ b/dlls/dxgi/swapchain.c
@@ -407,22 +407,34 @@ static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetFullscreenState(IDXGISwapCha
{
struct d3d11_swapchain *swapchain = d3d11_swapchain_from_IDXGISwapChain1(iface);
struct wined3d_swapchain_desc swapchain_desc;
+ HRESULT hr;
TRACE("iface %p, fullscreen %p, target %p.\n", iface, fullscreen, target);
- if (fullscreen)
+ if (fullscreen || target)
{
wined3d_mutex_lock();
wined3d_swapchain_get_desc(swapchain->wined3d_swapchain, &swapchain_desc);
wined3d_mutex_unlock();
- *fullscreen = !swapchain_desc.windowed;
}
+ if (fullscreen)
+ *fullscreen = !swapchain_desc.windowed;
+
if (target)
{
- *target = swapchain->target;
- if (*target)
+ if (!swapchain_desc.windowed)
+ {
+ if (!swapchain->target && FAILED(hr = IDXGISwapChain1_GetContainingOutput(iface, &swapchain->target)))
+ return hr;
+
+ *target = swapchain->target;
IDXGIOutput_AddRef(*target);
+ }
+ else
+ {
+ *target = NULL;
+ }
}
return S_OK;
diff --git a/dlls/dxgi/tests/dxgi.c b/dlls/dxgi/tests/dxgi.c
index 38aeba17bd..ab33caf2e2 100644
--- a/dlls/dxgi/tests/dxgi.c
+++ b/dlls/dxgi/tests/dxgi.c
@@ -5456,7 +5456,7 @@ static void test_window_association(void)
ok(fullscreen == tests[i].expect_fullscreen
|| broken(tests[i].broken_d3d10 && fullscreen),
"Test %u: Got unexpected fullscreen %#x.\n", i, fullscreen);
- todo_wine_if(fullscreen) ok(fullscreen ? !!output : !output, "Test %u: Got wrong output.\n", i);
+ ok(fullscreen ? !!output : !output, "Test %u: Got wrong output.\n", i);
if (output)
IDXGIOutput_Release(output);
--
2.17.1

View File

@@ -0,0 +1,61 @@
From 0dd59c5e94d27a1d16a85807c03ff6f54bb55fbc Mon Sep 17 00:00:00 2001
From: Jeff Smith <whydoubt@gmail.com>
Date: Mon, 8 Jul 2019 10:19:43 -0500
Subject: [PATCH] d3drm: Check for NULL pointer in d3drm_viewport2_GetDevice().
Signed-off-by: Henri Verbeet <hverbeet@codeweavers.com>
Signed-off-by: Jeff Smith <whydoubt@gmail.com>
---
dlls/d3drm/tests/d3drm.c | 4 ++++
dlls/d3drm/viewport.c | 6 ++++++
2 files changed, 10 insertions(+)
diff --git a/dlls/d3drm/tests/d3drm.c b/dlls/d3drm/tests/d3drm.c
index 86678193ba..67696d5583 100644
--- a/dlls/d3drm/tests/d3drm.c
+++ b/dlls/d3drm/tests/d3drm.c
@@ -2153,6 +2153,8 @@ static void test_Viewport(void)
hr = IDirect3DRMViewport_Init(viewport, device1, frame, rc.left, rc.top, rc.right, rc.bottom);
ok(hr == D3DRMERR_BADOBJECT, "Expected hr == D3DRMERR_BADOBJECT, got %#x.\n", hr);
+ hr = IDirect3DRMViewport_GetDevice(viewport, NULL);
+ ok(hr == D3DRMERR_BADVALUE, "Expected hr == D3DRMERR_BADVALUE, got %#x.\n", hr);
IDirect3DRMViewport_Release(viewport);
ref4 = get_refcount((IUnknown *)d3drm1);
@@ -2241,6 +2243,8 @@ static void test_Viewport(void)
hr = IDirect3DRMViewport2_Init(viewport2, device3, frame3, rc.left, rc.top, rc.right, rc.bottom);
ok(hr == D3DRMERR_BADOBJECT, "Expected hr == D3DRMERR_BADOBJECT, got %#x.\n", hr);
+ hr = IDirect3DRMViewport2_GetDevice(viewport2, NULL);
+ ok(hr == D3DRMERR_BADVALUE, "Expected hr == D3DRMERR_BADVALUE, got %#x.\n", hr);
IDirect3DRMViewport2_Release(viewport2);
ref4 = get_refcount((IUnknown *)d3drm1);
diff --git a/dlls/d3drm/viewport.c b/dlls/d3drm/viewport.c
index 51174cd59e..d049f37213 100644
--- a/dlls/d3drm/viewport.c
+++ b/dlls/d3drm/viewport.c
@@ -683,6 +683,9 @@ static HRESULT WINAPI d3drm_viewport2_GetDevice(IDirect3DRMViewport2 *iface, IDi
TRACE("iface %p, device %p.\n", iface, device);
+ if (!device)
+ return D3DRMERR_BADVALUE;
+
if (!viewport->device)
return D3DRMERR_BADOBJECT;
@@ -698,6 +701,9 @@ static HRESULT WINAPI d3drm_viewport1_GetDevice(IDirect3DRMViewport *iface, IDir
TRACE("iface %p, device %p.\n\n", iface, device);
+ if (!device)
+ return D3DRMERR_BADVALUE;
+
if (!viewport->device)
return D3DRMERR_BADOBJECT;
--
2.17.1

View File

@@ -0,0 +1,52 @@
From 7ba4285719eb9592437ff0b4481f89238b035064 Mon Sep 17 00:00:00 2001
From: Jeff Smith <whydoubt@gmail.com>
Date: Mon, 8 Jul 2019 10:19:44 -0500
Subject: [PATCH] d3drm: Check for NULL pointer in
d3drm_viewport2_GetDirect3DViewport().
Signed-off-by: Henri Verbeet <hverbeet@codeweavers.com>
Signed-off-by: Jeff Smith <whydoubt@gmail.com>
---
dlls/d3drm/tests/d3drm.c | 4 ++++
dlls/d3drm/viewport.c | 3 +++
2 files changed, 7 insertions(+)
diff --git a/dlls/d3drm/tests/d3drm.c b/dlls/d3drm/tests/d3drm.c
index 67696d5583..88f3db819d 100644
--- a/dlls/d3drm/tests/d3drm.c
+++ b/dlls/d3drm/tests/d3drm.c
@@ -2155,6 +2155,8 @@ static void test_Viewport(void)
ok(hr == D3DRMERR_BADOBJECT, "Expected hr == D3DRMERR_BADOBJECT, got %#x.\n", hr);
hr = IDirect3DRMViewport_GetDevice(viewport, NULL);
ok(hr == D3DRMERR_BADVALUE, "Expected hr == D3DRMERR_BADVALUE, got %#x.\n", hr);
+ hr = IDirect3DRMViewport_GetDirect3DViewport(viewport, NULL);
+ ok(hr == D3DRMERR_BADVALUE, "Expected hr == D3DRMERR_BADVALUE, got %#x.\n", hr);
IDirect3DRMViewport_Release(viewport);
ref4 = get_refcount((IUnknown *)d3drm1);
@@ -2245,6 +2247,8 @@ static void test_Viewport(void)
ok(hr == D3DRMERR_BADOBJECT, "Expected hr == D3DRMERR_BADOBJECT, got %#x.\n", hr);
hr = IDirect3DRMViewport2_GetDevice(viewport2, NULL);
ok(hr == D3DRMERR_BADVALUE, "Expected hr == D3DRMERR_BADVALUE, got %#x.\n", hr);
+ hr = IDirect3DRMViewport2_GetDirect3DViewport(viewport2, NULL);
+ ok(hr == D3DRMERR_BADVALUE, "Expected hr == D3DRMERR_BADVALUE, got %#x.\n", hr);
IDirect3DRMViewport2_Release(viewport2);
ref4 = get_refcount((IUnknown *)d3drm1);
diff --git a/dlls/d3drm/viewport.c b/dlls/d3drm/viewport.c
index d049f37213..430c9d470b 100644
--- a/dlls/d3drm/viewport.c
+++ b/dlls/d3drm/viewport.c
@@ -896,6 +896,9 @@ static HRESULT WINAPI d3drm_viewport2_GetDirect3DViewport(IDirect3DRMViewport2 *
TRACE("iface %p, viewport %p.\n", iface, viewport);
+ if (!viewport)
+ return D3DRMERR_BADVALUE;
+
if (!viewport_object->d3d_viewport)
return D3DRMERR_BADOBJECT;
--
2.17.1

View File

@@ -0,0 +1,56 @@
From e12b2ca2f2ff5fdcc93a310c5391210f71c90e5a Mon Sep 17 00:00:00 2001
From: Jeff Smith <whydoubt@gmail.com>
Date: Mon, 8 Jul 2019 10:19:45 -0500
Subject: [PATCH] d3drm: Return error if setting viewport field-of-view to zero
or negative value.
Signed-off-by: Henri Verbeet <hverbeet@codeweavers.com>
Signed-off-by: Jeff Smith <whydoubt@gmail.com>
---
dlls/d3drm/tests/d3drm.c | 8 ++++++++
dlls/d3drm/viewport.c | 3 +++
2 files changed, 11 insertions(+)
diff --git a/dlls/d3drm/tests/d3drm.c b/dlls/d3drm/tests/d3drm.c
index 88f3db819d..dbba859215 100644
--- a/dlls/d3drm/tests/d3drm.c
+++ b/dlls/d3drm/tests/d3drm.c
@@ -2157,6 +2157,10 @@ static void test_Viewport(void)
ok(hr == D3DRMERR_BADVALUE, "Expected hr == D3DRMERR_BADVALUE, got %#x.\n", hr);
hr = IDirect3DRMViewport_GetDirect3DViewport(viewport, NULL);
ok(hr == D3DRMERR_BADVALUE, "Expected hr == D3DRMERR_BADVALUE, got %#x.\n", hr);
+ hr = IDirect3DRMViewport_SetField(viewport, 0.0f);
+ ok(hr == D3DRMERR_BADVALUE, "Expected hr == D3DRMERR_BADVALUE, got %#x.\n", hr);
+ hr = IDirect3DRMViewport_SetField(viewport, -1.0f);
+ ok(hr == D3DRMERR_BADVALUE, "Expected hr == D3DRMERR_BADVALUE, got %#x.\n", hr);
IDirect3DRMViewport_Release(viewport);
ref4 = get_refcount((IUnknown *)d3drm1);
@@ -2249,6 +2253,10 @@ static void test_Viewport(void)
ok(hr == D3DRMERR_BADVALUE, "Expected hr == D3DRMERR_BADVALUE, got %#x.\n", hr);
hr = IDirect3DRMViewport2_GetDirect3DViewport(viewport2, NULL);
ok(hr == D3DRMERR_BADVALUE, "Expected hr == D3DRMERR_BADVALUE, got %#x.\n", hr);
+ hr = IDirect3DRMViewport2_SetField(viewport2, 0.0f);
+ ok(hr == D3DRMERR_BADVALUE, "Expected hr == D3DRMERR_BADVALUE, got %#x.\n", hr);
+ hr = IDirect3DRMViewport2_SetField(viewport2, -1.0f);
+ ok(hr == D3DRMERR_BADVALUE, "Expected hr == D3DRMERR_BADVALUE, got %#x.\n", hr);
IDirect3DRMViewport2_Release(viewport2);
ref4 = get_refcount((IUnknown *)d3drm1);
diff --git a/dlls/d3drm/viewport.c b/dlls/d3drm/viewport.c
index 430c9d470b..c2fa189742 100644
--- a/dlls/d3drm/viewport.c
+++ b/dlls/d3drm/viewport.c
@@ -523,6 +523,9 @@ static HRESULT WINAPI d3drm_viewport2_SetField(IDirect3DRMViewport2 *iface, D3DV
TRACE("iface %p, field %.8e.\n", iface, field);
+ if (field <= 0.0f)
+ return D3DRMERR_BADVALUE;
+
viewport->field = field;
return D3DRM_OK;
--
2.17.1

View File

@@ -0,0 +1,25 @@
From 616ad4e053abdc48810064993caef067a3452587 Mon Sep 17 00:00:00 2001
From: Zebediah Figura <zfigura@codeweavers.com>
Date: Mon, 8 Jul 2019 11:24:39 -0500
Subject: [PATCH] strmbase: Remove unused wine/unicode.h import.
Signed-off-by: Zebediah Figura <zfigura@codeweavers.com>
---
dlls/strmbase/strmbase_private.h | 1 -
1 file changed, 1 deletion(-)
diff --git a/dlls/strmbase/strmbase_private.h b/dlls/strmbase/strmbase_private.h
index 439ab9aefa..06fbe62a42 100644
--- a/dlls/strmbase/strmbase_private.h
+++ b/dlls/strmbase/strmbase_private.h
@@ -31,7 +31,6 @@
#include "wine/heap.h"
#include "wine/list.h"
#include "wine/strmbase.h"
-#include "wine/unicode.h"
/* Quality Control */
typedef struct QualityControlImpl {
--
2.17.1

View File

@@ -0,0 +1,26 @@
From b263d3d0958c18b2b8f105b87c27f9cbee176503 Mon Sep 17 00:00:00 2001
From: Zebediah Figura <zfigura@codeweavers.com>
Date: Mon, 8 Jul 2019 11:24:43 -0500
Subject: [PATCH] qedit: Build with msvcrt.
Signed-off-by: Zebediah Figura <zfigura@codeweavers.com>
---
dlls/qedit/Makefile.in | 2 ++
1 file changed, 2 insertions(+)
diff --git a/dlls/qedit/Makefile.in b/dlls/qedit/Makefile.in
index b47ee260ab..4891328c7a 100644
--- a/dlls/qedit/Makefile.in
+++ b/dlls/qedit/Makefile.in
@@ -1,6 +1,8 @@
MODULE = qedit.dll
IMPORTS = strmiids strmbase uuid oleaut32 ole32 advapi32
+EXTRADLLFLAGS = -mno-cygwin
+
C_SRCS = \
main.c \
mediadet.c \
--
2.17.1

View File

@@ -0,0 +1,40 @@
From 4018f0ee2e502ded20bc907e3baa47ca348a61b8 Mon Sep 17 00:00:00 2001
From: Zebediah Figura <zfigura@codeweavers.com>
Date: Mon, 8 Jul 2019 11:24:42 -0500
Subject: [PATCH] qedit: Share source with strmbase.
Signed-off-by: Zebediah Figura <zfigura@codeweavers.com>
---
dlls/qedit/Makefile.in | 11 ++++++++++-
1 file changed, 10 insertions(+), 1 deletion(-)
diff --git a/dlls/qedit/Makefile.in b/dlls/qedit/Makefile.in
index 4891328c7a..c5bf8f9cac 100644
--- a/dlls/qedit/Makefile.in
+++ b/dlls/qedit/Makefile.in
@@ -1,12 +1,21 @@
MODULE = qedit.dll
-IMPORTS = strmiids strmbase uuid oleaut32 ole32 advapi32
+IMPORTS = strmiids uuid oleaut32 ole32 advapi32
+PARENTSRC = ../strmbase
EXTRADLLFLAGS = -mno-cygwin
C_SRCS = \
+ dispatch.c \
+ enumpins.c \
+ filter.c \
main.c \
mediadet.c \
+ mediatype.c \
nullrenderer.c \
+ pin.c \
+ pospass.c \
+ qualitycontrol.c \
+ renderer.c \
samplegrabber.c \
timeline.c
--
2.17.1

View File

@@ -0,0 +1,53 @@
From 4b3eebfae7a5a03f3c1644c65d5f1c00af0c4ae3 Mon Sep 17 00:00:00 2001
From: Zebediah Figura <zfigura@codeweavers.com>
Date: Mon, 8 Jul 2019 11:24:41 -0500
Subject: [PATCH] evr: Build with msvcrt.
Signed-off-by: Zebediah Figura <zfigura@codeweavers.com>
---
dlls/evr/Makefile.in | 2 ++
dlls/evr/evr.c | 1 -
dlls/evr/main.c | 2 --
3 files changed, 2 insertions(+), 3 deletions(-)
diff --git a/dlls/evr/Makefile.in b/dlls/evr/Makefile.in
index dc7989e835..053d80e61d 100644
--- a/dlls/evr/Makefile.in
+++ b/dlls/evr/Makefile.in
@@ -1,6 +1,8 @@
MODULE = evr.dll
IMPORTS = mfuuid strmiids strmbase uuid ole32 oleaut32
+EXTRADLLFLAGS = -mno-cygwin
+
C_SRCS = \
evr.c \
main.c
diff --git a/dlls/evr/evr.c b/dlls/evr/evr.c
index b64b0468ac..655ca79b0d 100644
--- a/dlls/evr/evr.c
+++ b/dlls/evr/evr.c
@@ -18,7 +18,6 @@
#define COBJMACROS
-#include "config.h"
#include "wine/debug.h"
#include <stdio.h>
diff --git a/dlls/evr/main.c b/dlls/evr/main.c
index ba48207326..000ed7c55b 100644
--- a/dlls/evr/main.c
+++ b/dlls/evr/main.c
@@ -18,8 +18,6 @@
#define COBJMACROS
-#include "config.h"
-
#include <stdarg.h>
#include "windef.h"
--
2.17.1

View File

@@ -0,0 +1,39 @@
From 29294a8ce4ae5114396464e8aa177e267881e734 Mon Sep 17 00:00:00 2001
From: Zebediah Figura <zfigura@codeweavers.com>
Date: Mon, 8 Jul 2019 11:24:40 -0500
Subject: [PATCH] evr: Share source with strmbase.
Signed-off-by: Zebediah Figura <zfigura@codeweavers.com>
---
dlls/evr/Makefile.in | 13 +++++++++++--
1 file changed, 11 insertions(+), 2 deletions(-)
diff --git a/dlls/evr/Makefile.in b/dlls/evr/Makefile.in
index 053d80e61d..e605ce227c 100644
--- a/dlls/evr/Makefile.in
+++ b/dlls/evr/Makefile.in
@@ -1,10 +1,19 @@
MODULE = evr.dll
-IMPORTS = mfuuid strmiids strmbase uuid ole32 oleaut32
+IMPORTS = mfuuid strmiids uuid ole32 oleaut32
+PARENTSRC = ../strmbase
EXTRADLLFLAGS = -mno-cygwin
C_SRCS = \
+ dispatch.c \
+ enumpins.c \
evr.c \
- main.c
+ filter.c \
+ main.c \
+ mediatype.c \
+ pin.c \
+ pospass.c \
+ qualitycontrol.c \
+ renderer.c
IDL_SRCS = evr_classes.idl
--
2.17.1

View File

@@ -0,0 +1,311 @@
From cefe28f14b32726d67fcc17e0c5195c1f8d3f61e Mon Sep 17 00:00:00 2001
From: Zebediah Figura <zfigura@codeweavers.com>
Date: Mon, 8 Jul 2019 11:32:27 -0500
Subject: [PATCH] user32: Also scan for mouse devices in
GetRawInputDeviceList().
Signed-off-by: Zebediah Figura <zfigura@codeweavers.com>
---
dlls/user32/rawinput.c | 124 ++++++++++++++++++++++----------------
dlls/user32/tests/input.c | 2 +-
2 files changed, 74 insertions(+), 52 deletions(-)
diff --git a/dlls/user32/rawinput.c b/dlls/user32/rawinput.c
index 49cf9f73a0..e83da29009 100644
--- a/dlls/user32/rawinput.c
+++ b/dlls/user32/rawinput.c
@@ -36,27 +36,30 @@
#include "user_private.h"
+#include "initguid.h"
+#include "ntddmou.h"
+
WINE_DEFAULT_DEBUG_CHANNEL(rawinput);
-struct hid_device
+struct device
{
WCHAR *path;
HANDLE file;
- RID_DEVICE_INFO_HID info;
+ RID_DEVICE_INFO info;
PHIDP_PREPARSED_DATA data;
};
-static struct hid_device *hid_devices;
-static unsigned int hid_devices_count, hid_devices_max;
+static struct device *rawinput_devices;
+static unsigned int rawinput_devices_count, rawinput_devices_max;
-static CRITICAL_SECTION hid_devices_cs;
-static CRITICAL_SECTION_DEBUG hid_devices_cs_debug =
+static CRITICAL_SECTION rawinput_devices_cs;
+static CRITICAL_SECTION_DEBUG rawinput_devices_cs_debug =
{
- 0, 0, &hid_devices_cs,
- { &hid_devices_cs_debug.ProcessLocksList, &hid_devices_cs_debug.ProcessLocksList },
- 0, 0, { (DWORD_PTR)(__FILE__ ": hid_devices_cs") }
+ 0, 0, &rawinput_devices_cs,
+ { &rawinput_devices_cs_debug.ProcessLocksList, &rawinput_devices_cs_debug.ProcessLocksList },
+ 0, 0, { (DWORD_PTR)(__FILE__ ": rawinput_devices_cs") }
};
-static CRITICAL_SECTION hid_devices_cs = { &hid_devices_cs_debug, -1, 0, 0, 0, 0 };
+static CRITICAL_SECTION rawinput_devices_cs = { &rawinput_devices_cs_debug, -1, 0, 0, 0, 0 };
static BOOL array_reserve(void **elements, unsigned int *capacity, unsigned int count, unsigned int size)
{
@@ -85,10 +88,10 @@ static BOOL array_reserve(void **elements, unsigned int *capacity, unsigned int
return TRUE;
}
-static struct hid_device *add_device(HDEVINFO set, SP_DEVICE_INTERFACE_DATA *iface)
+static struct device *add_device(HDEVINFO set, SP_DEVICE_INTERFACE_DATA *iface)
{
SP_DEVICE_INTERFACE_DETAIL_DATA_W *detail;
- struct hid_device *device;
+ struct device *device;
HANDLE file;
WCHAR *path;
DWORD size;
@@ -126,7 +129,8 @@ static struct hid_device *add_device(HDEVINFO set, SP_DEVICE_INTERFACE_DATA *ifa
return NULL;
}
- if (!array_reserve((void **)&hid_devices, &hid_devices_max, hid_devices_count + 1, sizeof(*hid_devices)))
+ if (!array_reserve((void **)&rawinput_devices, &rawinput_devices_max,
+ rawinput_devices_count + 1, sizeof(*rawinput_devices)))
{
ERR("Failed to allocate memory.\n");
CloseHandle(file);
@@ -134,19 +138,20 @@ static struct hid_device *add_device(HDEVINFO set, SP_DEVICE_INTERFACE_DATA *ifa
return NULL;
}
- device = &hid_devices[hid_devices_count++];
+ device = &rawinput_devices[rawinput_devices_count++];
device->path = path;
device->file = file;
+ device->info.cbSize = sizeof(RID_DEVICE_INFO);
return device;
}
-static void find_hid_devices(void)
+static void find_devices(void)
{
static ULONGLONG last_check;
SP_DEVICE_INTERFACE_DATA iface = { sizeof(iface) };
- struct hid_device *device;
+ struct device *device;
HIDD_ATTRIBUTES attr;
HIDP_CAPS caps;
GUID hid_guid;
@@ -159,18 +164,18 @@ static void find_hid_devices(void)
HidD_GetHidGuid(&hid_guid);
- set = SetupDiGetClassDevsW(&hid_guid, NULL, NULL, DIGCF_DEVICEINTERFACE | DIGCF_PRESENT);
-
- EnterCriticalSection(&hid_devices_cs);
+ EnterCriticalSection(&rawinput_devices_cs);
/* destroy previous list */
- for (idx = 0; idx < hid_devices_count; ++idx)
+ for (idx = 0; idx < rawinput_devices_count; ++idx)
{
- CloseHandle(hid_devices[idx].file);
- heap_free(hid_devices[idx].path);
+ CloseHandle(rawinput_devices[idx].file);
+ heap_free(rawinput_devices[idx].path);
}
+ rawinput_devices_count = 0;
+
+ set = SetupDiGetClassDevsW(&hid_guid, NULL, NULL, DIGCF_DEVICEINTERFACE | DIGCF_PRESENT);
- hid_devices_count = 0;
for (idx = 0; SetupDiEnumDeviceInterfaces(set, NULL, &hid_guid, idx, &iface); ++idx)
{
if (!(device = add_device(set, &iface)))
@@ -179,9 +184,11 @@ static void find_hid_devices(void)
attr.Size = sizeof(HIDD_ATTRIBUTES);
if (!HidD_GetAttributes(device->file, &attr))
WARN("Failed to get attributes.\n");
- device->info.dwVendorId = attr.VendorID;
- device->info.dwProductId = attr.ProductID;
- device->info.dwVersionNumber = attr.VersionNumber;
+
+ device->info.dwType = RIM_TYPEHID;
+ device->info.u.hid.dwVendorId = attr.VendorID;
+ device->info.u.hid.dwProductId = attr.ProductID;
+ device->info.u.hid.dwVersionNumber = attr.VersionNumber;
if (!HidD_GetPreparsedData(device->file, &device->data))
WARN("Failed to get preparsed data.\n");
@@ -189,12 +196,28 @@ static void find_hid_devices(void)
if (!HidP_GetCaps(device->data, &caps))
WARN("Failed to get caps.\n");
- device->info.usUsagePage = caps.UsagePage;
- device->info.usUsage = caps.Usage;
+ device->info.u.hid.usUsagePage = caps.UsagePage;
+ device->info.u.hid.usUsage = caps.Usage;
}
- LeaveCriticalSection(&hid_devices_cs);
SetupDiDestroyDeviceInfoList(set);
+
+ set = SetupDiGetClassDevsW(&GUID_DEVINTERFACE_MOUSE, NULL, NULL, DIGCF_DEVICEINTERFACE | DIGCF_PRESENT);
+
+ for (idx = 0; SetupDiEnumDeviceInterfaces(set, NULL, &GUID_DEVINTERFACE_MOUSE, idx, &iface); ++idx)
+ {
+ static const RID_DEVICE_INFO_MOUSE mouse_info = {1, 5, 0, FALSE};
+
+ if (!(device = add_device(set, &iface)))
+ continue;
+
+ device->info.dwType = RIM_TYPEMOUSE;
+ device->info.u.mouse = mouse_info;
+ }
+
+ SetupDiDestroyDeviceInfoList(set);
+
+ LeaveCriticalSection(&rawinput_devices_cs);
}
/***********************************************************************
@@ -218,18 +241,18 @@ UINT WINAPI GetRawInputDeviceList(RAWINPUTDEVICELIST *devices, UINT *device_coun
return ~0U;
}
- find_hid_devices();
+ find_devices();
if (!devices)
{
- *device_count = 2 + hid_devices_count;
+ *device_count = 2 + rawinput_devices_count;
return 0;
}
- if (*device_count < 2 + hid_devices_count)
+ if (*device_count < 2 + rawinput_devices_count)
{
SetLastError(ERROR_INSUFFICIENT_BUFFER);
- *device_count = 2 + hid_devices_count;
+ *device_count = 2 + rawinput_devices_count;
return ~0U;
}
@@ -238,13 +261,13 @@ UINT WINAPI GetRawInputDeviceList(RAWINPUTDEVICELIST *devices, UINT *device_coun
devices[1].hDevice = WINE_KEYBOARD_HANDLE;
devices[1].dwType = RIM_TYPEKEYBOARD;
- for (i = 0; i < hid_devices_count; ++i)
+ for (i = 0; i < rawinput_devices_count; ++i)
{
- devices[2 + i].hDevice = &hid_devices[i];
- devices[2 + i].dwType = RIM_TYPEHID;
+ devices[2 + i].hDevice = &rawinput_devices[i];
+ devices[2 + i].dwType = rawinput_devices[i].info.dwType;
}
- return 2 + hid_devices_count;
+ return 2 + rawinput_devices_count;
}
/***********************************************************************
@@ -386,41 +409,41 @@ UINT WINAPI GetRawInputDeviceInfoA(HANDLE device, UINT command, void *data, UINT
/***********************************************************************
* GetRawInputDeviceInfoW (USER32.@)
*/
-UINT WINAPI GetRawInputDeviceInfoW(HANDLE device, UINT command, void *data, UINT *data_size)
+UINT WINAPI GetRawInputDeviceInfoW(HANDLE handle, UINT command, void *data, UINT *data_size)
{
/* FIXME: Most of this is made up. */
static const WCHAR keyboard_name[] = {'\\','\\','?','\\','W','I','N','E','_','K','E','Y','B','O','A','R','D',0};
static const WCHAR mouse_name[] = {'\\','\\','?','\\','W','I','N','E','_','M','O','U','S','E',0};
static const RID_DEVICE_INFO_KEYBOARD keyboard_info = {0, 0, 1, 12, 3, 101};
static const RID_DEVICE_INFO_MOUSE mouse_info = {1, 5, 0, FALSE};
- struct hid_device *hid_device;
const WCHAR *name = NULL;
RID_DEVICE_INFO *info;
+ struct device *device;
UINT s;
- TRACE("device %p, command %#x, data %p, data_size %p.\n",
- device, command, data, data_size);
+ TRACE("handle %p, command %#x, data %p, data_size %p.\n",
+ handle, command, data, data_size);
if (!data_size) return ~0U;
switch (command)
{
case RIDI_DEVICENAME:
- if (device == WINE_MOUSE_HANDLE)
+ if (handle == WINE_MOUSE_HANDLE)
{
s = ARRAY_SIZE(mouse_name);
name = mouse_name;
}
- else if (device == WINE_KEYBOARD_HANDLE)
+ else if (handle == WINE_KEYBOARD_HANDLE)
{
s = ARRAY_SIZE(keyboard_name);
name = keyboard_name;
}
else
{
- hid_device = device;
- s = strlenW(hid_device->path) + 1;
- name = hid_device->path;
+ device = handle;
+ s = strlenW(device->path) + 1;
+ name = device->path;
}
break;
case RIDI_DEVICEINFO:
@@ -450,21 +473,20 @@ UINT WINAPI GetRawInputDeviceInfoW(HANDLE device, UINT command, void *data, UINT
info = data;
info->cbSize = sizeof(*info);
- if (device == WINE_MOUSE_HANDLE)
+ if (handle == WINE_MOUSE_HANDLE)
{
info->dwType = RIM_TYPEMOUSE;
info->u.mouse = mouse_info;
}
- else if (device == WINE_KEYBOARD_HANDLE)
+ else if (handle == WINE_KEYBOARD_HANDLE)
{
info->dwType = RIM_TYPEKEYBOARD;
info->u.keyboard = keyboard_info;
}
else
{
- hid_device = device;
- info->dwType = RIM_TYPEHID;
- info->u.hid = hid_device->info;
+ device = handle;
+ *info = device->info;
}
return s;
}
diff --git a/dlls/user32/tests/input.c b/dlls/user32/tests/input.c
index d0dc4a8bcf..78f46bb6ba 100644
--- a/dlls/user32/tests/input.c
+++ b/dlls/user32/tests/input.c
@@ -1670,7 +1670,7 @@ static void test_GetRawInputDeviceList(void)
* understand that; so use the \\?\ prefix instead */
name[1] = '\\';
file = CreateFileW(name, 0, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
- todo_wine_if(info.dwType != RIM_TYPEHID)
+ todo_wine_if(i == 0 || i == 1)
ok(file != INVALID_HANDLE_VALUE, "Failed to open %s, error %u\n", wine_dbgstr_w(name), GetLastError());
CloseHandle(file);
}
--
2.17.1

View File

@@ -0,0 +1,72 @@
From 79c6b2c90c4935a648db1320fb0c354ca3adc138 Mon Sep 17 00:00:00 2001
From: Jeff Smith <whydoubt@gmail.com>
Date: Mon, 8 Jul 2019 14:40:23 -0500
Subject: [PATCH] d3drm: Correct paramater count of several interface defines.
Signed-off-by: Henri Verbeet <hverbeet@codeweavers.com>
---
include/d3drm.h | 16 ++++++++--------
include/d3drmobj.h | 6 +++---
2 files changed, 11 insertions(+), 11 deletions(-)
diff --git a/include/d3drm.h b/include/d3drm.h
index 126695cea1..c10b9ed18c 100644
--- a/include/d3drm.h
+++ b/include/d3drm.h
@@ -322,7 +322,7 @@ DECLARE_INTERFACE_(IDirect3DRM2,IUnknown)
#define IDirect3DRM2_EnumerateObjects(p,a,b) (p)->EnumerateObjects(a,b)
#define IDirect3DRM2_Load(p,a,b,c,d,e,f,g,h,i,j) (p)->Load(a,b,c,d,e,f,g,h,i,j)
#define IDirect3DRM2_Tick(p,a) (p)->Tick(a)
-#define IDirect3DRM2_CreateProgressiveMesh(p,a) (p)->CreateProgressiveMesh(p,a)
+#define IDirect3DRM2_CreateProgressiveMesh(p,a) (p)->CreateProgressiveMesh(a)
#endif
/*****************************************************************************
@@ -434,7 +434,7 @@ DECLARE_INTERFACE_(IDirect3DRM3,IUnknown)
#define IDirect3DRM3_CreateProgressiveMesh(p,a) (p)->lpVtbl->CreateProgressiveMesh(p,a)
#define IDirect3DRM3_RegisterClient(p,a,b) (p)->lpVtbl->RegisterClient(p,a,b)
#define IDirect3DRM3_UnregisterClient(p,a) (p)->lpVtbl->UnregisterClient(p,a)
-#define IDirect3DRM3_CreateClippedVisual(p,ab) (p)->lpVtbl->CreateClippedVisual(p,a,b)
+#define IDirect3DRM3_CreateClippedVisual(p,a,b) (p)->lpVtbl->CreateClippedVisual(p,a,b)
#define IDirect3DRM3_SetOptions(p,a) (p)->lpVtbl->SetOptions(p,a)
#define IDirect3DRM3_GetOptions(p,a) (p)->lpVtbl->GetOptions(p,a)
#else
@@ -475,12 +475,12 @@ DECLARE_INTERFACE_(IDirect3DRM3,IUnknown)
#define IDirect3DRM3_EnumerateObjects(p,a,b) (p)->EnumerateObjects(a,b)
#define IDirect3DRM3_Load(p,a,b,c,d,e,f,g,h,i,j) (p)->Load(a,b,c,d,e,f,g,h,i,j)
#define IDirect3DRM3_Tick(p,a) (p)->Tick(a)
-#define IDirect3DRM3_CreateProgressiveMesh(p,a) (p)->CreateProgressiveMesh(p,a)
-#define IDirect3DRM3_RegisterClient(p,a,b) (p)->RegisterClient(p,a,b)
-#define IDirect3DRM3_UnregisterClient(p,a) (p)->UnregisterClient(p,a)
-#define IDirect3DRM3_CreateClippedVisual(p,ab) (p)->CreateClippedVisual(p,a,b)
-#define IDirect3DRM3_SetOptions(p,a) (p)->SetOptions(p,a)
-#define IDirect3DRM3_GetOptions(p,a) (p)->GetOptions(p,a)
+#define IDirect3DRM3_CreateProgressiveMesh(p,a) (p)->CreateProgressiveMesh(a)
+#define IDirect3DRM3_RegisterClient(p,a,b) (p)->RegisterClient(a,b)
+#define IDirect3DRM3_UnregisterClient(p,a) (p)->UnregisterClient(a)
+#define IDirect3DRM3_CreateClippedVisual(p,a,b) (p)->CreateClippedVisual(a,b)
+#define IDirect3DRM3_SetOptions(p,a) (p)->SetOptions(a)
+#define IDirect3DRM3_GetOptions(p,a) (p)->GetOptions(a)
#endif
#define D3DRM_OK DD_OK
diff --git a/include/d3drmobj.h b/include/d3drmobj.h
index 5ff33fea01..7e48d9891d 100644
--- a/include/d3drmobj.h
+++ b/include/d3drmobj.h
@@ -3616,9 +3616,9 @@ DECLARE_INTERFACE_(IDirect3DRMWrap, IDirect3DRMObject)
#define IDirect3DRMWrap_GetName(p,a,b) (p)->GetName(a,b)
#define IDirect3DRMWrap_GetClassName(p,a,b) (p)->GetClassName(a,b)
/*** IDirect3DRMWrap methods ***/
-#define IDirect3DRMWrap_Init(p,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o) (p)->Init(p,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o)
-#define IDirect3DRMWrap_Apply(p,a) (p)->Apply(p,a)
-#define IDirect3DRMWrap_ApplyRelative(p,a,b) (p)->ApplyRelative(p,a,b)
+#define IDirect3DRMWrap_Init(p,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o) (p)->Init(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o)
+#define IDirect3DRMWrap_Apply(p,a) (p)->Apply(a)
+#define IDirect3DRMWrap_ApplyRelative(p,a,b) (p)->ApplyRelative(a,b)
#endif
/*****************************************************************************
--
2.17.1

View File

@@ -0,0 +1,48 @@
From 79d72547489b6420aba533c4fb6a513e8854fcd4 Mon Sep 17 00:00:00 2001
From: Austin English <austinenglish@gmail.com>
Date: Tue, 9 Jul 2019 01:07:21 -0500
Subject: [PATCH] shell32: add SHMultiFileProperties stub
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=47411
Signed-off-by: Austin English <austinenglish@gmail.com>
---
dlls/shell32/shell32.spec | 1 +
dlls/shell32/shlfileop.c | 10 ++++++++++
2 files changed, 11 insertions(+)
diff --git a/dlls/shell32/shell32.spec b/dlls/shell32/shell32.spec
index 7ed7bb531d..5331ffff94 100644
--- a/dlls/shell32/shell32.spec
+++ b/dlls/shell32/shell32.spec
@@ -409,6 +409,7 @@
@ stdcall SHIsFileAvailableOffline(wstr ptr)
@ stdcall SHLoadInProc(ptr)
@ stdcall SHLoadNonloadedIconOverlayIdentifiers()
+@ stdcall SHMultiFileProperties(ptr long)
@ stdcall SHOpenFolderAndSelectItems(ptr long ptr long)
@ stdcall SHOpenWithDialog(long ptr)
@ stdcall SHParseDisplayName(wstr ptr ptr long ptr)
diff --git a/dlls/shell32/shlfileop.c b/dlls/shell32/shlfileop.c
index 1515ad3891..22e1b523e0 100644
--- a/dlls/shell32/shlfileop.c
+++ b/dlls/shell32/shlfileop.c
@@ -1727,6 +1727,16 @@ int WINAPI RealDriveType(int drive, BOOL bQueryNet)
return GetDriveTypeA(root);
}
+/*************************************************************************
+ * SHMultiFileProperties [SHELL32.@]
+ */
+
+HRESULT WINAPI SHMultiFileProperties(IDataObject *pdtobj, DWORD flags)
+{
+ FIXME("stub: %p %u\n", pdtobj, flags);
+ return E_NOTIMPL;
+}
+
/***********************************************************************
* SHPathPrepareForWriteA (SHELL32.@)
*/
--
2.17.1

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