Lines Matching refs:events

2  * ndis_events - Receive NdisMIndicateStatus() events using WMI
121 static int ndis_events_get_adapter(struct ndis_events_data *events,
125 static int ndis_events_constructor(struct ndis_events_data *events)
127 events->ref = 1;
129 if (!CreatePipe(&events->read_pipe, &events->write_pipe, NULL, 512)) {
134 events->event_avail = CreateEvent(NULL, TRUE, FALSE, NULL);
135 if (events->event_avail == NULL) {
138 CloseHandle(events->read_pipe);
139 CloseHandle(events->write_pipe);
147 static void ndis_events_destructor(struct ndis_events_data *events)
149 CloseHandle(events->read_pipe);
150 CloseHandle(events->write_pipe);
151 CloseHandle(events->event_avail);
152 IWbemServices_Release(events->pSvc);
153 IWbemLocator_Release(events->pLoc);
177 struct ndis_events_data *events = (struct ndis_events_data *) this;
178 return ++events->ref;
184 struct ndis_events_data *events = (struct ndis_events_data *) this;
186 if (--events->ref != 0)
187 return events->ref;
189 ndis_events_destructor(events);
191 os_free(events->adapter_desc);
192 os_free(events->ifname);
193 os_free(events);
198 static int ndis_events_send_event(struct ndis_events_data *events,
223 if (WriteFile(events->write_pipe, buf, pos - buf, &written, NULL)) {
224 SetEvent(events->event_avail);
232 static void ndis_events_media_connect(struct ndis_events_data *events)
235 ndis_events_send_event(events, EVENT_CONNECT, NULL, 0);
239 static void ndis_events_media_disconnect(struct ndis_events_data *events)
242 ndis_events_send_event(events, EVENT_DISCONNECT, NULL, 0);
246 static void ndis_events_media_specific(struct ndis_events_data *events,
288 ndis_events_send_event(events, EVENT_MEDIA_SPECIFIC, data, data_len);
294 static void ndis_events_adapter_arrival(struct ndis_events_data *events)
297 ndis_events_send_event(events, EVENT_ADAPTER_ARRIVAL, NULL, 0);
301 static void ndis_events_adapter_removal(struct ndis_events_data *events)
304 ndis_events_send_event(events, EVENT_ADAPTER_REMOVAL, NULL, 0);
312 struct ndis_events_data *events = (struct ndis_events_data *) this;
315 if (events->terminating) {
351 ndis_events_get_adapter(events, events->ifname, NULL);
354 if (wcscmp(events->adapter_desc, vt.bstrVal) != 0) {
367 ndis_events_media_specific(events, pObj);
370 ndis_events_media_connect(events);
373 ndis_events_media_disconnect(events);
376 ndis_events_adapter_arrival(events);
379 ndis_events_adapter_removal(events);
444 void ndis_events_deinit(struct ndis_events_data *events)
446 events->terminating = 1;
447 IWbemServices_CancelAsyncCall(events->pSvc, &events->sink);
448 IWbemObjectSink_Release(&events->sink);
456 static int ndis_events_use_desc(struct ndis_events_data *events,
463 if (events->adapter_desc == NULL)
478 events->adapter_desc = os_malloc((len + 1) * sizeof(WCHAR));
479 if (events->adapter_desc == NULL) {
483 _snwprintf(events->adapter_desc, len + 1, L"%S", tmp);
489 static int ndis_events_get_adapter(struct ndis_events_data *events,
505 * MSNdis events. If this fails, use the provided description.
508 os_free(events->adapter_desc);
509 events->adapter_desc = NULL;
512 events->pLoc, L"ROOT\\CIMV2", NULL, NULL, 0, 0, 0, 0, &pSvc);
516 return ndis_events_use_desc(events, desc);
534 return ndis_events_use_desc(events, desc);
546 return ndis_events_use_desc(events, desc);
557 return ndis_events_use_desc(events, desc);
576 return ndis_events_use_desc(events, desc);
587 return ndis_events_use_desc(events, desc);
597 return ndis_events_use_desc(events, desc);
602 events->adapter_desc = _wcsdup(vt.bstrVal);
618 if (events->adapter_desc == NULL)
619 return ndis_events_use_desc(events, desc);
632 if (events->adapter_desc == NULL)
633 return ndis_events_use_desc(events, desc);
660 if (events->adapter_desc == NULL)
661 return ndis_events_use_desc(events, desc);
673 if (events->adapter_desc == NULL)
674 return ndis_events_use_desc(events, desc);
685 if (events->adapter_desc == NULL)
686 return ndis_events_use_desc(events, desc);
692 os_free(events->adapter_desc);
693 events->adapter_desc = _wcsdup(vt.bstrVal);
700 if (events->adapter_desc == NULL)
701 return ndis_events_use_desc(events, desc);
713 struct ndis_events_data *events;
715 events = os_zalloc(sizeof(*events));
716 if (events == NULL) {
717 wpa_printf(MSG_ERROR, "Could not allocate sink for events.");
720 events->ifname = os_strdup(ifname);
721 if (events->ifname == NULL) {
722 os_free(events);
731 os_free(events);
749 os_free(events);
756 (LPVOID *) (void *) &events->pLoc);
761 os_free(events);
765 if (ndis_events_get_adapter(events, ifname, desc) < 0) {
767 os_free(events);
771 events->adapter_desc);
774 events->pLoc, L"ROOT\\WMI", NULL, NULL,
775 0, 0, 0, 0, &events->pSvc);
780 os_free(events->adapter_desc);
781 os_free(events);
786 ndis_events_constructor(events);
787 pSink = &events->sink;
788 pSink->lpVtbl = &events->sink_vtbl;
789 events->sink_vtbl.QueryInterface = ndis_events_query_interface;
790 events->sink_vtbl.AddRef = ndis_events_add_ref;
791 events->sink_vtbl.Release = ndis_events_release;
792 events->sink_vtbl.Indicate = ndis_events_indicate;
793 events->sink_vtbl.SetStatus = ndis_events_set_status;
795 if (register_async_notification(pSink, events->pSvc) < 0) {
798 ndis_events_destructor(events);
799 os_free(events->adapter_desc);
800 os_free(events);
804 *read_pipe = events->read_pipe;
805 *event_avail = events->event_avail;
807 return events;