30GetRegString(HKEY
key, LPCWSTR value, LPWSTR data, DWORD size, LPCWSTR default_value)
32 LONG
status = RegGetValue(
key, NULL, value, RRF_RT_REG_SZ, NULL, (LPBYTE)data, &size);
34 if (
status == ERROR_FILE_NOT_FOUND && default_value)
36 size_t len = size /
sizeof(data[0]);
37 if (swprintf(data, len, default_value))
43 if (
status != ERROR_SUCCESS)
48 L
"Error querying registry value: HKLM\\SOFTWARE\\" _L(PACKAGE_NAME) L
"%ls\\%ls",
64 WCHAR install_path[MAX_PATH];
65 WCHAR default_value[MAX_PATH];
67 swprintf(reg_path, _countof(reg_path), L
"SOFTWARE\\" _L(PACKAGE_NAME) L
"%ls",
service_instance);
69 LONG
status = RegOpenKeyEx(HKEY_LOCAL_MACHINE, reg_path, 0, KEY_READ, &
key);
70 if (
status != ERROR_SUCCESS)
79 if (
status != ERROR_SUCCESS)
85 swprintf(default_value, _countof(default_value), L
"%ls\\bin\\openvpn.exe", install_path);
87 if (error != ERROR_SUCCESS)
92 swprintf(default_value, _countof(default_value), L
"%ls\\config", install_path);
94 if (error != ERROR_SUCCESS)
99 swprintf(default_value, _countof(default_value), L
"%ls\\bin", install_path);
101 if (error != ERROR_SUCCESS)
107 if (error != ERROR_SUCCESS)
112 swprintf(default_value, _countof(default_value), L
"%ls\\log", install_path);
114 if (error != ERROR_SUCCESS)
119 error =
GetRegString(
key, L
"priority", priority,
sizeof(priority), L
"NORMAL_PRIORITY_CLASS");
120 if (error != ERROR_SUCCESS)
125 error =
GetRegString(
key, L
"log_append", append,
sizeof(append), L
"0");
126 if (error != ERROR_SUCCESS)
134 if (error != ERROR_SUCCESS)
141 if (error != ERROR_SUCCESS)
147 if (!_wcsicmp(priority, L
"IDLE_PRIORITY_CLASS"))
151 else if (!_wcsicmp(priority, L
"BELOW_NORMAL_PRIORITY_CLASS"))
153 s->
priority = BELOW_NORMAL_PRIORITY_CLASS;
155 else if (!_wcsicmp(priority, L
"NORMAL_PRIORITY_CLASS"))
157 s->
priority = NORMAL_PRIORITY_CLASS;
159 else if (!_wcsicmp(priority, L
"ABOVE_NORMAL_PRIORITY_CLASS"))
161 s->
priority = ABOVE_NORMAL_PRIORITY_CLASS;
163 else if (!_wcsicmp(priority, L
"HIGH_PRIORITY_CLASS"))
169 SetLastError(ERROR_INVALID_DATA);
175 if (append[0] == L
'0')
179 else if (append[0] == L
'1')
185 SetLastError(ERROR_INVALID_DATA);
186 error =
MsgToEventLog(
M_ERR, L
"Log file append flag (given as '%ls') must be '0' or '1'",
201 static WCHAR buf[256];
205 error = GetLastError();
206 len = FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM
207 | FORMAT_MESSAGE_ARGUMENT_ARRAY,
208 NULL, error, LANG_NEUTRAL, tmp, 0, NULL);
210 if (len == 0 || (
long)_countof(buf) < (
long)len + 14)
216 tmp[wcslen(tmp) - 2] = L
'\0';
217 swprintf(buf, _countof(buf), L
"%ls (0x%x)", tmp, error);
235 LPCWSTR err_msg = L
"";
240 error = GetLastError();
244 hEventSource = RegisterEventSource(NULL,
APPNAME);
245 if (hEventSource != NULL)
250 va_start(arglist, format);
251 vswprintf(
msg[1], _countof(
msg[1]), format, arglist);
254 const WCHAR *mesg[] = {
msg[0],
msg[1] };
255 ReportEvent(hEventSource,
256 flags &
MSG_FLAGS_ERROR ? EVENTLOG_ERROR_TYPE : EVENTLOG_INFORMATION_TYPE, 0, 0,
257 NULL, 2, 0, mesg, NULL);
258 DeregisterEventSource(hEventSource);
267 int n = MultiByteToWideChar(CP_UTF8, 0, utf8, size, NULL, 0);
268 wchar_t *utf16 = malloc(n *
sizeof(
wchar_t));
273 MultiByteToWideChar(CP_UTF8, 0, utf8, size, utf16, n);