Lines Matching full:events

2  * ndis_events - Receive NdisMIndicateStatus() events using WMI
115 static int ndis_events_get_adapter(struct ndis_events_data *events,
119 static int ndis_events_constructor(struct ndis_events_data *events)
121 events->ref = 1;
123 if (!CreatePipe(&events->read_pipe, &events->write_pipe, NULL, 512)) {
128 events->event_avail = CreateEvent(NULL, TRUE, FALSE, NULL);
129 if (events->event_avail == NULL) {
132 CloseHandle(events->read_pipe);
133 CloseHandle(events->write_pipe);
141 static void ndis_events_destructor(struct ndis_events_data *events)
143 CloseHandle(events->read_pipe);
144 CloseHandle(events->write_pipe);
145 CloseHandle(events->event_avail);
146 IWbemServices_Release(events->pSvc);
147 IWbemLocator_Release(events->pLoc);
171 struct ndis_events_data *events = (struct ndis_events_data *) this;
172 return ++events->ref;
178 struct ndis_events_data *events = (struct ndis_events_data *) this;
180 if (--events->ref != 0)
181 return events->ref;
183 ndis_events_destructor(events);
185 os_free(events->adapter_desc);
186 os_free(events->ifname);
187 os_free(events);
192 static int ndis_events_send_event(struct ndis_events_data *events,
217 if (WriteFile(events->write_pipe, buf, pos - buf, &written, NULL)) {
218 SetEvent(events->event_avail);
226 static void ndis_events_media_connect(struct ndis_events_data *events)
229 ndis_events_send_event(events, EVENT_CONNECT, NULL, 0);
233 static void ndis_events_media_disconnect(struct ndis_events_data *events)
236 ndis_events_send_event(events, EVENT_DISCONNECT, NULL, 0);
240 static void ndis_events_media_specific(struct ndis_events_data *events,
282 ndis_events_send_event(events, EVENT_MEDIA_SPECIFIC, data, data_len);
288 static void ndis_events_adapter_arrival(struct ndis_events_data *events)
291 ndis_events_send_event(events, EVENT_ADAPTER_ARRIVAL, NULL, 0);
295 static void ndis_events_adapter_removal(struct ndis_events_data *events)
298 ndis_events_send_event(events, EVENT_ADAPTER_REMOVAL, NULL, 0);
306 struct ndis_events_data *events = (struct ndis_events_data *) this;
309 if (events->terminating) {
345 ndis_events_get_adapter(events, events->ifname, NULL);
348 if (wcscmp(events->adapter_desc, vt.bstrVal) != 0) {
361 ndis_events_media_specific(events, pObj);
364 ndis_events_media_connect(events);
367 ndis_events_media_disconnect(events);
370 ndis_events_adapter_arrival(events);
373 ndis_events_adapter_removal(events);
439 void ndis_events_deinit(struct ndis_events_data *events)
441 events->terminating = 1;
442 IWbemServices_CancelAsyncCall(events->pSvc, &events->sink);
443 IWbemObjectSink_Release(&events->sink);
451 static int ndis_events_use_desc(struct ndis_events_data *events,
458 if (events->adapter_desc == NULL)
473 events->adapter_desc = os_malloc((len + 1) * sizeof(WCHAR));
474 if (events->adapter_desc == NULL) {
478 _snwprintf(events->adapter_desc, len + 1, L"%S", tmp);
484 static int ndis_events_get_adapter(struct ndis_events_data *events,
500 * MSNdis events. If this fails, use the provided description.
503 os_free(events->adapter_desc);
504 events->adapter_desc = NULL;
507 events->pLoc, L"ROOT\\CIMV2", NULL, NULL, 0, 0, 0, 0, &pSvc);
511 return ndis_events_use_desc(events, desc);
529 return ndis_events_use_desc(events, desc);
541 return ndis_events_use_desc(events, desc);
552 return ndis_events_use_desc(events, desc);
571 return ndis_events_use_desc(events, desc);
582 return ndis_events_use_desc(events, desc);
592 return ndis_events_use_desc(events, desc);
597 events->adapter_desc = _wcsdup(vt.bstrVal);
613 if (events->adapter_desc == NULL)
614 return ndis_events_use_desc(events, desc);
627 if (events->adapter_desc == NULL)
628 return ndis_events_use_desc(events, desc);
655 if (events->adapter_desc == NULL)
656 return ndis_events_use_desc(events, desc);
668 if (events->adapter_desc == NULL)
669 return ndis_events_use_desc(events, desc);
680 if (events->adapter_desc == NULL)
681 return ndis_events_use_desc(events, desc);
687 os_free(events->adapter_desc);
688 events->adapter_desc = _wcsdup(vt.bstrVal);
695 if (events->adapter_desc == NULL)
696 return ndis_events_use_desc(events, desc);
708 struct ndis_events_data *events;
710 events = os_zalloc(sizeof(*events));
711 if (events == NULL) {
712 wpa_printf(MSG_ERROR, "Could not allocate sink for events.");
715 events->ifname = os_strdup(ifname);
716 if (events->ifname == NULL) {
717 os_free(events);
726 os_free(events);
744 os_free(events);
751 (LPVOID *) (void *) &events->pLoc);
756 os_free(events);
760 if (ndis_events_get_adapter(events, ifname, desc) < 0) {
762 os_free(events);
766 events->adapter_desc);
769 events->pLoc, L"ROOT\\WMI", NULL, NULL,
770 0, 0, 0, 0, &events->pSvc);
775 os_free(events->adapter_desc);
776 os_free(events);
781 ndis_events_constructor(events);
782 pSink = &events->sink;
783 pSink->lpVtbl = &events->sink_vtbl;
784 events->sink_vtbl.QueryInterface = ndis_events_query_interface;
785 events->sink_vtbl.AddRef = ndis_events_add_ref;
786 events->sink_vtbl.Release = ndis_events_release;
787 events->sink_vtbl.Indicate = ndis_events_indicate;
788 events->sink_vtbl.SetStatus = ndis_events_set_status;
790 if (register_async_notification(pSink, events->pSvc) < 0) {
793 ndis_events_destructor(events);
794 os_free(events->adapter_desc);
795 os_free(events);
799 *read_pipe = events->read_pipe;
800 *event_avail = events->event_avail;
802 return events;