From: Vibhav Pant vibhavp@gmail.com
--- programs/plugplay/main.c | 49 ++++++++++++++++++++++++---------------- 1 file changed, 29 insertions(+), 20 deletions(-)
diff --git a/programs/plugplay/main.c b/programs/plugplay/main.c index 96dce92f64c..e1d75b68dcb 100644 --- a/programs/plugplay/main.c +++ b/programs/plugplay/main.c @@ -157,6 +157,33 @@ void __cdecl plugplay_unregister_listener( plugplay_rpc_handle handle ) destroy_listener( handle ); }
+static struct event *new_event( DWORD event_code, const struct device_broadcast *src ) +{ + struct event *event; + + event = calloc( 1, sizeof( *event ) ); + if (!event) return NULL; + + event->code = event_code; + event->data = *src; + if (src->devicetype == DBT_DEVTYP_DEVICEINTERFACE) + { + const struct device_broadcast_deviceinterface *event_iface = &src->event.device_interface; + SIZE_T name_size = (wcslen( event_iface->name ) + 1) * sizeof(WCHAR); + WCHAR *name = malloc( name_size ); + + if (!name) + { + free( event ); + return NULL; + } + memcpy( name, event_iface->name, name_size ); + event->data.event.device_interface.name = name; + } + + return event; +} + void __cdecl plugplay_send_event( DWORD code, const struct device_broadcast *data ) { struct listener *listener; @@ -188,26 +215,8 @@ void __cdecl plugplay_send_event( DWORD code, const struct device_broadcast *dat
LIST_FOR_EACH_ENTRY(listener, &listener_list, struct listener, entry) { - const struct device_broadcast_deviceinterface *event_iface = &data->event.device_interface; - SIZE_T name_size = (wcslen( event_iface->name ) + 1) * sizeof(WCHAR); - struct event *event; - WCHAR *name; - - event = calloc( 1, sizeof( *event ) ); - if (!event) continue; - - event->code = code; - event->data = *data; - - name = malloc( name_size ); - if (!name) - { - free( event ); - continue; - } - - memcpy( name, event_iface->name, name_size ); - event->data.event.device_interface.name = name; + struct event *event = new_event( code, data ); + if (!event) break;
list_add_tail( &listener->events, &event->entry ); WakeConditionVariable( &listener->cv );