From: Rémi Bernon rbernon@codeweavers.com
Signed-off-by: Rémi Bernon rbernon@codeweavers.com --- dlls/winebus.sys/unixlib.c | 81 +++++++++++++++++++++----------------- dlls/winebus.sys/unixlib.h | 2 - 2 files changed, 44 insertions(+), 39 deletions(-)
diff --git a/dlls/winebus.sys/unixlib.c b/dlls/winebus.sys/unixlib.c index 1edd90627e5..8fd43d3dff5 100644 --- a/dlls/winebus.sys/unixlib.c +++ b/dlls/winebus.sys/unixlib.c @@ -355,93 +355,100 @@ void bus_event_cleanup(struct bus_event *event) unix_device_decref(event->device); }
+struct bus_event_entry +{ + struct list entry; + struct bus_event event; +}; + void bus_event_queue_destroy(struct list *queue) { - struct bus_event *event, *next; + struct bus_event_entry *entry, *next;
- LIST_FOR_EACH_ENTRY_SAFE(event, next, queue, struct bus_event, entry) + LIST_FOR_EACH_ENTRY_SAFE(entry, next, queue, struct bus_event_entry, entry) { - bus_event_cleanup(event); - free(event); + bus_event_cleanup(&entry->event); + list_remove(&entry->entry); + free(entry); } }
BOOL bus_event_queue_device_removed(struct list *queue, struct unix_device *device) { - ULONG size = sizeof(struct bus_event); - struct bus_event *event = malloc(size); - if (!event) return FALSE; + ULONG size = sizeof(struct bus_event_entry); + struct bus_event_entry *entry = malloc(size); + if (!entry) return FALSE;
if (unix_device_incref(device) == 1) /* being destroyed */ { - free(event); + free(entry); return FALSE; }
- event->type = BUS_EVENT_TYPE_DEVICE_REMOVED; - event->device = device; - list_add_tail(queue, &event->entry); + entry->event.type = BUS_EVENT_TYPE_DEVICE_REMOVED; + entry->event.device = device; + list_add_tail(queue, &entry->entry);
return TRUE; }
BOOL bus_event_queue_device_created(struct list *queue, struct unix_device *device, struct device_desc *desc) { - ULONG size = sizeof(struct bus_event); - struct bus_event *event = malloc(size); - if (!event) return FALSE; + ULONG size = sizeof(struct bus_event_entry); + struct bus_event_entry *entry = malloc(size); + if (!entry) return FALSE;
if (unix_device_incref(device) == 1) /* being destroyed */ { - free(event); + free(entry); return FALSE; }
- event->type = BUS_EVENT_TYPE_DEVICE_CREATED; - event->device = device; - event->device_created.desc = *desc; - list_add_tail(queue, &event->entry); + entry->event.type = BUS_EVENT_TYPE_DEVICE_CREATED; + entry->event.device = device; + entry->event.device_created.desc = *desc; + list_add_tail(queue, &entry->entry);
return TRUE; }
BOOL bus_event_queue_input_report(struct list *queue, struct unix_device *device, BYTE *report, USHORT length) { - ULONG size = offsetof(struct bus_event, input_report.buffer[length]); - struct bus_event *event = malloc(size); - if (!event) return FALSE; + ULONG size = offsetof(struct bus_event_entry, event.input_report.buffer[length]); + struct bus_event_entry *entry = malloc(size); + if (!entry) return FALSE;
if (unix_device_incref(device) == 1) /* being destroyed */ { - free(event); + free(entry); return FALSE; }
- event->type = BUS_EVENT_TYPE_INPUT_REPORT; - event->device = device; - event->input_report.length = length; - memcpy(event->input_report.buffer, report, length); - list_add_tail(queue, &event->entry); + entry->event.type = BUS_EVENT_TYPE_INPUT_REPORT; + entry->event.device = device; + entry->event.input_report.length = length; + memcpy(entry->event.input_report.buffer, report, length); + list_add_tail(queue, &entry->entry);
return TRUE; }
BOOL bus_event_queue_pop(struct list *queue, struct bus_event *event) { - struct list *entry = list_head(queue); - struct bus_event *tmp; + struct list *head = list_head(queue); + struct bus_event_entry *entry; ULONG size;
- if (!entry) return FALSE; + if (!head) return FALSE;
- tmp = LIST_ENTRY(entry, struct bus_event, entry); - list_remove(entry); + entry = LIST_ENTRY(head, struct bus_event_entry, entry); + list_remove(&entry->entry);
- if (tmp->type != BUS_EVENT_TYPE_INPUT_REPORT) size = sizeof(*tmp); - else size = offsetof(struct bus_event, input_report.buffer[tmp->input_report.length]); + if (entry->event.type != BUS_EVENT_TYPE_INPUT_REPORT) size = sizeof(entry->event); + else size = offsetof(struct bus_event, input_report.buffer[entry->event.input_report.length]);
- memcpy(event, tmp, size); - free(tmp); + memcpy(event, &entry->event, size); + free(entry);
return TRUE; } diff --git a/dlls/winebus.sys/unixlib.h b/dlls/winebus.sys/unixlib.h index f43cd03c89a..532cb92a2f4 100644 --- a/dlls/winebus.sys/unixlib.h +++ b/dlls/winebus.sys/unixlib.h @@ -77,8 +77,6 @@ enum bus_event_type struct bus_event { enum bus_event_type type; - struct list entry; - struct unix_device *device; union {
From: Rémi Bernon rbernon@codeweavers.com
Signed-off-by: Rémi Bernon rbernon@codeweavers.com --- dlls/winebus.sys/main.c | 31 +++++++++++++++++-------------- dlls/winebus.sys/unix_private.h | 2 ++ dlls/winebus.sys/unixlib.c | 27 +++++++++++++++------------ dlls/winebus.sys/unixlib.h | 22 +++++++++++++++------- 4 files changed, 49 insertions(+), 33 deletions(-)
diff --git a/dlls/winebus.sys/main.c b/dlls/winebus.sys/main.c index 35db8a5fb9a..1037295c955 100644 --- a/dlls/winebus.sys/main.c +++ b/dlls/winebus.sys/main.c @@ -86,7 +86,7 @@ struct device_extension struct list reports; IRP *pending_read;
- struct unix_device *unix_device; + UINT64 unix_device; };
static CRITICAL_SECTION device_list_cs; @@ -111,13 +111,15 @@ static NTSTATUS winebus_call(unsigned int code, void *args) static void unix_device_remove(DEVICE_OBJECT *device) { struct device_extension *ext = (struct device_extension *)device->DeviceExtension; - winebus_call(device_remove, ext->unix_device); + struct device_remove_params params = {.device = ext->unix_device}; + winebus_call(device_remove, ¶ms); }
static NTSTATUS unix_device_start(DEVICE_OBJECT *device) { struct device_extension *ext = (struct device_extension *)device->DeviceExtension; - return winebus_call(device_start, ext->unix_device); + struct device_start_params params = {.device = ext->unix_device}; + return winebus_call(device_start, ¶ms); }
static NTSTATUS unix_device_get_report_descriptor(DEVICE_OBJECT *device, BYTE *buffer, UINT length, UINT *out_length) @@ -125,7 +127,7 @@ static NTSTATUS unix_device_get_report_descriptor(DEVICE_OBJECT *device, BYTE *b struct device_extension *ext = (struct device_extension *)device->DeviceExtension; struct device_descriptor_params params = { - .iface = ext->unix_device, + .device = ext->unix_device, .buffer = buffer, .length = length, .out_length = out_length @@ -138,7 +140,7 @@ static void unix_device_set_output_report(DEVICE_OBJECT *device, HID_XFER_PACKET struct device_extension *ext = (struct device_extension *)device->DeviceExtension; struct device_report_params params = { - .iface = ext->unix_device, + .device = ext->unix_device, .packet = packet, .io = io, }; @@ -150,7 +152,7 @@ static void unix_device_get_feature_report(DEVICE_OBJECT *device, HID_XFER_PACKE struct device_extension *ext = (struct device_extension *)device->DeviceExtension; struct device_report_params params = { - .iface = ext->unix_device, + .device = ext->unix_device, .packet = packet, .io = io, }; @@ -162,7 +164,7 @@ static void unix_device_set_feature_report(DEVICE_OBJECT *device, HID_XFER_PACKE struct device_extension *ext = (struct device_extension *)device->DeviceExtension; struct device_report_params params = { - .iface = ext->unix_device, + .device = ext->unix_device, .packet = packet, .io = io, }; @@ -284,7 +286,7 @@ static void remove_pending_irps(DEVICE_OBJECT *device) } }
-static DEVICE_OBJECT *bus_create_hid_device(struct device_desc *desc, struct unix_device *unix_device) +static DEVICE_OBJECT *bus_create_hid_device(struct device_desc *desc, UINT64 unix_device) { struct device_extension *ext; DEVICE_OBJECT *device; @@ -292,7 +294,7 @@ static DEVICE_OBJECT *bus_create_hid_device(struct device_desc *desc, struct uni WCHAR dev_name[256]; NTSTATUS status;
- TRACE("desc %s, unix_device %p\n", debugstr_device_desc(desc), unix_device); + TRACE("desc %s, unix_device %#I64x\n", debugstr_device_desc(desc), unix_device);
swprintf(dev_name, ARRAY_SIZE(dev_name), L"\Device\WINEBUS#%p", unix_device); RtlInitUnicodeString(&nameW, dev_name); @@ -323,7 +325,7 @@ static DEVICE_OBJECT *bus_create_hid_device(struct device_desc *desc, struct uni return device; }
-static DEVICE_OBJECT *bus_find_unix_device(struct unix_device *unix_device) +static DEVICE_OBJECT *bus_find_unix_device(UINT64 unix_device) { struct device_extension *ext;
@@ -568,7 +570,7 @@ static DWORD CALLBACK bus_main_thread(void *args) case BUS_EVENT_TYPE_DEVICE_REMOVED: RtlEnterCriticalSection(&device_list_cs); device = bus_find_unix_device(event->device); - if (!device) WARN("could not find device for %s bus device %p\n", debugstr_w(bus.name), event->device); + if (!device) WARN("could not find device for %s bus device %#I64x\n", debugstr_w(bus.name), event->device); else bus_unlink_hid_device(device); RtlLeaveCriticalSection(&device_list_cs); IoInvalidateDeviceRelations(bus_pdo, BusRelations); @@ -578,14 +580,15 @@ static DWORD CALLBACK bus_main_thread(void *args) if (device) IoInvalidateDeviceRelations(bus_pdo, BusRelations); else { - WARN("failed to create device for %s bus device %p\n", debugstr_w(bus.name), event->device); - winebus_call(device_remove, event->device); + struct device_remove_params params = {.device = event->device}; + WARN("failed to create device for %s bus device %#I64x\n", debugstr_w(bus.name), event->device); + winebus_call(device_remove, ¶ms); } break; case BUS_EVENT_TYPE_INPUT_REPORT: RtlEnterCriticalSection(&device_list_cs); device = bus_find_unix_device(event->device); - if (!device) WARN("could not find device for %s bus device %p\n", debugstr_w(bus.name), event->device); + if (!device) WARN("could not find device for %s bus device %#I64x\n", debugstr_w(bus.name), event->device); else process_hid_report(device, event->input_report.buffer, event->input_report.length); RtlLeaveCriticalSection(&device_list_cs); break; diff --git a/dlls/winebus.sys/unix_private.h b/dlls/winebus.sys/unix_private.h index 85eab6ccf5d..3001c32e89e 100644 --- a/dlls/winebus.sys/unix_private.h +++ b/dlls/winebus.sys/unix_private.h @@ -91,6 +91,8 @@ struct effect_params }; };
+struct unix_device; + struct raw_device_vtbl { void (*destroy)(struct unix_device *iface); diff --git a/dlls/winebus.sys/unixlib.c b/dlls/winebus.sys/unixlib.c index 8fd43d3dff5..75d33399738 100644 --- a/dlls/winebus.sys/unixlib.c +++ b/dlls/winebus.sys/unixlib.c @@ -163,7 +163,7 @@ static NTSTATUS mouse_device_create(void *args) { struct device_create_params *params = args; params->desc = mouse_device_desc; - params->device = hid_device_create(&mouse_vtbl, sizeof(struct mouse_device)); + params->device = (UINT_PTR)hid_device_create(&mouse_vtbl, sizeof(struct mouse_device)); return STATUS_SUCCESS; }
@@ -254,7 +254,7 @@ static NTSTATUS keyboard_device_create(void *args) { struct device_create_params *params = args; params->desc = keyboard_device_desc; - params->device = hid_device_create(&keyboard_vtbl, sizeof(struct keyboard_device)); + params->device = (UINT_PTR)hid_device_create(&keyboard_vtbl, sizeof(struct keyboard_device)); return STATUS_SUCCESS; }
@@ -285,7 +285,8 @@ static ULONG unix_device_incref(struct unix_device *iface)
static NTSTATUS unix_device_remove(void *args) { - struct unix_device *iface = args; + struct device_remove_params *params = args; + struct unix_device *iface = (struct unix_device *)(UINT_PTR)params->device; iface->vtbl->stop(iface); unix_device_decref(iface); return STATUS_SUCCESS; @@ -293,21 +294,22 @@ static NTSTATUS unix_device_remove(void *args)
static NTSTATUS unix_device_start(void *args) { - struct unix_device *iface = args; + struct device_start_params *params = args; + struct unix_device *iface = (struct unix_device *)(UINT_PTR)params->device; return iface->vtbl->start(iface); }
static NTSTATUS unix_device_get_report_descriptor(void *args) { struct device_descriptor_params *params = args; - struct unix_device *iface = params->iface; + struct unix_device *iface = (struct unix_device *)(UINT_PTR)params->device; return iface->vtbl->get_report_descriptor(iface, params->buffer, params->length, params->out_length); }
static NTSTATUS unix_device_set_output_report(void *args) { struct device_report_params *params = args; - struct unix_device *iface = params->iface; + struct unix_device *iface = (struct unix_device *)(UINT_PTR)params->device; iface->vtbl->set_output_report(iface, params->packet, params->io); return STATUS_SUCCESS; } @@ -315,7 +317,7 @@ static NTSTATUS unix_device_set_output_report(void *args) static NTSTATUS unix_device_get_feature_report(void *args) { struct device_report_params *params = args; - struct unix_device *iface = params->iface; + struct unix_device *iface = (struct unix_device *)(UINT_PTR)params->device; iface->vtbl->get_feature_report(iface, params->packet, params->io); return STATUS_SUCCESS; } @@ -323,7 +325,7 @@ static NTSTATUS unix_device_get_feature_report(void *args) static NTSTATUS unix_device_set_feature_report(void *args) { struct device_report_params *params = args; - struct unix_device *iface = params->iface; + struct unix_device *iface = (struct unix_device *)(UINT_PTR)params->device; iface->vtbl->set_feature_report(iface, params->packet, params->io); return STATUS_SUCCESS; } @@ -351,8 +353,9 @@ const unixlib_entry_t __wine_unix_call_funcs[] =
void bus_event_cleanup(struct bus_event *event) { + struct unix_device *iface = (struct unix_device *)(UINT_PTR)event->device; if (event->type == BUS_EVENT_TYPE_NONE) return; - unix_device_decref(event->device); + unix_device_decref(iface); }
struct bus_event_entry @@ -386,7 +389,7 @@ BOOL bus_event_queue_device_removed(struct list *queue, struct unix_device *devi }
entry->event.type = BUS_EVENT_TYPE_DEVICE_REMOVED; - entry->event.device = device; + entry->event.device = (UINT_PTR)device; list_add_tail(queue, &entry->entry);
return TRUE; @@ -405,7 +408,7 @@ BOOL bus_event_queue_device_created(struct list *queue, struct unix_device *devi }
entry->event.type = BUS_EVENT_TYPE_DEVICE_CREATED; - entry->event.device = device; + entry->event.device = (UINT_PTR)device; entry->event.device_created.desc = *desc; list_add_tail(queue, &entry->entry);
@@ -425,7 +428,7 @@ BOOL bus_event_queue_input_report(struct list *queue, struct unix_device *device }
entry->event.type = BUS_EVENT_TYPE_INPUT_REPORT; - entry->event.device = device; + entry->event.device = (UINT_PTR)device; entry->event.input_report.length = length; memcpy(entry->event.input_report.buffer, report, length); list_add_tail(queue, &entry->entry); diff --git a/dlls/winebus.sys/unixlib.h b/dlls/winebus.sys/unixlib.h index 532cb92a2f4..68d59ac0333 100644 --- a/dlls/winebus.sys/unixlib.h +++ b/dlls/winebus.sys/unixlib.h @@ -64,8 +64,6 @@ struct iohid_bus_options { };
-struct unix_device; - enum bus_event_type { BUS_EVENT_TYPE_NONE, @@ -76,8 +74,8 @@ enum bus_event_type
struct bus_event { - enum bus_event_type type; - struct unix_device *device; + UINT type; + UINT64 device; union { struct @@ -96,12 +94,22 @@ struct bus_event struct device_create_params { struct device_desc desc; - struct unix_device *device; + UINT64 device; +}; + +struct device_remove_params +{ + UINT64 device; +}; + +struct device_start_params +{ + UINT64 device; };
struct device_descriptor_params { - struct unix_device *iface; + UINT64 device; BYTE *buffer; UINT length; UINT *out_length; @@ -109,7 +117,7 @@ struct device_descriptor_params
struct device_report_params { - struct unix_device *iface; + UINT64 device; HID_XFER_PACKET *packet; IO_STATUS_BLOCK *io; };