Rémi Bernon : winebus.sys: Introduce a new start_device callback.
Alexandre Julliard
julliard at winehq.org
Wed Aug 18 16:22:10 CDT 2021
Module: wine
Branch: master
Commit: 68c6c7d9362c53b4e0668c056f74d1f3e706a5fc
URL: https://source.winehq.org/git/wine.git/?a=commit;h=68c6c7d9362c53b4e0668c056f74d1f3e706a5fc
Author: Rémi Bernon <rbernon at codeweavers.com>
Date: Wed Aug 18 09:14:18 2021 +0200
winebus.sys: Introduce a new start_device callback.
Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/winebus.sys/bus.h | 1 +
dlls/winebus.sys/bus_iohid.c | 6 ++++++
dlls/winebus.sys/bus_sdl.c | 6 ++++++
dlls/winebus.sys/bus_udev.c | 12 ++++++++++++
dlls/winebus.sys/main.c | 33 ++++++++++++++++++++++++++++-----
5 files changed, 53 insertions(+), 5 deletions(-)
diff --git a/dlls/winebus.sys/bus.h b/dlls/winebus.sys/bus.h
index 72bd071135b..f46daa7144d 100644
--- a/dlls/winebus.sys/bus.h
+++ b/dlls/winebus.sys/bus.h
@@ -39,6 +39,7 @@ typedef struct
{
void (*free_device)(DEVICE_OBJECT *device);
int (*compare_platform_device)(DEVICE_OBJECT *device, void *platform_dev);
+ NTSTATUS (*start_device)(DEVICE_OBJECT *device);
NTSTATUS (*get_reportdescriptor)(DEVICE_OBJECT *device, BYTE *buffer, DWORD length, DWORD *out_length);
NTSTATUS (*get_string)(DEVICE_OBJECT *device, DWORD index, WCHAR *buffer, DWORD length);
NTSTATUS (*begin_report_processing)(DEVICE_OBJECT *device);
diff --git a/dlls/winebus.sys/bus_iohid.c b/dlls/winebus.sys/bus_iohid.c
index eb6765d6aac..9b9e93f5c49 100644
--- a/dlls/winebus.sys/bus_iohid.c
+++ b/dlls/winebus.sys/bus_iohid.c
@@ -148,6 +148,11 @@ static int compare_platform_device(DEVICE_OBJECT *device, void *platform_dev)
return 0;
}
+static NTSTATUS start_device(DEVICE_OBJECT *device)
+{
+ return STATUS_SUCCESS;
+}
+
static NTSTATUS get_reportdescriptor(DEVICE_OBJECT *device, BYTE *buffer, DWORD length, DWORD *out_length)
{
struct platform_private *private = impl_from_DEVICE_OBJECT(device);
@@ -274,6 +279,7 @@ static const platform_vtbl iohid_vtbl =
{
free_device,
compare_platform_device,
+ start_device,
get_reportdescriptor,
get_string,
begin_report_processing,
diff --git a/dlls/winebus.sys/bus_sdl.c b/dlls/winebus.sys/bus_sdl.c
index c833b4e4c06..e7b7c1fef22 100644
--- a/dlls/winebus.sys/bus_sdl.c
+++ b/dlls/winebus.sys/bus_sdl.c
@@ -487,6 +487,11 @@ static int compare_platform_device(DEVICE_OBJECT *device, void *context)
return impl_from_DEVICE_OBJECT(device)->id - PtrToUlong(context);
}
+static NTSTATUS start_device(DEVICE_OBJECT *device)
+{
+ return STATUS_SUCCESS;
+}
+
static NTSTATUS get_reportdescriptor(DEVICE_OBJECT *device, BYTE *buffer, DWORD length, DWORD *out_length)
{
struct platform_private *ext = impl_from_DEVICE_OBJECT(device);
@@ -596,6 +601,7 @@ static const platform_vtbl sdl_vtbl =
{
free_device,
compare_platform_device,
+ start_device,
get_reportdescriptor,
get_string,
begin_report_processing,
diff --git a/dlls/winebus.sys/bus_udev.c b/dlls/winebus.sys/bus_udev.c
index 9176dff69a7..eb6434ad2a5 100644
--- a/dlls/winebus.sys/bus_udev.c
+++ b/dlls/winebus.sys/bus_udev.c
@@ -558,6 +558,11 @@ static int compare_platform_device(DEVICE_OBJECT *device, void *platform_dev)
return strcmp(udev_device_get_syspath(dev1), udev_device_get_syspath(dev2));
}
+static NTSTATUS hidraw_start_device(DEVICE_OBJECT *device)
+{
+ return STATUS_SUCCESS;
+}
+
static NTSTATUS hidraw_get_reportdescriptor(DEVICE_OBJECT *device, BYTE *buffer, DWORD length, DWORD *out_length)
{
#ifdef HAVE_LINUX_HIDRAW_H
@@ -818,6 +823,7 @@ static const platform_vtbl hidraw_vtbl =
{
hidraw_free_device,
compare_platform_device,
+ hidraw_start_device,
hidraw_get_reportdescriptor,
hidraw_get_string,
begin_report_processing,
@@ -854,6 +860,11 @@ static void lnxev_free_device(DEVICE_OBJECT *device)
udev_device_unref(ext->base.udev_device);
}
+static NTSTATUS lnxev_start_device(DEVICE_OBJECT *device)
+{
+ return STATUS_SUCCESS;
+}
+
static NTSTATUS lnxev_get_reportdescriptor(DEVICE_OBJECT *device, BYTE *buffer, DWORD length, DWORD *out_length)
{
struct wine_input_private *ext = input_impl_from_DEVICE_OBJECT(device);
@@ -967,6 +978,7 @@ static NTSTATUS lnxev_set_feature_report(DEVICE_OBJECT *device, UCHAR id, BYTE *
static const platform_vtbl lnxev_vtbl = {
lnxev_free_device,
compare_platform_device,
+ lnxev_start_device,
lnxev_get_reportdescriptor,
lnxev_get_string,
lnxev_begin_report_processing,
diff --git a/dlls/winebus.sys/main.c b/dlls/winebus.sys/main.c
index a60e3cc9a2c..f15e7da47b2 100644
--- a/dlls/winebus.sys/main.c
+++ b/dlls/winebus.sys/main.c
@@ -109,11 +109,17 @@ struct pnp_device
DEVICE_OBJECT *device;
};
+enum device_state
+{
+ DEVICE_STATE_STOPPED,
+ DEVICE_STATE_STARTED,
+ DEVICE_STATE_REMOVED,
+};
+
struct device_extension
{
CRITICAL_SECTION cs;
-
- BOOL removed;
+ enum device_state state;
struct pnp_device *pnp_device;
@@ -480,6 +486,11 @@ static void mouse_free_device(DEVICE_OBJECT *device)
{
}
+static NTSTATUS mouse_start_device(DEVICE_OBJECT *device)
+{
+ return STATUS_SUCCESS;
+}
+
static NTSTATUS mouse_get_reportdescriptor(DEVICE_OBJECT *device, BYTE *buffer, DWORD length, DWORD *ret_length)
{
TRACE("buffer %p, length %u.\n", buffer, length);
@@ -528,6 +539,7 @@ static NTSTATUS mouse_set_feature_report(DEVICE_OBJECT *device, UCHAR id, BYTE *
static const platform_vtbl mouse_vtbl =
{
.free_device = mouse_free_device,
+ .start_device = mouse_start_device,
.get_reportdescriptor = mouse_get_reportdescriptor,
.get_string = mouse_get_string,
.begin_report_processing = mouse_begin_report_processing,
@@ -555,6 +567,11 @@ static void keyboard_free_device(DEVICE_OBJECT *device)
{
}
+static NTSTATUS keyboard_start_device(DEVICE_OBJECT *device)
+{
+ return STATUS_SUCCESS;
+}
+
static NTSTATUS keyboard_get_reportdescriptor(DEVICE_OBJECT *device, BYTE *buffer, DWORD length, DWORD *ret_length)
{
TRACE("buffer %p, length %u.\n", buffer, length);
@@ -603,6 +620,7 @@ static NTSTATUS keyboard_set_feature_report(DEVICE_OBJECT *device, UCHAR id, BYT
static const platform_vtbl keyboard_vtbl =
{
.free_device = keyboard_free_device,
+ .start_device = keyboard_start_device,
.get_reportdescriptor = keyboard_get_reportdescriptor,
.get_string = keyboard_get_string,
.begin_report_processing = keyboard_begin_report_processing,
@@ -695,13 +713,18 @@ static NTSTATUS pdo_pnp_dispatch(DEVICE_OBJECT *device, IRP *irp)
break;
case IRP_MN_START_DEVICE:
- status = STATUS_SUCCESS;
+ EnterCriticalSection(&ext->cs);
+ if (ext->state != DEVICE_STATE_STOPPED) status = STATUS_SUCCESS;
+ else if (ext->state == DEVICE_STATE_REMOVED) status = STATUS_DELETE_PENDING;
+ else if (!(status = ext->vtbl->start_device(device))) ext->state = DEVICE_STATE_STARTED;
+ else ERR("failed to start device %p, status %#x\n", device, status);
+ LeaveCriticalSection(&ext->cs);
break;
case IRP_MN_SURPRISE_REMOVAL:
EnterCriticalSection(&ext->cs);
remove_pending_irps(device);
- ext->removed = TRUE;
+ ext->state = DEVICE_STATE_REMOVED;
LeaveCriticalSection(&ext->cs);
status = STATUS_SUCCESS;
break;
@@ -834,7 +857,7 @@ static NTSTATUS WINAPI hid_internal_dispatch(DEVICE_OBJECT *device, IRP *irp)
EnterCriticalSection(&ext->cs);
- if (ext->removed)
+ if (ext->state == DEVICE_STATE_REMOVED)
{
LeaveCriticalSection(&ext->cs);
irp->IoStatus.Status = STATUS_DELETE_PENDING;
More information about the wine-cvs
mailing list