OpenVPN
|
#include <iphlpapi.h>
#include <ws2tcpip.h>
#include "syshead.h"
#include "mtu.h"
#include "openvpn-msg.h"
#include "argv.h"
#include "win32-util.h"
Go to the source code of this file.
Data Structures | |
struct | security_attributes |
struct | window_title |
struct | rw_handle |
struct | net_event_win32 |
struct | win32_signal |
struct | overlapped_io |
struct | semaphore |
Macros | |
#define | SYS_PATH_ENV_VAR_NAME "SystemRoot" /* environmental variable name that normally contains the system path */ |
#define | NETSH_PATH_SUFFIX "\\system32\\netsh.exe" |
#define | WIN_ROUTE_PATH_SUFFIX "\\system32\\route.exe" |
#define | WIN_IPCONFIG_PATH_SUFFIX "\\system32\\ipconfig.exe" |
#define | WIN_NET_PATH_SUFFIX "\\system32\\net.exe" |
#define | WMIC_PATH_SUFFIX "\\system32\\wbem\\wmic.exe" |
#define | IN6_ARE_ADDR_EQUAL(a, b) (memcmp((const void *)(a), (const void *)(b), sizeof(struct in6_addr)) == 0) |
#define | HANDLE_DEFINED(h) ((h) != NULL && (h) != INVALID_HANDLE_VALUE) |
#define | NE32_PERSIST_EVENT (1<<0) |
#define | NE32_WRITE_EVENT (1<<1) |
#define | WSO_MODE_UNDEF 0 |
#define | WSO_MODE_SERVICE 1 |
#define | WSO_MODE_CONSOLE 2 |
#define | WSO_NOFORCE 0 |
#define | WSO_FORCE_SERVICE 1 |
#define | WSO_FORCE_CONSOLE 2 |
#define | IOSTATE_INITIAL 0 |
#define | IOSTATE_QUEUED 1 /* overlapped I/O has been queued */ |
#define | IOSTATE_IMMEDIATE_RETURN 2 /* I/O function returned immediately without queueing */ |
#define | WIN_XP 0 |
#define | WIN_VISTA 1 |
#define | WIN_7 2 |
#define | WIN_8 3 |
#define | WIN_8_1 4 |
#define | WIN_10 5 |
Functions | |
void | init_win32 (void) |
void | uninit_win32 (void) |
void | set_pause_exit_win32 (void) |
static bool | defined_net_event_win32 (const struct rw_handle *event) |
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 (struct net_event_win32 *ne) |
void | net_event_win32_reset_write (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 bool | net_event_win32_defined (const struct net_event_win32 *ne) |
static struct rw_handle * | net_event_win32_get_event (struct net_event_win32 *ne) |
static long | net_event_win32_get_event_mask (const struct net_event_win32 *ne) |
static void | net_event_win32_clear_selected_events (struct net_event_win32 *ne, long selected_events) |
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) |
void | win32_signal_close (struct win32_signal *ws) |
int | win32_signal_get (struct win32_signal *ws) |
void | win32_pause (struct win32_signal *ws) |
bool | win32_service_interrupt (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 | overlapped_io_init (struct overlapped_io *o, const struct frame *frame, BOOL event_state) |
void | overlapped_io_close (struct overlapped_io *o) |
static bool | overlapped_io_active (struct overlapped_io *o) |
char * | overlapped_io_state_ascii (const struct overlapped_io *o) |
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) |
bool | init_security_attributes_allow_all (struct security_attributes *obj) |
void | set_win_sys_path (const char *newpath, struct env_set *es) |
void | set_win_sys_path_via_env (struct env_set *es) |
char * | get_win_sys_path (void) |
void | fork_to_self (const char *cmdline) |
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) |
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) |
int | openvpn_execve (const struct argv *a, const struct env_set *es, const unsigned int flags) |
void | win32_sleep (const int n) |
bool | get_openvpn_reg_value (const WCHAR *key, WCHAR *value, DWORD size) |
Fetches a registry value for OpenVPN registry key. More... | |
bool | plugin_in_trusted_dir (const WCHAR *plugin_path) |
Checks if a plugin is located in a trusted directory. More... | |
Variables | |
struct win32_signal | win32_signal |
struct window_title | window_title |
struct semaphore | netcmd_semaphore |
#define HANDLE_DEFINED | ( | h | ) | ((h) != NULL && (h) != INVALID_HANDLE_VALUE) |
#define IN6_ARE_ADDR_EQUAL | ( | a, | |
b | |||
) | (memcmp((const void *)(a), (const void *)(b), sizeof(struct in6_addr)) == 0) |
#define IOSTATE_IMMEDIATE_RETURN 2 /* I/O function returned immediately without queueing */ |
#define IOSTATE_QUEUED 1 /* overlapped I/O has been queued */ |
#define SYS_PATH_ENV_VAR_NAME "SystemRoot" /* environmental variable name that normally contains the system path */ |
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().
|
inlinestatic |
Definition at line 92 of file win32.h.
Referenced by net_event_win32_defined(), and socket_listen_event_handle().
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().
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().
|
inlinestatic |
Definition at line 145 of file win32.h.
References net_event_win32::event_mask.
Referenced by management_io().
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().
|
inlinestatic |
Definition at line 127 of file win32.h.
References defined_net_event_win32(), and net_event_win32::handle.
Referenced by net_event_win32_close(), and net_event_win32_stop().
|
inlinestatic |
Definition at line 133 of file win32.h.
References net_event_win32::handle.
Referenced by management_socket_set().
|
inlinestatic |
Definition at line 139 of file win32.h.
References net_event_win32::event_mask.
Referenced by management_io().
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.
References argv::argv, ASSERT, CLEAR, env_block(), es, gc_free(), gc_new(), M_ERRNO, M_WARN, msg, openvpn_execve_allowed(), OPENVPN_EXECVE_ERROR, OPENVPN_EXECVE_NOT_ALLOWED, script_security(), SCRIPT_SECURITY_WARNING, SSEC_SCRIPTS, wide_cmd_line(), and wide_string().
Referenced by openvpn_execve_check().
|
inlinestatic |
Definition at line 228 of file win32.h.
References overlapped_io::iostate, IOSTATE_IMMEDIATE_RETURN, and IOSTATE_QUEUED.
Referenced by link_socket_write_win32(), and tun_write_win32().
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().
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().
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().
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().
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().
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().
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().
struct win32_signal win32_signal |
struct window_title window_title |