diff --git a/dlls/winebus.sys/bus_iohid.c b/dlls/winebus.sys/bus_iohid.c index d362906637a..93b3605f8d2 100644 --- a/dlls/winebus.sys/bus_iohid.c +++ b/dlls/winebus.sys/bus_iohid.c @@ -139,8 +139,7 @@ static void handle_IOHIDDeviceIOHIDReportCallback(void *context, static void iohid_device_destroy(struct unix_device *iface) { - struct platform_private *private = impl_from_unix_device(iface); - HeapFree(GetProcessHeap(), 0, private); + unix_device_destroy(iface); } static int iohid_device_compare(struct unix_device *iface, void *context) @@ -337,9 +336,7 @@ static void handle_DeviceMatchingCallback(void *context, IOReturn result, void * TRACE("dev %p, desc %s.\n", IOHIDDevice, debugstr_device_desc(&desc)); - if (!(private = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(struct platform_private)))) - return; - private->unix_device.vtbl = &iohid_device_vtbl; + if (!(private = unix_device_create(&iohid_device_vtbl, sizeof(struct platform_private)))) return; private->device = IOHIDDevice; private->buffer = NULL; diff --git a/dlls/winebus.sys/bus_sdl.c b/dlls/winebus.sys/bus_sdl.c index 73562fec14f..cda9e9bdcd9 100644 --- a/dlls/winebus.sys/bus_sdl.c +++ b/dlls/winebus.sys/bus_sdl.c @@ -480,9 +480,7 @@ failed: static void sdl_device_destroy(struct unix_device *iface) { - struct platform_private *ext = impl_from_unix_device(iface); - - HeapFree(GetProcessHeap(), 0, ext); + unix_device_destroy(iface); } static int sdl_device_compare(struct unix_device *iface, void *context) @@ -761,9 +759,7 @@ static void sdl_add_device(unsigned int index) TRACE("%s id %d, desc %s.\n", controller ? "controller" : "joystick", id, debugstr_device_desc(&desc)); - if (!(private = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*private)))) - return; - private->unix_device.vtbl = &sdl_device_vtbl; + if (!(private = unix_device_create(&sdl_device_vtbl, sizeof(struct platform_private)))) return; private->sdl_joystick = joystick; private->sdl_controller = controller; private->id = id; diff --git a/dlls/winebus.sys/bus_udev.c b/dlls/winebus.sys/bus_udev.c index 25a408489a4..004bbb379c4 100644 --- a/dlls/winebus.sys/bus_udev.c +++ b/dlls/winebus.sys/bus_udev.c @@ -561,7 +561,7 @@ static void hidraw_device_destroy(struct unix_device *iface) close(private->device_fd); udev_device_unref(private->udev_device); - HeapFree(GetProcessHeap(), 0, private); + unix_device_destroy(iface); } static int udev_device_compare(struct unix_device *iface, void *platform_dev) @@ -815,7 +815,7 @@ static void lnxev_device_destroy(struct unix_device *iface) close(ext->base.device_fd); udev_device_unref(ext->base.udev_device); - HeapFree(GetProcessHeap(), 0, ext); + unix_device_destroy(iface); } static DWORD CALLBACK lnxev_device_report_thread(void *args); @@ -1084,9 +1084,7 @@ static void udev_add_device(struct udev_device *dev) if (strcmp(subsystem, "hidraw") == 0) { - if (!(private = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(struct platform_private)))) - return; - private->unix_device.vtbl = &hidraw_device_vtbl; + if (!(private = unix_device_create(&hidraw_device_vtbl, sizeof(struct platform_private)))) return; EnterCriticalSection(&udev_cs); list_add_tail(&device_list, &private->unix_device.entry); LeaveCriticalSection(&udev_cs); @@ -1098,9 +1096,7 @@ static void udev_add_device(struct udev_device *dev) #ifdef HAS_PROPER_INPUT_HEADER else if (strcmp(subsystem, "input") == 0) { - if (!(private = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(struct wine_input_private)))) - return; - private->unix_device.vtbl = &lnxev_device_vtbl; + if (!(private = unix_device_create(&lnxev_device_vtbl, sizeof(struct wine_input_private)))) return; EnterCriticalSection(&udev_cs); list_add_tail(&device_list, &private->unix_device.entry); LeaveCriticalSection(&udev_cs); diff --git a/dlls/winebus.sys/unix_private.h b/dlls/winebus.sys/unix_private.h index 2a878cdb583..3b0375bb761 100644 --- a/dlls/winebus.sys/unix_private.h +++ b/dlls/winebus.sys/unix_private.h @@ -47,6 +47,9 @@ struct unix_device struct list entry; }; +extern void *unix_device_create(const struct unix_device_vtbl *vtbl, SIZE_T size) DECLSPEC_HIDDEN; +extern void unix_device_destroy(struct unix_device *iface) DECLSPEC_HIDDEN; + extern NTSTATUS sdl_bus_init(void *) DECLSPEC_HIDDEN; extern NTSTATUS sdl_bus_wait(void *) DECLSPEC_HIDDEN; extern NTSTATUS sdl_bus_stop(void *) DECLSPEC_HIDDEN; diff --git a/dlls/winebus.sys/unixlib.c b/dlls/winebus.sys/unixlib.c index 2407a2af468..b37d9534540 100644 --- a/dlls/winebus.sys/unixlib.c +++ b/dlls/winebus.sys/unixlib.c @@ -213,6 +213,21 @@ static NTSTATUS keyboard_device_create(void *args) return STATUS_SUCCESS; } +void *unix_device_create(const struct unix_device_vtbl *vtbl, SIZE_T size) +{ + struct unix_device *iface; + + if (!(iface = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, size))) return NULL; + iface->vtbl = vtbl; + + return iface; +} + +void unix_device_destroy(struct unix_device *iface) +{ + HeapFree(GetProcessHeap(), 0, iface); +} + static NTSTATUS unix_device_remove(void *args) { struct unix_device *iface = args;