Lines Matching refs: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);
438 void ndis_events_deinit(struct ndis_events_data *events)
440 events->terminating = 1;
441 IWbemServices_CancelAsyncCall(events->pSvc, &events->sink);
442 IWbemObjectSink_Release(&events->sink);
450 static int ndis_events_use_desc(struct ndis_events_data *events,
457 if (events->adapter_desc == NULL)
472 events->adapter_desc = os_malloc((len + 1) * sizeof(WCHAR));
473 if (events->adapter_desc == NULL) {
477 _snwprintf(events->adapter_desc, len + 1, L"%S", tmp);
483 static int ndis_events_get_adapter(struct ndis_events_data *events,
499 * MSNdis events. If this fails, use the provided description.
502 os_free(events->adapter_desc);
503 events->adapter_desc = NULL;
506 events->pLoc, L"ROOT\\CIMV2", NULL, NULL, 0, 0, 0, 0, &pSvc);
510 return ndis_events_use_desc(events, desc);
528 return ndis_events_use_desc(events, desc);
540 return ndis_events_use_desc(events, desc);
551 return ndis_events_use_desc(events, desc);
570 return ndis_events_use_desc(events, desc);
581 return ndis_events_use_desc(events, desc);
591 return ndis_events_use_desc(events, desc);
596 events->adapter_desc = _wcsdup(vt.bstrVal);
612 if (events->adapter_desc == NULL)
613 return ndis_events_use_desc(events, desc);
626 if (events->adapter_desc == NULL)
627 return ndis_events_use_desc(events, desc);
654 if (events->adapter_desc == NULL)
655 return ndis_events_use_desc(events, desc);
667 if (events->adapter_desc == NULL)
668 return ndis_events_use_desc(events, desc);
679 if (events->adapter_desc == NULL)
680 return ndis_events_use_desc(events, desc);
686 os_free(events->adapter_desc);
687 events->adapter_desc = _wcsdup(vt.bstrVal);
694 if (events->adapter_desc == NULL)
695 return ndis_events_use_desc(events, desc);
707 struct ndis_events_data *events;
709 events = os_zalloc(sizeof(*events));
710 if (events == NULL) {
711 wpa_printf(MSG_ERROR, "Could not allocate sink for events.");
714 events->ifname = os_strdup(ifname);
715 if (events->ifname == NULL) {
716 os_free(events);
725 os_free(events);
743 os_free(events);
750 (LPVOID *) (void *) &events->pLoc);
755 os_free(events);
759 if (ndis_events_get_adapter(events, ifname, desc) < 0) {
761 os_free(events);
765 events->adapter_desc);
768 events->pLoc, L"ROOT\\WMI", NULL, NULL,
769 0, 0, 0, 0, &events->pSvc);
774 os_free(events->adapter_desc);
775 os_free(events);
780 ndis_events_constructor(events);
781 pSink = &events->sink;
782 pSink->lpVtbl = &events->sink_vtbl;
783 events->sink_vtbl.QueryInterface = ndis_events_query_interface;
784 events->sink_vtbl.AddRef = ndis_events_add_ref;
785 events->sink_vtbl.Release = ndis_events_release;
786 events->sink_vtbl.Indicate = ndis_events_indicate;
787 events->sink_vtbl.SetStatus = ndis_events_set_status;
789 if (register_async_notification(pSink, events->pSvc) < 0) {
792 ndis_events_destructor(events);
793 os_free(events->adapter_desc);
794 os_free(events);
798 *read_pipe = events->read_pipe;
799 *event_avail = events->event_avail;
801 return events;