static void read_settings(void) { LISTEN_REC *rec; GSList *remove_listens; char **ports, **tmp, *ircnet, *port; int portnum; remove_listens = g_slist_copy(proxy_listens); ports = g_strsplit(settings_get_str("irssiproxy_ports"), " ", -1); for (tmp = ports; *tmp != NULL; tmp++) { ircnet = *tmp; port = strchr(ircnet, '='); if (port == NULL) continue; *port++ = '\0'; portnum = atoi(port); if (portnum <= 0) continue; rec = find_listen(ircnet, portnum); if (rec == NULL) add_listen(ircnet, portnum); else remove_listens = g_slist_remove(remove_listens, rec); } g_strfreev(ports); while (remove_listens != NULL) { remove_listen(remove_listens->data); remove_listens = g_slist_remove(remove_listens, remove_listens->data); } }
/* this completion routine gets address and port from reply to TDI_QUERY_ADDRESS_INFO */ NTSTATUS tdi_create_addrobj_complete2(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PVOID Context) { NTSTATUS status; TDI_CREATE_ADDROBJ2_CTX *ctx = (TDI_CREATE_ADDROBJ2_CTX *)Context; TA_ADDRESS *addr = ctx->tai->Address.Address; struct ot_entry *ote_addr; KIRQL irql; int ipproto; KdPrint(("[tdi_fw] tdi_create_addrobj_complete2: address: %x:%u\n", ntohl(((TDI_ADDRESS_IP *)(addr->Address))->in_addr), ntohs(((TDI_ADDRESS_IP *)(addr->Address))->sin_port))); // save address ote_addr = ot_find_fileobj(ctx->fileobj, &irql); if (ote_addr == NULL) { KdPrint(("[tdi_fw] tdi_create_addrobj_complete2: ot_find_fileobj(0x%x)\n", ctx->fileobj)); status = STATUS_OBJECT_NAME_NOT_FOUND; goto done; } if (addr->AddressLength > sizeof(ote_addr->local_addr)) { KdPrint(("[tdi_fw] tdi_create_addrobj_complete2: address too long! (%u)\n", addr->AddressLength)); status = STATUS_BUFFER_OVERFLOW; goto done; } memcpy(ote_addr->local_addr, addr, addr->AddressLength); if (ote_addr->ipproto != IPPROTO_TCP) { // set "LISTEN" state for this addrobj status = add_listen(ote_addr); if (status != STATUS_SUCCESS) { KdPrint(("[tdi_fw] tdi_create_addrobj_complete2: add_listen: 0x%x!\n", status)); goto done; } } status = STATUS_SUCCESS; done: if (ote_addr != NULL) KeReleaseSpinLock(&g_ot_hash_guard, irql); // cleanup MDL to avoid unlocking pages from NonPaged pool if (Irp->MdlAddress != NULL) { IoFreeMdl(Irp->MdlAddress); Irp->MdlAddress = NULL; } free(ctx->tai); free(ctx); // success anyway return STATUS_SUCCESS; }
static void read_settings(void) { LISTEN_REC *rec; GSList *remove_listens = NULL; GSList *add_listens = NULL; char **ports, **tmp, *ircnet, *port; int portnum; remove_listens = g_slist_copy(proxy_listens); ports = g_strsplit(settings_get_str("irssiproxy_ports"), " ", -1); for (tmp = ports; *tmp != NULL; tmp++) { ircnet = *tmp; port = strchr(ircnet, '='); if (port == NULL) continue; *port++ = '\0'; portnum = atoi(port); if (portnum <= 0) continue; rec = find_listen(ircnet, portnum); if (rec == NULL) { rec = g_new0(LISTEN_REC, 1); rec->ircnet = ircnet; /* borrow */ rec->port = portnum; add_listens = g_slist_prepend(add_listens, rec); } else { /* remove from the list of listens to remove == keep it */ remove_listens = g_slist_remove(remove_listens, rec); } } while (remove_listens != NULL) { remove_listen(remove_listens->data); remove_listens = g_slist_remove(remove_listens, remove_listens->data); } while (add_listens != NULL) { rec = add_listens->data; add_listen(rec->ircnet, rec->port); add_listens = g_slist_remove(add_listens, rec); g_free(rec); } g_strfreev(ports); }
int tdi_set_event_handler(PIRP irp, PIO_STACK_LOCATION irps, struct completion *completion) { PTDI_REQUEST_KERNEL_SET_EVENT r = (PTDI_REQUEST_KERNEL_SET_EVENT)&irps->Parameters; NTSTATUS status; struct ot_entry *ote_addr = NULL; KIRQL irql; int result = FILTER_DENY; TDI_EVENT_CONTEXT *ctx; KdPrint(("[tdi_fw] tdi_set_event_handler: [%s] devobj 0x%x; addrobj 0x%x; EventType: %d\n", r->EventHandler ? "(+)ADD" : "(-)REMOVE", irps->DeviceObject, irps->FileObject, r->EventType)); ote_addr = ot_find_fileobj(irps->FileObject, &irql); if (ote_addr == NULL) { KdPrint(("[tdi_fw] tdi_set_event_handler: ot_find_fileobj(0x%x)\n", irps->FileObject)); if (r->EventHandler == NULL) { // for fileobjects loaded earlier than our driver allow removing result = FILTER_ALLOW; } goto done; } if (r->EventType < 0 || r->EventType >= MAX_EVENT) { KdPrint(("[tdi_fw] tdi_set_event_handler: unknown EventType %d!\n", r->EventType)); result = FILTER_ALLOW; goto done; } ctx = &ote_addr->ctx[r->EventType]; if (r->EventHandler != NULL) { /* add EventHandler */ int i; for (i = 0; g_tdi_event_handlers[i].event != (ULONG)-1; i++) if (g_tdi_event_handlers[i].event == r->EventType) break; if (g_tdi_event_handlers[i].event == (ULONG)-1) { KdPrint(("[tdi_fw] tdi_set_event_handler: unknown EventType %d!\n", r->EventType)); result = FILTER_ALLOW; goto done; } ctx->old_handler = r->EventHandler; ctx->old_context = r->EventContext; if (g_tdi_event_handlers[i].handler != NULL) { r->EventHandler = g_tdi_event_handlers[i].handler; r->EventContext = ctx; } else { r->EventHandler = NULL; r->EventContext = NULL; } KdPrint(("[tdi_fw] tdi_set_event_handler: old_handler 0x%x; old_context 0x%x\n", r->EventHandler, r->EventContext)); } else { /* remove EventHandler */ ctx->old_handler = NULL; ctx->old_context = NULL; } // change LISTEN state if (r->EventType == TDI_EVENT_CONNECT) { TA_ADDRESS *local_addr; if (r->EventHandler != NULL) { // add "LISTEN" info status = add_listen(ote_addr); if (status != STATUS_SUCCESS) { KdPrint(("[tdi_fw] tdi_set_event_handler: add_listen: 0x%x!\n", status)); goto done; } } else if (ote_addr->listen_entry != NULL) { // remove "LISTEN" info del_listen_obj(ote_addr->listen_entry, FALSE); ote_addr->listen_entry = NULL; } // log it if address is not 127.0.0.1 local_addr = (TA_ADDRESS *)(ote_addr->local_addr); if (ntohl(((TDI_ADDRESS_IP *)(local_addr->Address))->in_addr) != 0x7f000001) { struct flt_request request; memset(&request, 0, sizeof(request)); request.struct_size = sizeof(request); request.type = (r->EventHandler != NULL) ? TYPE_LISTEN : TYPE_NOT_LISTEN; request.proto = IPPROTO_TCP; // correct? if (r->EventHandler != NULL) { // for removing event handler ProcessNotifyProc can be already called request.pid = (ULONG)PsGetCurrentProcessId(); if (request.pid == 0) { // avoid idle process pid (XXX do we need this?) request.pid = ote_addr->pid; } } else request.pid = (ULONG)-1; // get user SID & attributes (can't call get_current_sid_a at DISPATCH_LEVEL) if ((request.sid_a = copy_sid_a(ote_addr->sid_a, ote_addr->sid_a_size)) != NULL) request.sid_a_size = ote_addr->sid_a_size; memcpy(&request.addr.from, &local_addr->AddressType, sizeof(struct sockaddr)); request.addr.len = sizeof(struct sockaddr_in); log_request(&request); if (request.sid_a != NULL) free(request.sid_a); } } result = FILTER_ALLOW; done: // cleanup if (ote_addr != NULL) KeReleaseSpinLock(&g_ot_hash_guard, irql); return result; }