OpenVPN
|
#include "syshead.h"
#include <minwindef.h>
#include <winsock2.h>
#include "buffer.h"
#include "error.h"
#include "mtu.h"
#include "run_command.h"
#include "sig.h"
#include "win32-util.h"
#include "win32.h"
#include "openvpn-msg.h"
#include "memdbg.h"
#include <versionhelpers.h>
#include "wfp_block.h"
Go to the source code of this file.
Enumerations | |
enum | arch_t { ARCH_X86, ARCH_AMD64, ARCH_ARM64, ARCH_NATIVE, ARCH_UNKNOWN } |
Functions | |
static void | set_openssl_env_vars () |
Set OpenSSL environment variables to a safe directory. More... | |
void | init_win32 (void) |
void | uninit_win32 (void) |
void | set_pause_exit_win32 (void) |
bool | init_security_attributes_allow_all (struct security_attributes *obj) |
void | overlapped_io_init (struct overlapped_io *o, const struct frame *frame, BOOL event_state) |
void | overlapped_io_close (struct overlapped_io *o) |
char * | overlapped_io_state_ascii (const struct overlapped_io *o) |
void | init_net_event_win32 (struct rw_handle *event, long network_events, socket_descriptor_t sd, unsigned int flags) |
long | reset_net_event_win32 (struct rw_handle *event, socket_descriptor_t sd) |
void | close_net_event_win32 (struct rw_handle *event, socket_descriptor_t sd, unsigned int flags) |
void | net_event_win32_init (struct net_event_win32 *ne) |
void | net_event_win32_start (struct net_event_win32 *ne, long network_events, socket_descriptor_t sd) |
void | net_event_win32_reset_write (struct net_event_win32 *ne) |
void | net_event_win32_reset (struct net_event_win32 *ne) |
void | net_event_win32_stop (struct net_event_win32 *ne) |
void | net_event_win32_close (struct net_event_win32 *ne) |
static void | win_trigger_event (struct win32_signal *ws) |
static bool WINAPI | win_ctrl_handler (DWORD signum) |
void | win32_signal_clear (struct win32_signal *ws) |
void | win32_signal_open (struct win32_signal *ws, int force, const char *exit_event_name, bool exit_event_initial_state) |
static bool | keyboard_input_available (struct win32_signal *ws) |
static unsigned int | keyboard_ir_to_key (INPUT_RECORD *ir) |
static unsigned int | win32_keyboard_get (struct win32_signal *ws) |
void | win32_signal_close (struct win32_signal *ws) |
bool | win32_service_interrupt (struct win32_signal *ws) |
int | win32_signal_get (struct win32_signal *ws) |
void | win32_pause (struct win32_signal *ws) |
void | window_title_clear (struct window_title *wt) |
void | window_title_save (struct window_title *wt) |
void | window_title_restore (const struct window_title *wt) |
void | window_title_generate (const char *title) |
void | semaphore_clear (struct semaphore *s) |
void | semaphore_open (struct semaphore *s, const char *name) |
bool | semaphore_lock (struct semaphore *s, int timeout_milliseconds) |
void | semaphore_release (struct semaphore *s) |
void | semaphore_close (struct semaphore *s) |
void | netcmd_semaphore_init (void) |
void | netcmd_semaphore_close (void) |
void | netcmd_semaphore_lock (void) |
void | netcmd_semaphore_release (void) |
static char * | env_block (const struct env_set *es) |
static WCHAR * | wide_cmd_line (const struct argv *a, struct gc_arena *gc) |
int | openvpn_execve (const struct argv *a, const struct env_set *es, const unsigned int flags) |
void | fork_to_self (const char *cmdline) |
char * | get_win_sys_path (void) |
void | set_win_sys_path (const char *newpath, struct env_set *es) |
void | set_win_sys_path_via_env (struct env_set *es) |
static bool | win_get_exe_path (PWCHAR path, DWORD size) |
static void | win_wfp_msg_handler (DWORD err, const char *msg) |
static bool | win_wfp_block_service (bool add, bool dns_only, int index, const HANDLE pipe) |
bool | win_wfp_block (const NET_IFINDEX index, const HANDLE msg_channel, BOOL dns_only) |
bool | win_wfp_uninit (const NET_IFINDEX index, const HANDLE msg_channel) |
int | win32_version_info (void) |
static void | win32_get_arch (arch_t *process_arch, arch_t *host_arch) |
static void | win32_print_arch (arch_t arch, struct buffer *out) |
const char * | win32_version_string (struct gc_arena *gc, bool add_name) |
bool | send_msg_iservice (HANDLE pipe, const void *data, size_t size, ack_message_t *ack, const char *context) |
bool | get_openvpn_reg_value (const WCHAR *key, WCHAR *value, DWORD size) |
Fetches a registry value for OpenVPN registry key. More... | |
void | win32_sleep (const int n) |
bool | plugin_in_trusted_dir (const WCHAR *plugin_path) |
Checks if a plugin is located in a trusted directory. More... | |
Variables | |
static HANDLE | m_hEngineHandle = NULL |
static int | tap_metric_v4 = -1 |
static int | tap_metric_v6 = -1 |
static struct WSAData | wsa_state |
static bool | pause_exit_enabled = false |
struct win32_signal | win32_signal |
struct window_title | window_title |
struct semaphore | netcmd_semaphore |
static char * | win_sys_path = NULL |
enum arch_t |
void close_net_event_win32 | ( | struct rw_handle * | event, |
socket_descriptor_t | sd, | ||
unsigned int | flags | ||
) |
Definition at line 277 of file win32.c.
References M_ERRNO, M_WARN, msg, NE32_PERSIST_EVENT, rw_handle::read, socket_defined(), and rw_handle::write.
Referenced by link_socket_close(), net_event_win32_close(), and net_event_win32_stop().
|
static |
Definition at line 886 of file win32.c.
References check_malloc_return(), env_allowed(), es, get_win_sys_path(), env_set::list, M_INFO, M_WARN, msg, env_item::next, and env_item::string.
Referenced by openvpn_execve().
void fork_to_self | ( | const char * | cmdline | ) |
Definition at line 1073 of file win32.c.
References CLEAR, M_ERRNO, M_WARN, msg, status, and string_alloc().
Referenced by fork_dhcp_action(), and fork_register_dns_action().
bool get_openvpn_reg_value | ( | const WCHAR * | key, |
WCHAR * | value, | ||
DWORD | size | ||
) |
Fetches a registry value for OpenVPN registry key.
key | Registry value name to fetch. |
value | Buffer to store the fetched string value. |
size | Size of value buffer in bytes. |
true
if successful, false
otherwise. Definition at line 1501 of file win32.c.
References PACKAGE_NAME, and status.
Referenced by plugin_in_trusted_dir(), and set_openssl_env_vars().
char* get_win_sys_path | ( | void | ) |
Definition at line 1113 of file win32.c.
Referenced by add_route(), delete_route(), do_dns_domain_wmic(), do_ifconfig_ipv6(), env_block(), HandleEnableDHCPMessage(), ipconfig_register_dns(), netsh_delete_address_dns(), netsh_dns_cmd(), netsh_enable_dhcp(), netsh_ifconfig(), netsh_ifconfig_options(), netsh_set_dns6_servers(), netsh_wins_cmd(), RegisterDNS(), and wmic_nicconfig_cmd().
void init_net_event_win32 | ( | struct rw_handle * | event, |
long | network_events, | ||
socket_descriptor_t | sd, | ||
unsigned int | flags | ||
) |
Definition at line 223 of file win32.c.
References M_ERR, M_ERRNO, M_FATAL, msg, NE32_PERSIST_EVENT, NE32_WRITE_EVENT, rw_handle::read, and rw_handle::write.
Referenced by net_event_win32_start(), and socket_listen_event_handle().
bool init_security_attributes_allow_all | ( | struct security_attributes * | obj | ) |
Definition at line 152 of file win32.c.
References CLEAR, security_attributes::sa, and security_attributes::sd.
Referenced by semaphore_open(), tap_allow_nonadmin_access_handle(), and win32_signal_open().
void init_win32 | ( | void | ) |
Definition at line 109 of file win32.c.
References M_ERR, msg, set_openssl_env_vars(), win32_signal_clear(), window_title_clear(), and wsa_state.
Referenced by init_static().
|
static |
Definition at line 544 of file win32.c.
References ASSERT, HANDLE_DEFINED, win32_signal::in, win32_signal::mode, rw_handle::read, and WSO_MODE_CONSOLE.
Referenced by win32_keyboard_get().
|
static |
Definition at line 559 of file win32.c.
Referenced by win32_keyboard_get().
void net_event_win32_close | ( | struct net_event_win32 * | ne | ) |
Definition at line 375 of file win32.c.
References close_net_event_win32(), net_event_win32::handle, net_event_win32_defined(), net_event_win32_init(), and net_event_win32::sd.
Referenced by man_connection_close().
void net_event_win32_init | ( | struct net_event_win32 * | ne | ) |
Definition at line 324 of file win32.c.
References CLEAR, net_event_win32::sd, and SOCKET_UNDEFINED.
Referenced by man_connection_init(), and net_event_win32_close().
void net_event_win32_reset | ( | struct net_event_win32 * | ne | ) |
Definition at line 358 of file win32.c.
References net_event_win32::event_mask, net_event_win32::handle, reset_net_event_win32(), and net_event_win32::sd.
Referenced by management_io().
void net_event_win32_reset_write | ( | struct net_event_win32 * | ne | ) |
Definition at line 340 of file win32.c.
References net_event_win32::event_mask, net_event_win32::handle, M_ERRNO, M_WARN, msg, status, and rw_handle::write.
Referenced by management_socket_set().
void net_event_win32_start | ( | struct net_event_win32 * | ne, |
long | network_events, | ||
socket_descriptor_t | sd | ||
) |
Definition at line 331 of file win32.c.
References ASSERT, net_event_win32::event_mask, net_event_win32::handle, init_net_event_win32(), NE32_PERSIST_EVENT, NE32_WRITE_EVENT, net_event_win32::sd, and socket_defined().
Referenced by man_start_ne32().
void net_event_win32_stop | ( | struct net_event_win32 * | ne | ) |
Definition at line 364 of file win32.c.
References close_net_event_win32(), net_event_win32::event_mask, net_event_win32::handle, NE32_PERSIST_EVENT, net_event_win32_defined(), net_event_win32::sd, and SOCKET_UNDEFINED.
Referenced by man_stop_ne32().
void netcmd_semaphore_close | ( | void | ) |
Definition at line 852 of file win32.c.
References netcmd_semaphore, and semaphore_close().
Referenced by uninit_win32().
void netcmd_semaphore_init | ( | void | ) |
Definition at line 846 of file win32.c.
References netcmd_semaphore, PACKAGE, and semaphore_open().
Referenced by netcmd_semaphore_lock().
void netcmd_semaphore_lock | ( | void | ) |
Definition at line 858 of file win32.c.
References semaphore::hand, M_FATAL, msg, netcmd_semaphore, netcmd_semaphore_init(), and semaphore_lock().
Referenced by add_route(), delete_route(), exec_command(), and ipconfig_register_dns().
void netcmd_semaphore_release | ( | void | ) |
Definition at line 874 of file win32.c.
References netcmd_semaphore, semaphore_close(), and semaphore_release().
Referenced by add_route(), delete_route(), exec_command(), and ipconfig_register_dns().
Definition at line 1001 of file win32.c.
Referenced by openvpn_execve_check().
void overlapped_io_close | ( | struct overlapped_io * | o | ) |
Definition at line 189 of file win32.c.
References overlapped_io::buf_init, free_buf(), M_ERRNO, M_WARN, msg, and overlapped_io::overlapped.
Referenced by close_tun_handle(), and link_socket_close().
void overlapped_io_init | ( | struct overlapped_io * | o, |
const struct frame * | frame, | ||
BOOL | event_state | ||
) |
Definition at line 171 of file win32.c.
References alloc_buf_sock_tun(), overlapped_io::buf_init, CLEAR, M_ERR, msg, and overlapped_io::overlapped.
Referenced by init_tun_post(), and socket_frame_init().
char* overlapped_io_state_ascii | ( | const struct overlapped_io * | o | ) |
Definition at line 202 of file win32.c.
References overlapped_io::iostate, IOSTATE_IMMEDIATE_RETURN, IOSTATE_INITIAL, and IOSTATE_QUEUED.
Referenced by socket_stat(), and tun_stat().
bool plugin_in_trusted_dir | ( | const WCHAR * | plugin_path | ) |
Checks if a plugin is located in a trusted directory.
Verifies the plugin's path against a trusted directory, which is:
UNC paths are explicitly disallowed.
plugin_path | Normalized path to the plugin. |
true
if the plugin is in a trusted directory and not a UNC path; false
otherwise. Definition at line 1607 of file win32.c.
References get_openvpn_reg_value(), M_ERRNO, M_NONFATAL, M_WARN, and msg.
Referenced by plugin_init_item().
long reset_net_event_win32 | ( | struct rw_handle * | event, |
socket_descriptor_t | sd | ||
) |
Definition at line 262 of file win32.c.
References M_ERRNO, M_FATAL, msg, and rw_handle::read.
Referenced by net_event_win32_reset(), and socket_reset_listen_persistent().
void semaphore_clear | ( | struct semaphore * | s | ) |
void semaphore_close | ( | struct semaphore * | s | ) |
Definition at line 826 of file win32.c.
References D_SEMAPHORE, dmsg, semaphore::hand, semaphore::locked, semaphore::name, and semaphore_release().
Referenced by netcmd_semaphore_close(), and netcmd_semaphore_release().
bool semaphore_lock | ( | struct semaphore * | s, |
int | timeout_milliseconds | ||
) |
Definition at line 776 of file win32.c.
References ASSERT, D_SEMAPHORE, D_SEMAPHORE_LOW, dmsg, semaphore::hand, semaphore::locked, M_ERR, msg, semaphore::name, and status.
Referenced by netcmd_semaphore_lock().
void semaphore_open | ( | struct semaphore * | s, |
const char * | name | ||
) |
Definition at line 752 of file win32.c.
References D_SEMAPHORE, dmsg, semaphore::hand, init_security_attributes_allow_all(), semaphore::locked, M_ERRNO, M_WARN, msg, semaphore::name, and security_attributes::sa.
Referenced by netcmd_semaphore_init().
void semaphore_release | ( | struct semaphore * | s | ) |
Definition at line 810 of file win32.c.
References ASSERT, D_SEMAPHORE, dmsg, semaphore::hand, semaphore::locked, M_ERRNO, M_WARN, msg, and semaphore::name.
Referenced by netcmd_semaphore_release(), and semaphore_close().
bool send_msg_iservice | ( | HANDLE | pipe, |
const void * | data, | ||
size_t | size, | ||
ack_message_t * | ack, | ||
const char * | context | ||
) |
Definition at line 1480 of file win32.c.
References gc_free(), gc_new(), M_WARN, msg, and strerror_win32().
Referenced by do_address_service(), do_dns_domain_service(), do_dns_service(), do_route_service(), do_set_mtu_service(), do_wins_service(), register_dns_service(), service_enable_dhcp(), service_register_ring_buffers(), tuntap_set_ip_addr(), and win_wfp_block_service().
|
static |
Set OpenSSL environment variables to a safe directory.
Definition at line 1521 of file win32.c.
References get_openvpn_reg_value(), and SIZE.
Referenced by init_win32().
void set_pause_exit_win32 | ( | void | ) |
void set_win_sys_path | ( | const char * | newpath, |
struct env_set * | es | ||
) |
Definition at line 1120 of file win32.c.
References es, setenv_str(), string_alloc(), SYS_PATH_ENV_VAR_NAME, and win_sys_path.
Referenced by add_option(), and set_win_sys_path_via_env().
void set_win_sys_path_via_env | ( | struct env_set * | es | ) |
Definition at line 1128 of file win32.c.
References es, M_ERR, M_FATAL, msg, set_win_sys_path(), status, and SYS_PATH_ENV_VAR_NAME.
Referenced by openvpn_main().
void uninit_win32 | ( | void | ) |
Definition at line 122 of file win32.c.
References win32_signal::mode, netcmd_semaphore_close(), pause_exit_enabled, win32_pause(), win32_signal_close(), win32_signal_open(), win_sys_path, window_title_restore(), WSO_FORCE_CONSOLE, and WSO_MODE_UNDEF.
Referenced by openvpn_exit().
Definition at line 947 of file win32.c.
References alloc_buf_gc(), argv::argc, argv::argv, BSTR, buf_printf(), CC_ANY, CC_CRLF, CC_DOUBLE_QUOTE, CC_PRINT, CC_SPACE, check_malloc_return(), gc_malloc(), buffer::len, string_class(), string_mod(), and wide_string().
Referenced by openvpn_execve().
Definition at line 1331 of file win32.c.
References ARCH_AMD64, ARCH_ARM64, ARCH_NATIVE, ARCH_UNKNOWN, and ARCH_X86.
Referenced by win32_version_string().
|
static |
Definition at line 577 of file win32.c.
References ASSERT, HANDLE_DEFINED, win32_signal::in, keyboard_input_available(), keyboard_ir_to_key(), win32_signal::mode, rw_handle::read, and WSO_MODE_CONSOLE.
Referenced by win32_pause(), and win32_signal_get().
void win32_pause | ( | struct win32_signal * | ws | ) |
Definition at line 683 of file win32.c.
References HANDLE_DEFINED, win32_signal::in, M_INFO, M_NOPREFIX, win32_signal::mode, msg, rw_handle::read, win32_keyboard_get(), and WSO_MODE_CONSOLE.
Referenced by uninit_win32().
Definition at line 1398 of file win32.c.
References ARCH_AMD64, ARCH_ARM64, ARCH_UNKNOWN, ARCH_X86, and buf_printf().
Referenced by win32_version_string().
bool win32_service_interrupt | ( | struct win32_signal * | ws | ) |
Definition at line 625 of file win32.c.
References HANDLE_DEFINED, win32_signal::in, win32_signal::mode, rw_handle::read, and WSO_MODE_SERVICE.
Referenced by get_console_input_win32(), and win32_signal_get().
void win32_signal_clear | ( | struct win32_signal * | ws | ) |
void win32_signal_close | ( | struct win32_signal * | ws | ) |
Definition at line 605 of file win32.c.
References CLEAR, win32_signal::console_mode_save, win32_signal::console_mode_save_defined, HANDLE_DEFINED, win32_signal::in, M_ERR, win32_signal::mode, msg, rw_handle::read, and WSO_MODE_SERVICE.
Referenced by halt_non_edge_triggered_signals(), and uninit_win32().
int win32_signal_get | ( | struct win32_signal * | ws | ) |
Definition at line 639 of file win32.c.
References win32_signal::mode, siginfo_static, signal_info::signal_received, throw_signal(), win32_keyboard_get(), win32_service_interrupt(), WSO_MODE_CONSOLE, and WSO_MODE_SERVICE.
Referenced by get_signal(), and win32_sleep().
void win32_signal_open | ( | struct win32_signal * | ws, |
int | force, | ||
const char * | exit_event_name, | ||
bool | exit_event_initial_state | ||
) |
Definition at line 453 of file win32.c.
References CLEAR, win32_signal::console_mode_save, win32_signal::console_mode_save_defined, gc_free(), gc_new(), HANDLE_DEFINED, win32_signal::in, init_security_attributes_allow_all(), M_ERR, M_ERRNO, M_FATAL, M_WARN, win32_signal::mode, msg, rw_handle::read, security_attributes::sa, wide_string(), win_ctrl_handler(), rw_handle::write, WSO_FORCE_CONSOLE, WSO_FORCE_SERVICE, WSO_MODE_CONSOLE, WSO_MODE_SERVICE, WSO_MODE_UNDEF, and WSO_NOFORCE.
Referenced by pre_setup(), and uninit_win32().
void win32_sleep | ( | const int | n | ) |
Definition at line 1563 of file win32.c.
References HANDLE_DEFINED, win32_signal::in, now, rw_handle::read, status, update_time(), and win32_signal_get().
Referenced by management_sleep().
int win32_version_info | ( | void | ) |
Definition at line 1287 of file win32.c.
References M_FATAL, msg, WIN_10, WIN_7, WIN_8, WIN_8_1, WIN_VISTA, and WIN_XP.
Referenced by netsh_ifconfig_options(), netsh_set_dns6_servers(), and win32_version_string().
const char* win32_version_string | ( | struct gc_arena * | gc, |
bool | add_name | ||
) |
Definition at line 1424 of file win32.c.
References alloc_buf_gc(), ARCH_NATIVE, buf_printf(), buffer::data, M_NONFATAL, msg, win32_get_arch(), win32_print_arch(), win32_version_info(), WIN_10, WIN_7, WIN_8, WIN_8_1, WIN_VISTA, and WIN_XP.
Referenced by push_peer_info(), and show_windows_version().
|
static |
Definition at line 419 of file win32.c.
References D_LOW, msg, siginfo_static, signal_info::signal_received, throw_signal(), and win_trigger_event().
Referenced by win32_signal_open().
|
static |
|
static |
Definition at line 393 of file win32.c.
References CLEAR, HANDLE_DEFINED, win32_signal::in, M_ERRNO, M_WARN, win32_signal::mode, msg, rw_handle::read, and WSO_MODE_SERVICE.
Referenced by win_ctrl_handler().
bool win_wfp_block | ( | const NET_IFINDEX | index, |
const HANDLE | msg_channel, | ||
BOOL | dns_only | ||
) |
Definition at line 1211 of file win32.c.
References add_wfp_block_filters(), D_LOW, dmsg, get_interface_metric(), m_hEngineHandle, set_interface_metric(), status, tap_metric_v4, tap_metric_v6, WFP_BLOCK_IFACE_METRIC, win_get_exe_path(), win_wfp_block_service(), and win_wfp_msg_handler().
Referenced by add_wfp_block().
|
static |
Definition at line 1174 of file win32.c.
References ack_message_t::error_number, gc_free(), gc_new(), wfp_block_message_t::header, wfp_block_message_t::iface, interface_t::index, M_INFO, M_WARN, msg, msg_add_wfp_block, msg_del_wfp_block, send_msg_iservice(), strerror_win32(), wfp_block_dns, and wfp_block_local.
Referenced by win_wfp_block(), and win_wfp_uninit().
|
static |
Definition at line 1156 of file win32.c.
References gc_free(), gc_new(), M_INFO, M_WARN, msg, and strerror_win32().
Referenced by win_wfp_block().
bool win_wfp_uninit | ( | const NET_IFINDEX | index, |
const HANDLE | msg_channel | ||
) |
Definition at line 1260 of file win32.c.
References D_LOW, delete_wfp_block_filters(), dmsg, m_hEngineHandle, msg, set_interface_metric(), tap_metric_v4, tap_metric_v6, and win_wfp_block_service().
Referenced by del_wfp_block().
void window_title_clear | ( | struct window_title * | wt | ) |
void window_title_generate | ( | const char * | title | ) |
Definition at line 730 of file win32.c.
References alloc_buf_gc(), BSTR, buf_printf(), gc_free(), gc_new(), PACKAGE_NAME, and PACKAGE_VERSION.
Referenced by pre_setup().
void window_title_restore | ( | const struct window_title * | wt | ) |
Definition at line 721 of file win32.c.
References window_title::old_window_title, and window_title::saved.
Referenced by uninit_win32().
void window_title_save | ( | struct window_title * | wt | ) |
Definition at line 704 of file win32.c.
References window_title::old_window_title, and window_title::saved.
Referenced by pre_setup().
|
static |
Definition at line 58 of file win32.c.
Referenced by win_wfp_block(), and win_wfp_uninit().
struct semaphore netcmd_semaphore |
Definition at line 95 of file win32.c.
Referenced by netcmd_semaphore_close(), netcmd_semaphore_init(), netcmd_semaphore_lock(), and netcmd_semaphore_release().
|
static |
Definition at line 74 of file win32.c.
Referenced by set_pause_exit_win32(), and uninit_win32().
|
static |
Definition at line 63 of file win32.c.
Referenced by win_wfp_block(), and win_wfp_uninit().
|
static |
Definition at line 64 of file win32.c.
Referenced by win_wfp_block(), and win_wfp_uninit().
struct win32_signal win32_signal |
|
static |
Definition at line 100 of file win32.c.
Referenced by get_win_sys_path(), set_win_sys_path(), and uninit_win32().
struct window_title window_title |
|
static |
Definition at line 69 of file win32.c.
Referenced by init_win32().