mirror of https://github.com/OpenVPN/openvpn-gui
Support for openvpn3
This adds optional support for using OpenVPN3 client as an alternative to openvpn2. Just replacing one client with another will not work: - OpenVPN3 doesn't use interactive service, it uses "agent" service with completely different protocol. OpenVPN GUI needs to talk to agent using HTTP and JSON. - OpenVPN3 management interface realtime notifications must be explicitly turned on in order for GUI to work. To enable using openvpn3, one needs to build openvpn-gui with ./configure --enable-ovpn3 option. This also requires json-c library. To switch betweet openvpn2 and openvpn3, see "OpenVPN Engine" radiobutton group in Settings -> Advanced dialog. Management interface - enabled OpenVPN3 client will be added soon to openvpn3 repo (along with existing "cli" test client). Also agent service will be opensourced in near future. Signed-off-by: Lev Stipakov <lev@openvpn.net>pull/506/head
parent
b696a7c16d
commit
45520e7f6d
|
@ -38,7 +38,7 @@ dist_doc_DATA = \
|
||||||
COPYRIGHT.GPL \
|
COPYRIGHT.GPL \
|
||||||
COPYING
|
COPYING
|
||||||
|
|
||||||
AM_CPPFLAGS = $(OPENSSL_CRYPTO_CFLAGS) -D_UNICODE
|
AM_CPPFLAGS = $(OPENSSL_CRYPTO_CFLAGS) -D_UNICODE $(JSON_CFLAGS)
|
||||||
AM_CFLAGS = -municode
|
AM_CFLAGS = -municode
|
||||||
|
|
||||||
openvpn_gui_RESOURCES = \
|
openvpn_gui_RESOURCES = \
|
||||||
|
@ -106,7 +106,9 @@ openvpn_gui_LDADD = \
|
||||||
-lnetapi32 \
|
-lnetapi32 \
|
||||||
-lole32 \
|
-lole32 \
|
||||||
-lshlwapi \
|
-lshlwapi \
|
||||||
-lsecur32
|
-lsecur32 \
|
||||||
|
$(JSON_LIBS)
|
||||||
|
|
||||||
openvpn-gui-res.o: $(openvpn_gui_RESOURCES) $(srcdir)/openvpn-gui-res.h
|
openvpn-gui-res.o: $(openvpn_gui_RESOURCES) $(srcdir)/openvpn-gui-res.h
|
||||||
$(RCCOMPILE) -i $< -o $@
|
$(RCCOMPILE) -i $< -o $@
|
||||||
|
|
||||||
|
|
|
@ -49,6 +49,15 @@ AC_ARG_ENABLE(
|
||||||
[enable_password_change="yes"]
|
[enable_password_change="yes"]
|
||||||
)
|
)
|
||||||
|
|
||||||
|
AC_ARG_ENABLE(
|
||||||
|
[ovpn3],
|
||||||
|
[AS_HELP_STRING([--enable-ovpn3], [enable openvpn3 agent and client @<:@default=no@:>@])],
|
||||||
|
[
|
||||||
|
AC_DEFINE([ENABLE_OVPN3], 1, [Use openvpn3 agent instead of interactive service])
|
||||||
|
PKG_CHECK_MODULES([JSON], [json-c])
|
||||||
|
]
|
||||||
|
)
|
||||||
|
|
||||||
case "$host" in
|
case "$host" in
|
||||||
*-mingw*)
|
*-mingw*)
|
||||||
CPPFLAGS="${CPPFLAGS} -DWIN32_LEAN_AND_MEAN"
|
CPPFLAGS="${CPPFLAGS} -DWIN32_LEAN_AND_MEAN"
|
||||||
|
|
7
manage.c
7
manage.c
|
@ -271,6 +271,13 @@ OnManagement(SOCKET sk, LPARAM lParam)
|
||||||
{
|
{
|
||||||
ManagementCommand(c, c->manage.password, NULL, regular);
|
ManagementCommand(c, c->manage.password, NULL, regular);
|
||||||
*c->manage.password = '\0';
|
*c->manage.password = '\0';
|
||||||
|
|
||||||
|
if (o.ovpn_engine == OPENVPN_ENGINE_OVPN3)
|
||||||
|
{
|
||||||
|
ManagementCommand(c, "log on all", NULL, regular);
|
||||||
|
ManagementCommand(c, "state on all", NULL, regular);
|
||||||
|
}
|
||||||
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -118,6 +118,9 @@
|
||||||
#define ID_EDT_PRECONNECT_TIMEOUT 282
|
#define ID_EDT_PRECONNECT_TIMEOUT 282
|
||||||
#define ID_EDT_CONNECT_TIMEOUT 283
|
#define ID_EDT_CONNECT_TIMEOUT 283
|
||||||
#define ID_EDT_DISCONNECT_TIMEOUT 284
|
#define ID_EDT_DISCONNECT_TIMEOUT 284
|
||||||
|
#define ID_RB_ENGINE_SELECTION 285
|
||||||
|
#define ID_RB_ENGINE_OVPN2 286
|
||||||
|
#define ID_RB_ENGINE_OVPN3 287
|
||||||
|
|
||||||
/* Connections dialog */
|
/* Connections dialog */
|
||||||
#define ID_DLG_CONNECTIONS 290
|
#define ID_DLG_CONNECTIONS 290
|
||||||
|
|
|
@ -9,12 +9,18 @@ Global
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
Debug|x64 = Debug|x64
|
Debug|x64 = Debug|x64
|
||||||
Debug|x86 = Debug|x86
|
Debug|x86 = Debug|x86
|
||||||
|
DebugOvpn3|x64 = DebugOvpn3|x64
|
||||||
|
DebugOvpn3|x86 = DebugOvpn3|x86
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||||
{028B1211-5625-48F7-B2D7-98C2F1994A70}.Debug|x64.ActiveCfg = Debug|x64
|
{028B1211-5625-48F7-B2D7-98C2F1994A70}.Debug|x64.ActiveCfg = Debug|x64
|
||||||
{028B1211-5625-48F7-B2D7-98C2F1994A70}.Debug|x64.Build.0 = Debug|x64
|
{028B1211-5625-48F7-B2D7-98C2F1994A70}.Debug|x64.Build.0 = Debug|x64
|
||||||
{028B1211-5625-48F7-B2D7-98C2F1994A70}.Debug|x86.ActiveCfg = Debug|x64
|
{028B1211-5625-48F7-B2D7-98C2F1994A70}.Debug|x86.ActiveCfg = Debug|x64
|
||||||
{028B1211-5625-48F7-B2D7-98C2F1994A70}.Debug|x86.Build.0 = Debug|x64
|
{028B1211-5625-48F7-B2D7-98C2F1994A70}.Debug|x86.Build.0 = Debug|x64
|
||||||
|
{028B1211-5625-48F7-B2D7-98C2F1994A70}.DebugOvpn3|x64.ActiveCfg = DebugOvpn3|x64
|
||||||
|
{028B1211-5625-48F7-B2D7-98C2F1994A70}.DebugOvpn3|x64.Build.0 = DebugOvpn3|x64
|
||||||
|
{028B1211-5625-48F7-B2D7-98C2F1994A70}.DebugOvpn3|x86.ActiveCfg = DebugOvpn3|Win32
|
||||||
|
{028B1211-5625-48F7-B2D7-98C2F1994A70}.DebugOvpn3|x86.Build.0 = DebugOvpn3|Win32
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(SolutionProperties) = preSolution
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
HideSolutionNode = FALSE
|
HideSolutionNode = FALSE
|
||||||
|
|
|
@ -1,6 +1,14 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
<ItemGroup Label="ProjectConfigurations">
|
<ItemGroup Label="ProjectConfigurations">
|
||||||
|
<ProjectConfiguration Include="DebugOvpn3|Win32">
|
||||||
|
<Configuration>DebugOvpn3</Configuration>
|
||||||
|
<Platform>Win32</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="DebugOvpn3|x64">
|
||||||
|
<Configuration>DebugOvpn3</Configuration>
|
||||||
|
<Platform>x64</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
<ProjectConfiguration Include="Debug|Win32">
|
<ProjectConfiguration Include="Debug|Win32">
|
||||||
<Configuration>Debug</Configuration>
|
<Configuration>Debug</Configuration>
|
||||||
<Platform>Win32</Platform>
|
<Platform>Win32</Platform>
|
||||||
|
@ -29,6 +37,11 @@
|
||||||
<UseDebugLibraries>true</UseDebugLibraries>
|
<UseDebugLibraries>true</UseDebugLibraries>
|
||||||
<PlatformToolset>v142</PlatformToolset>
|
<PlatformToolset>v142</PlatformToolset>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugOvpn3|Win32'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<UseDebugLibraries>true</UseDebugLibraries>
|
||||||
|
<PlatformToolset>v142</PlatformToolset>
|
||||||
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||||
<ConfigurationType>Application</ConfigurationType>
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
<UseDebugLibraries>false</UseDebugLibraries>
|
<UseDebugLibraries>false</UseDebugLibraries>
|
||||||
|
@ -39,6 +52,11 @@
|
||||||
<UseDebugLibraries>true</UseDebugLibraries>
|
<UseDebugLibraries>true</UseDebugLibraries>
|
||||||
<PlatformToolset>v142</PlatformToolset>
|
<PlatformToolset>v142</PlatformToolset>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugOvpn3|x64'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<UseDebugLibraries>true</UseDebugLibraries>
|
||||||
|
<PlatformToolset>v142</PlatformToolset>
|
||||||
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
||||||
<ConfigurationType>Application</ConfigurationType>
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
<UseDebugLibraries>false</UseDebugLibraries>
|
<UseDebugLibraries>false</UseDebugLibraries>
|
||||||
|
@ -52,12 +70,18 @@
|
||||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
</ImportGroup>
|
</ImportGroup>
|
||||||
|
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugOvpn3|Win32'" Label="PropertySheets">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
</ImportGroup>
|
</ImportGroup>
|
||||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
</ImportGroup>
|
</ImportGroup>
|
||||||
|
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugOvpn3|x64'" Label="PropertySheets">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
</ImportGroup>
|
</ImportGroup>
|
||||||
|
@ -65,12 +89,18 @@
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
<LinkIncremental>true</LinkIncremental>
|
<LinkIncremental>true</LinkIncremental>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugOvpn3|Win32'">
|
||||||
|
<LinkIncremental>true</LinkIncremental>
|
||||||
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
<LinkIncremental>true</LinkIncremental>
|
<LinkIncremental>true</LinkIncremental>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||||
<GenerateManifest>false</GenerateManifest>
|
<GenerateManifest>false</GenerateManifest>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugOvpn3|x64'">
|
||||||
|
<GenerateManifest>false</GenerateManifest>
|
||||||
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||||
<GenerateManifest>false</GenerateManifest>
|
<GenerateManifest>false</GenerateManifest>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
@ -88,6 +118,20 @@
|
||||||
<SubSystem>Windows</SubSystem>
|
<SubSystem>Windows</SubSystem>
|
||||||
</Link>
|
</Link>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugOvpn3|Win32'">
|
||||||
|
<ClCompile>
|
||||||
|
<PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
|
||||||
|
<Optimization>Disabled</Optimization>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<TargetMachine>MachineX86</TargetMachine>
|
||||||
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
<SubSystem>Windows</SubSystem>
|
||||||
|
</Link>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
<ClCompile>
|
<ClCompile>
|
||||||
<PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
<PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
@ -123,6 +167,26 @@
|
||||||
<Command>copy config-msvc.h config.h</Command>
|
<Command>copy config-msvc.h config.h</Command>
|
||||||
</PreBuildEvent>
|
</PreBuildEvent>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugOvpn3|x64'">
|
||||||
|
<ClCompile>
|
||||||
|
<PreprocessorDefinitions>WIN32_LEAN_AND_MEAN;UNICODE;_UNICODE;_INC_MATH;_CRT_NON_CONFORMING_WCSTOK;HAVE_CONFIG_H;ENABLE_OVPN3</PreprocessorDefinitions>
|
||||||
|
<UndefinePreprocessorDefinitions>
|
||||||
|
</UndefinePreprocessorDefinitions>
|
||||||
|
<AdditionalIncludeDirectories>$(SolutionDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
|
</ClCompile>
|
||||||
|
<ResourceCompile>
|
||||||
|
<AdditionalIncludeDirectories>$(SolutionDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
|
<SuppressStartupBanner>false</SuppressStartupBanner>
|
||||||
|
<ResourceOutputFileName>openvpn-gui-res.rc</ResourceOutputFileName>
|
||||||
|
<PreprocessorDefinitions>HAVE_CONFIG_H;_MSC_VER</PreprocessorDefinitions>
|
||||||
|
</ResourceCompile>
|
||||||
|
<Link>
|
||||||
|
<AdditionalDependencies>Netapi32.lib;Wtsapi32.lib;Comctl32.lib;Secur32.lib;Ws2_32.lib;Crypt32.lib;Shlwapi.lib;Winhttp.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
|
</Link>
|
||||||
|
<PreBuildEvent>
|
||||||
|
<Command>copy config-msvc.h config.h</Command>
|
||||||
|
</PreBuildEvent>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||||
<PreBuildEvent>
|
<PreBuildEvent>
|
||||||
<Command>copy config-msvc.h config.h</Command>
|
<Command>copy config-msvc.h config.h</Command>
|
||||||
|
|
118
openvpn.c
118
openvpn.c
|
@ -35,6 +35,10 @@
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
#include <commctrl.h>
|
#include <commctrl.h>
|
||||||
|
|
||||||
|
#ifdef ENABLE_OVPN3
|
||||||
|
#include <json-c/json.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#include "tray.h"
|
#include "tray.h"
|
||||||
#include "main.h"
|
#include "main.h"
|
||||||
#include "openvpn.h"
|
#include "openvpn.h"
|
||||||
|
@ -51,6 +55,9 @@
|
||||||
#include "save_pass.h"
|
#include "save_pass.h"
|
||||||
#include "env_set.h"
|
#include "env_set.h"
|
||||||
|
|
||||||
|
#define OPENVPN_SERVICE_PIPE_NAME_OVPN2 L"\\\\.\\pipe\\openvpn\\service"
|
||||||
|
#define OPENVPN_SERVICE_PIPE_NAME_OVPN3 L"\\\\.\\pipe\\ovpnagent"
|
||||||
|
|
||||||
extern options_t o;
|
extern options_t o;
|
||||||
|
|
||||||
static BOOL
|
static BOOL
|
||||||
|
@ -1316,7 +1323,8 @@ CloseServiceIO (service_io_t *s)
|
||||||
static BOOL
|
static BOOL
|
||||||
InitServiceIO (service_io_t *s)
|
InitServiceIO (service_io_t *s)
|
||||||
{
|
{
|
||||||
DWORD dwMode = PIPE_READMODE_MESSAGE;
|
DWORD dwMode = o.ovpn_engine == OPENVPN_ENGINE_OVPN3 ? PIPE_READMODE_BYTE : PIPE_READMODE_MESSAGE;
|
||||||
|
|
||||||
CLEAR(*s);
|
CLEAR(*s);
|
||||||
|
|
||||||
/* auto-reset event used for signalling i/o completion*/
|
/* auto-reset event used for signalling i/o completion*/
|
||||||
|
@ -1326,8 +1334,9 @@ InitServiceIO (service_io_t *s)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
s->pipe = CreateFile(_T("\\\\.\\pipe\\openvpn\\service"),
|
s->pipe = CreateFile (o.ovpn_engine == OPENVPN_ENGINE_OVPN3 ?
|
||||||
GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);
|
OPENVPN_SERVICE_PIPE_NAME_OVPN3 : OPENVPN_SERVICE_PIPE_NAME_OVPN2,
|
||||||
|
GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);
|
||||||
|
|
||||||
if ( !s->pipe ||
|
if ( !s->pipe ||
|
||||||
s->pipe == INVALID_HANDLE_VALUE ||
|
s->pipe == INVALID_HANDLE_VALUE ||
|
||||||
|
@ -1861,6 +1870,57 @@ SetProcessPriority(DWORD *priority)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef ENABLE_OVPN3
|
||||||
|
inline static
|
||||||
|
struct json_object* json_object_new_utf16_string(wchar_t *utf16)
|
||||||
|
{
|
||||||
|
DWORD input_size = WideCharToMultiByte(CP_UTF8, 0, utf16, -1, NULL, 0, NULL, NULL);
|
||||||
|
struct json_object* jobj = NULL;
|
||||||
|
char *utf8 = malloc(input_size);
|
||||||
|
if (!utf8)
|
||||||
|
{
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
WideCharToMultiByte(CP_UTF8, 0, utf16, -1, utf8, input_size, NULL, NULL);
|
||||||
|
|
||||||
|
jobj = json_object_new_string(utf8);
|
||||||
|
free(utf8);
|
||||||
|
|
||||||
|
out:
|
||||||
|
return jobj;
|
||||||
|
}
|
||||||
|
|
||||||
|
static char* PrepareStartJsonRequest(connection_t *c, wchar_t *exit_event_name)
|
||||||
|
{
|
||||||
|
const char *request_header = "POST /start HTTP/1.1\r\nContent-Type: application/json\r\nContent-Length: %zd\r\n\r\n";
|
||||||
|
json_object *jobj = json_object_new_object();
|
||||||
|
|
||||||
|
json_object_object_add(jobj, "config_file", json_object_new_utf16_string(c->config_file));
|
||||||
|
json_object_object_add(jobj, "config_dir", json_object_new_utf16_string(c->config_dir));
|
||||||
|
json_object_object_add(jobj, "exit_event_name", json_object_new_utf16_string(exit_event_name));
|
||||||
|
json_object_object_add(jobj, "management_password", json_object_new_string(c->manage.password));
|
||||||
|
json_object_object_add(jobj, "management_host", json_object_new_string(inet_ntoa(c->manage.skaddr.sin_addr)));
|
||||||
|
json_object_object_add(jobj, "management_port", json_object_new_int(ntohs(c->manage.skaddr.sin_port)));
|
||||||
|
json_object_object_add(jobj, "log", json_object_new_utf16_string(c->log_path));
|
||||||
|
json_object_object_add(jobj, "log-append", json_object_new_int(o.log_append));
|
||||||
|
|
||||||
|
const char *body = json_object_to_json_string(jobj);
|
||||||
|
|
||||||
|
char *request = calloc(1, strlen(request_header) + strlen(body) + 1);
|
||||||
|
if (request == NULL)
|
||||||
|
{
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
sprintf(request, request_header, strlen(body));
|
||||||
|
strcat(request, body);
|
||||||
|
|
||||||
|
out:
|
||||||
|
json_object_put(jobj);
|
||||||
|
return request;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Launch an OpenVPN process and the accompanying thread to monitor it
|
* Launch an OpenVPN process and the accompanying thread to monitor it
|
||||||
*/
|
*/
|
||||||
|
@ -1928,28 +1988,44 @@ StartOpenVPN(connection_t *c)
|
||||||
/* Try to open the service pipe */
|
/* Try to open the service pipe */
|
||||||
if (!IsUserAdmin() && InitServiceIO (&c->iserv))
|
if (!IsUserAdmin() && InitServiceIO (&c->iserv))
|
||||||
{
|
{
|
||||||
DWORD size = _tcslen(c->config_dir) + _tcslen(options) + sizeof(c->manage.password) + 3;
|
BOOL res = FALSE;
|
||||||
TCHAR startup_info[1024];
|
|
||||||
|
|
||||||
if ( !AuthorizeConfig(c))
|
if (o.ovpn_engine == OPENVPN_ENGINE_OVPN3)
|
||||||
{
|
{
|
||||||
CloseHandle(c->exit_event);
|
#ifdef ENABLE_OVPN3
|
||||||
CloseServiceIO(&c->iserv);
|
char *request = PrepareStartJsonRequest(c, exit_event_name);
|
||||||
goto out;
|
|
||||||
|
res = (request != NULL) && WritePipe(c->iserv.pipe, request, strlen(request));
|
||||||
|
free(request);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
DWORD size = _tcslen(c->config_dir) + _tcslen(options) + sizeof(c->manage.password) + 3;
|
||||||
|
TCHAR startup_info[1024];
|
||||||
|
|
||||||
|
if (!AuthorizeConfig(c))
|
||||||
|
{
|
||||||
|
CloseHandle(c->exit_event);
|
||||||
|
CloseServiceIO(&c->iserv);
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
c->hProcess = NULL;
|
||||||
|
c->manage.password[sizeof(c->manage.password) - 1] = '\n';
|
||||||
|
|
||||||
|
/* Ignore pushed route-method when service is in use */
|
||||||
|
const wchar_t* extra_options = L" --pull-filter ignore route-method";
|
||||||
|
size += wcslen(extra_options);
|
||||||
|
|
||||||
|
_sntprintf_0(startup_info, L"%s%c%s%s%c%.*S", c->config_dir, L'\0',
|
||||||
|
options, extra_options, L'\0', sizeof(c->manage.password), c->manage.password);
|
||||||
|
c->manage.password[sizeof(c->manage.password) - 1] = '\0';
|
||||||
|
|
||||||
|
res = WritePipe(c->iserv.pipe, startup_info, size * sizeof(TCHAR));
|
||||||
}
|
}
|
||||||
|
|
||||||
c->hProcess = NULL;
|
if (!res)
|
||||||
c->manage.password[sizeof(c->manage.password) - 1] = '\n';
|
|
||||||
|
|
||||||
/* Ignore pushed route-method when service is in use */
|
|
||||||
const wchar_t *extra_options = L" --pull-filter ignore route-method";
|
|
||||||
size += wcslen(extra_options);
|
|
||||||
|
|
||||||
_sntprintf_0(startup_info, L"%s%c%s%s%c%.*S", c->config_dir, L'\0',
|
|
||||||
options, extra_options, L'\0', sizeof(c->manage.password), c->manage.password);
|
|
||||||
c->manage.password[sizeof(c->manage.password) - 1] = '\0';
|
|
||||||
|
|
||||||
if (!WritePipe(c->iserv.pipe, startup_info, size * sizeof (TCHAR)))
|
|
||||||
{
|
{
|
||||||
ShowLocalizedMsg (IDS_ERR_WRITE_SERVICE_PIPE);
|
ShowLocalizedMsg (IDS_ERR_WRITE_SERVICE_PIPE);
|
||||||
CloseHandle(c->exit_event);
|
CloseHandle(c->exit_event);
|
||||||
|
|
11
options.c
11
options.c
|
@ -540,6 +540,9 @@ SaveAdvancedDlgParams (HWND hdlg)
|
||||||
tmp = GetDlgItemInt (hdlg, ID_EDT_DISCONNECT_TIMEOUT, &status, FALSE);
|
tmp = GetDlgItemInt (hdlg, ID_EDT_DISCONNECT_TIMEOUT, &status, FALSE);
|
||||||
if (status && tmp > 0) o.disconnectscript_timeout = tmp;
|
if (status && tmp > 0) o.disconnectscript_timeout = tmp;
|
||||||
|
|
||||||
|
o.ovpn_engine = IsDlgButtonChecked(hdlg, ID_RB_ENGINE_OVPN3) ?
|
||||||
|
OPENVPN_ENGINE_OVPN3 : OPENVPN_ENGINE_OVPN2;
|
||||||
|
|
||||||
SaveRegistryKeys ();
|
SaveRegistryKeys ();
|
||||||
ExpandOptions ();
|
ExpandOptions ();
|
||||||
|
|
||||||
|
@ -555,6 +558,14 @@ LoadAdvancedDlgParams (HWND hdlg)
|
||||||
SetDlgItemInt (hdlg, ID_EDT_PRECONNECT_TIMEOUT, o.preconnectscript_timeout, FALSE);
|
SetDlgItemInt (hdlg, ID_EDT_PRECONNECT_TIMEOUT, o.preconnectscript_timeout, FALSE);
|
||||||
SetDlgItemInt (hdlg, ID_EDT_CONNECT_TIMEOUT, o.connectscript_timeout, FALSE);
|
SetDlgItemInt (hdlg, ID_EDT_CONNECT_TIMEOUT, o.connectscript_timeout, FALSE);
|
||||||
SetDlgItemInt (hdlg, ID_EDT_DISCONNECT_TIMEOUT, o.disconnectscript_timeout, FALSE);
|
SetDlgItemInt (hdlg, ID_EDT_DISCONNECT_TIMEOUT, o.disconnectscript_timeout, FALSE);
|
||||||
|
#ifdef ENABLE_OVPN3
|
||||||
|
CheckRadioButton(hdlg, ID_RB_ENGINE_OVPN2, ID_RB_ENGINE_OVPN3,
|
||||||
|
o.ovpn_engine == OPENVPN_ENGINE_OVPN3 ? ID_RB_ENGINE_OVPN3 : ID_RB_ENGINE_OVPN2);
|
||||||
|
#else
|
||||||
|
ShowWindow(GetDlgItem(hdlg, ID_RB_ENGINE_SELECTION), SW_HIDE);
|
||||||
|
ShowWindow(GetDlgItem(hdlg, ID_RB_ENGINE_OVPN2), SW_HIDE);
|
||||||
|
ShowWindow(GetDlgItem(hdlg, ID_RB_ENGINE_OVPN3), SW_HIDE);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
INT_PTR CALLBACK
|
INT_PTR CALLBACK
|
||||||
|
|
|
@ -92,6 +92,9 @@ typedef struct {
|
||||||
#define CONFIG_VIEW_FLAT (1)
|
#define CONFIG_VIEW_FLAT (1)
|
||||||
#define CONFIG_VIEW_NESTED (2)
|
#define CONFIG_VIEW_NESTED (2)
|
||||||
|
|
||||||
|
#define OPENVPN_ENGINE_OVPN2 (0)
|
||||||
|
#define OPENVPN_ENGINE_OVPN3 (1)
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
unsigned short major, minor, build, revision;
|
unsigned short major, minor, build, revision;
|
||||||
} version_t;
|
} version_t;
|
||||||
|
@ -203,6 +206,7 @@ typedef struct {
|
||||||
DWORD disconnectscript_timeout; /* Disconnect Script execution timeout (sec) */
|
DWORD disconnectscript_timeout; /* Disconnect Script execution timeout (sec) */
|
||||||
DWORD preconnectscript_timeout; /* Preconnect Script execution timeout (sec) */
|
DWORD preconnectscript_timeout; /* Preconnect Script execution timeout (sec) */
|
||||||
DWORD config_menu_view; /* 0 for auto, 1 for original flat menu, 2 for hierarchical */
|
DWORD config_menu_view; /* 0 for auto, 1 for original flat menu, 2 for hierarchical */
|
||||||
|
DWORD ovpn_engine; /* 0 - openvpn2, 1 - openvpn3 */
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
FILE *debug_fp;
|
FILE *debug_fp;
|
||||||
|
|
|
@ -61,7 +61,8 @@ struct regkey_int {
|
||||||
{L"disconnectscript_timeout", &o.disconnectscript_timeout, 10},
|
{L"disconnectscript_timeout", &o.disconnectscript_timeout, 10},
|
||||||
{L"show_script_window", &o.show_script_window, 0},
|
{L"show_script_window", &o.show_script_window, 0},
|
||||||
{L"service_only", &o.service_only, 0},
|
{L"service_only", &o.service_only, 0},
|
||||||
{L"config_menu_view", &o.config_menu_view, CONFIG_VIEW_AUTO}
|
{L"config_menu_view", &o.config_menu_view, CONFIG_VIEW_AUTO},
|
||||||
|
{L"ovpn_engine", &o.ovpn_engine, OPENVPN_ENGINE_OVPN2}
|
||||||
};
|
};
|
||||||
|
|
||||||
static int
|
static int
|
||||||
|
|
|
@ -193,6 +193,10 @@ BEGIN
|
||||||
EDITTEXT ID_EDT_PRECONNECT_TIMEOUT, 103, 108, 20, 12, ES_AUTOHSCROLL|ES_NUMBER
|
EDITTEXT ID_EDT_PRECONNECT_TIMEOUT, 103, 108, 20, 12, ES_AUTOHSCROLL|ES_NUMBER
|
||||||
EDITTEXT ID_EDT_CONNECT_TIMEOUT, 103, 123, 20, 12, ES_AUTOHSCROLL|ES_NUMBER
|
EDITTEXT ID_EDT_CONNECT_TIMEOUT, 103, 123, 20, 12, ES_AUTOHSCROLL|ES_NUMBER
|
||||||
EDITTEXT ID_EDT_DISCONNECT_TIMEOUT, 103, 138, 20, 12, ES_AUTOHSCROLL|ES_NUMBER
|
EDITTEXT ID_EDT_DISCONNECT_TIMEOUT, 103, 138, 20, 12, ES_AUTOHSCROLL|ES_NUMBER
|
||||||
|
|
||||||
|
GROUPBOX "OpenVPN Engine", ID_RB_ENGINE_SELECTION, 6, 162, 235, 30
|
||||||
|
AUTORADIOBUTTON "openvpn2", ID_RB_ENGINE_OVPN2, 18, 175, 50, 10, WS_GROUP | WS_TABSTOP
|
||||||
|
AUTORADIOBUTTON "openvpn3 (experimental)", ID_RB_ENGINE_OVPN3, 76, 175, 90, 10
|
||||||
END
|
END
|
||||||
|
|
||||||
/* About Dialog */
|
/* About Dialog */
|
||||||
|
|
|
@ -192,6 +192,10 @@ BEGIN
|
||||||
EDITTEXT ID_EDT_CONNECT_TIMEOUT, 103, 123, 20, 12, ES_AUTOHSCROLL|ES_NUMBER
|
EDITTEXT ID_EDT_CONNECT_TIMEOUT, 103, 123, 20, 12, ES_AUTOHSCROLL|ES_NUMBER
|
||||||
LTEXT "&Disconnect-Skript Timeout:", ID_TXT_DISCONNECT_TIMEOUT, 17, 140, 90, 10
|
LTEXT "&Disconnect-Skript Timeout:", ID_TXT_DISCONNECT_TIMEOUT, 17, 140, 90, 10
|
||||||
EDITTEXT ID_EDT_DISCONNECT_TIMEOUT, 103, 138, 20, 12, ES_AUTOHSCROLL|ES_NUMBER
|
EDITTEXT ID_EDT_DISCONNECT_TIMEOUT, 103, 138, 20, 12, ES_AUTOHSCROLL|ES_NUMBER
|
||||||
|
|
||||||
|
GROUPBOX "OpenVPN Engine", ID_RB_ENGINE_SELECTION, 6, 162, 235, 30
|
||||||
|
AUTORADIOBUTTON "openvpn2", ID_RB_ENGINE_OVPN2, 18, 175, 50, 10, WS_GROUP | WS_TABSTOP
|
||||||
|
AUTORADIOBUTTON "openvpn3 (experimental)", ID_RB_ENGINE_OVPN3, 76, 175, 90, 10
|
||||||
END
|
END
|
||||||
|
|
||||||
/* About Dialog */
|
/* About Dialog */
|
||||||
|
|
|
@ -193,6 +193,10 @@ BEGIN
|
||||||
EDITTEXT ID_EDT_PRECONNECT_TIMEOUT, 103, 108, 20, 12, ES_AUTOHSCROLL|ES_NUMBER
|
EDITTEXT ID_EDT_PRECONNECT_TIMEOUT, 103, 108, 20, 12, ES_AUTOHSCROLL|ES_NUMBER
|
||||||
EDITTEXT ID_EDT_CONNECT_TIMEOUT, 103, 123, 20, 12, ES_AUTOHSCROLL|ES_NUMBER
|
EDITTEXT ID_EDT_CONNECT_TIMEOUT, 103, 123, 20, 12, ES_AUTOHSCROLL|ES_NUMBER
|
||||||
EDITTEXT ID_EDT_DISCONNECT_TIMEOUT, 103, 138, 20, 12, ES_AUTOHSCROLL|ES_NUMBER
|
EDITTEXT ID_EDT_DISCONNECT_TIMEOUT, 103, 138, 20, 12, ES_AUTOHSCROLL|ES_NUMBER
|
||||||
|
|
||||||
|
GROUPBOX "OpenVPN Engine", ID_RB_ENGINE_SELECTION, 6, 162, 235, 30
|
||||||
|
AUTORADIOBUTTON "openvpn2", ID_RB_ENGINE_OVPN2, 18, 175, 50, 10, WS_GROUP | WS_TABSTOP
|
||||||
|
AUTORADIOBUTTON "openvpn3 (experimental)", ID_RB_ENGINE_OVPN3, 76, 175, 90, 10
|
||||||
END
|
END
|
||||||
|
|
||||||
/* About Dialog */
|
/* About Dialog */
|
||||||
|
|
|
@ -191,6 +191,10 @@ BEGIN
|
||||||
EDITTEXT ID_EDT_CONNECT_TIMEOUT, 103, 123, 20, 12, ES_AUTOHSCROLL|ES_NUMBER
|
EDITTEXT ID_EDT_CONNECT_TIMEOUT, 103, 123, 20, 12, ES_AUTOHSCROLL|ES_NUMBER
|
||||||
LTEXT "&Disconnect script timeout:", ID_TXT_DISCONNECT_TIMEOUT, 17, 140, 90, 10
|
LTEXT "&Disconnect script timeout:", ID_TXT_DISCONNECT_TIMEOUT, 17, 140, 90, 10
|
||||||
EDITTEXT ID_EDT_DISCONNECT_TIMEOUT, 103, 138, 20, 12, ES_AUTOHSCROLL|ES_NUMBER
|
EDITTEXT ID_EDT_DISCONNECT_TIMEOUT, 103, 138, 20, 12, ES_AUTOHSCROLL|ES_NUMBER
|
||||||
|
|
||||||
|
GROUPBOX "OpenVPN Engine", ID_RB_ENGINE_SELECTION, 6, 162, 235, 30
|
||||||
|
AUTORADIOBUTTON "openvpn2", ID_RB_ENGINE_OVPN2, 18, 175, 50, 10, WS_GROUP | WS_TABSTOP
|
||||||
|
AUTORADIOBUTTON "openvpn3 (experimental)", ID_RB_ENGINE_OVPN3, 76, 175, 90, 10
|
||||||
END
|
END
|
||||||
|
|
||||||
/* About Dialog */
|
/* About Dialog */
|
||||||
|
|
|
@ -193,6 +193,10 @@ BEGIN
|
||||||
EDITTEXT ID_EDT_CONNECT_TIMEOUT, 103, 123, 20, 12, ES_AUTOHSCROLL|ES_NUMBER
|
EDITTEXT ID_EDT_CONNECT_TIMEOUT, 103, 123, 20, 12, ES_AUTOHSCROLL|ES_NUMBER
|
||||||
LTEXT "&Disconnect script timeout:", ID_TXT_DISCONNECT_TIMEOUT, 17, 140, 90, 10
|
LTEXT "&Disconnect script timeout:", ID_TXT_DISCONNECT_TIMEOUT, 17, 140, 90, 10
|
||||||
EDITTEXT ID_EDT_DISCONNECT_TIMEOUT, 103, 138, 20, 12, ES_AUTOHSCROLL|ES_NUMBER
|
EDITTEXT ID_EDT_DISCONNECT_TIMEOUT, 103, 138, 20, 12, ES_AUTOHSCROLL|ES_NUMBER
|
||||||
|
|
||||||
|
GROUPBOX "OpenVPN Engine", ID_RB_ENGINE_SELECTION, 6, 162, 235, 30
|
||||||
|
AUTORADIOBUTTON "openvpn2", ID_RB_ENGINE_OVPN2, 18, 175, 50, 10, WS_GROUP | WS_TABSTOP
|
||||||
|
AUTORADIOBUTTON "openvpn3 (experimental)", ID_RB_ENGINE_OVPN3, 76, 175, 90, 10
|
||||||
END
|
END
|
||||||
|
|
||||||
/* About Dialog */
|
/* About Dialog */
|
||||||
|
|
|
@ -191,6 +191,10 @@ BEGIN
|
||||||
EDITTEXT ID_EDT_PRECONNECT_TIMEOUT, 103, 108, 20, 12, ES_AUTOHSCROLL|ES_NUMBER
|
EDITTEXT ID_EDT_PRECONNECT_TIMEOUT, 103, 108, 20, 12, ES_AUTOHSCROLL|ES_NUMBER
|
||||||
EDITTEXT ID_EDT_CONNECT_TIMEOUT, 103, 123, 20, 12, ES_AUTOHSCROLL|ES_NUMBER
|
EDITTEXT ID_EDT_CONNECT_TIMEOUT, 103, 123, 20, 12, ES_AUTOHSCROLL|ES_NUMBER
|
||||||
EDITTEXT ID_EDT_DISCONNECT_TIMEOUT, 103, 138, 20, 12, ES_AUTOHSCROLL|ES_NUMBER
|
EDITTEXT ID_EDT_DISCONNECT_TIMEOUT, 103, 138, 20, 12, ES_AUTOHSCROLL|ES_NUMBER
|
||||||
|
|
||||||
|
GROUPBOX "OpenVPN Engine", ID_RB_ENGINE_SELECTION, 6, 162, 235, 30
|
||||||
|
AUTORADIOBUTTON "openvpn2", ID_RB_ENGINE_OVPN2, 18, 175, 50, 10, WS_GROUP | WS_TABSTOP
|
||||||
|
AUTORADIOBUTTON "openvpn3 (experimental)", ID_RB_ENGINE_OVPN3, 76, 175, 90, 10
|
||||||
END
|
END
|
||||||
|
|
||||||
/* About Dialog */
|
/* About Dialog */
|
||||||
|
|
|
@ -192,6 +192,10 @@ BEGIN
|
||||||
EDITTEXT ID_EDT_PRECONNECT_TIMEOUT, 103, 108, 20, 12, ES_AUTOHSCROLL|ES_NUMBER
|
EDITTEXT ID_EDT_PRECONNECT_TIMEOUT, 103, 108, 20, 12, ES_AUTOHSCROLL|ES_NUMBER
|
||||||
EDITTEXT ID_EDT_CONNECT_TIMEOUT, 103, 123, 20, 12, ES_AUTOHSCROLL|ES_NUMBER
|
EDITTEXT ID_EDT_CONNECT_TIMEOUT, 103, 123, 20, 12, ES_AUTOHSCROLL|ES_NUMBER
|
||||||
EDITTEXT ID_EDT_DISCONNECT_TIMEOUT, 103, 138, 20, 12, ES_AUTOHSCROLL|ES_NUMBER
|
EDITTEXT ID_EDT_DISCONNECT_TIMEOUT, 103, 138, 20, 12, ES_AUTOHSCROLL|ES_NUMBER
|
||||||
|
|
||||||
|
GROUPBOX "OpenVPN Engine", ID_RB_ENGINE_SELECTION, 6, 162, 235, 30
|
||||||
|
AUTORADIOBUTTON "openvpn2", ID_RB_ENGINE_OVPN2, 18, 175, 50, 10, WS_GROUP | WS_TABSTOP
|
||||||
|
AUTORADIOBUTTON "openvpn3 (experimental)", ID_RB_ENGINE_OVPN3, 76, 175, 90, 10
|
||||||
END
|
END
|
||||||
|
|
||||||
/* About Dialog */
|
/* About Dialog */
|
||||||
|
|
|
@ -192,6 +192,10 @@ BEGIN
|
||||||
EDITTEXT ID_EDT_PRECONNECT_TIMEOUT, 103, 108, 20, 12, ES_AUTOHSCROLL|ES_NUMBER
|
EDITTEXT ID_EDT_PRECONNECT_TIMEOUT, 103, 108, 20, 12, ES_AUTOHSCROLL|ES_NUMBER
|
||||||
EDITTEXT ID_EDT_CONNECT_TIMEOUT, 103, 123, 20, 12, ES_AUTOHSCROLL|ES_NUMBER
|
EDITTEXT ID_EDT_CONNECT_TIMEOUT, 103, 123, 20, 12, ES_AUTOHSCROLL|ES_NUMBER
|
||||||
EDITTEXT ID_EDT_DISCONNECT_TIMEOUT, 103, 138, 20, 12, ES_AUTOHSCROLL|ES_NUMBER
|
EDITTEXT ID_EDT_DISCONNECT_TIMEOUT, 103, 138, 20, 12, ES_AUTOHSCROLL|ES_NUMBER
|
||||||
|
|
||||||
|
GROUPBOX "OpenVPN Engine", ID_RB_ENGINE_SELECTION, 6, 162, 235, 30
|
||||||
|
AUTORADIOBUTTON "openvpn2", ID_RB_ENGINE_OVPN2, 18, 175, 50, 10, WS_GROUP | WS_TABSTOP
|
||||||
|
AUTORADIOBUTTON "openvpn3 (experimental)", ID_RB_ENGINE_OVPN3, 76, 175, 90, 10
|
||||||
END
|
END
|
||||||
|
|
||||||
/* About Dialog */
|
/* About Dialog */
|
||||||
|
|
|
@ -164,6 +164,10 @@ BEGIN
|
||||||
AUTORADIOBUTTON "Alla &connessione", ID_RB_BALLOON1, 28, 155, 50, 10, WS_GROUP | WS_TABSTOP
|
AUTORADIOBUTTON "Alla &connessione", ID_RB_BALLOON1, 28, 155, 50, 10, WS_GROUP | WS_TABSTOP
|
||||||
AUTORADIOBUTTON "Alla connessione/&riconnessione", ID_RB_BALLOON2, 86, 155, 90, 10
|
AUTORADIOBUTTON "Alla connessione/&riconnessione", ID_RB_BALLOON2, 86, 155, 90, 10
|
||||||
AUTORADIOBUTTON "&Mai", ID_RB_BALLOON0, 181, 155, 40, 10
|
AUTORADIOBUTTON "&Mai", ID_RB_BALLOON0, 181, 155, 40, 10
|
||||||
|
|
||||||
|
GROUPBOX "OpenVPN Engine", ID_RB_ENGINE_SELECTION, 6, 162, 235, 30
|
||||||
|
AUTORADIOBUTTON "openvpn2", ID_RB_ENGINE_OVPN2, 18, 175, 50, 10, WS_GROUP | WS_TABSTOP
|
||||||
|
AUTORADIOBUTTON "openvpn3 (experimental)", ID_RB_ENGINE_OVPN3, 76, 175, 90, 10
|
||||||
END
|
END
|
||||||
|
|
||||||
/* Advanced Dialog */
|
/* Advanced Dialog */
|
||||||
|
|
|
@ -193,6 +193,10 @@ BEGIN
|
||||||
EDITTEXT ID_EDT_PRECONNECT_TIMEOUT, 143, 108, 20, 12, ES_AUTOHSCROLL|ES_NUMBER
|
EDITTEXT ID_EDT_PRECONNECT_TIMEOUT, 143, 108, 20, 12, ES_AUTOHSCROLL|ES_NUMBER
|
||||||
EDITTEXT ID_EDT_CONNECT_TIMEOUT, 143, 123, 20, 12, ES_AUTOHSCROLL|ES_NUMBER
|
EDITTEXT ID_EDT_CONNECT_TIMEOUT, 143, 123, 20, 12, ES_AUTOHSCROLL|ES_NUMBER
|
||||||
EDITTEXT ID_EDT_DISCONNECT_TIMEOUT, 143, 138, 20, 12, ES_AUTOHSCROLL|ES_NUMBER
|
EDITTEXT ID_EDT_DISCONNECT_TIMEOUT, 143, 138, 20, 12, ES_AUTOHSCROLL|ES_NUMBER
|
||||||
|
|
||||||
|
GROUPBOX "OpenVPN Engine", ID_RB_ENGINE_SELECTION, 6, 162, 235, 30
|
||||||
|
AUTORADIOBUTTON "openvpn2", ID_RB_ENGINE_OVPN2, 18, 175, 50, 10, WS_GROUP | WS_TABSTOP
|
||||||
|
AUTORADIOBUTTON "openvpn3 (experimental)", ID_RB_ENGINE_OVPN3, 76, 175, 90, 10
|
||||||
END
|
END
|
||||||
|
|
||||||
/* About Dialog */
|
/* About Dialog */
|
||||||
|
|
|
@ -194,6 +194,10 @@ BEGIN
|
||||||
EDITTEXT ID_EDT_PRECONNECT_TIMEOUT, 103, 108, 20, 12, ES_AUTOHSCROLL|ES_NUMBER
|
EDITTEXT ID_EDT_PRECONNECT_TIMEOUT, 103, 108, 20, 12, ES_AUTOHSCROLL|ES_NUMBER
|
||||||
EDITTEXT ID_EDT_CONNECT_TIMEOUT, 103, 123, 20, 12, ES_AUTOHSCROLL|ES_NUMBER
|
EDITTEXT ID_EDT_CONNECT_TIMEOUT, 103, 123, 20, 12, ES_AUTOHSCROLL|ES_NUMBER
|
||||||
EDITTEXT ID_EDT_DISCONNECT_TIMEOUT, 103, 138, 20, 12, ES_AUTOHSCROLL|ES_NUMBER
|
EDITTEXT ID_EDT_DISCONNECT_TIMEOUT, 103, 138, 20, 12, ES_AUTOHSCROLL|ES_NUMBER
|
||||||
|
|
||||||
|
GROUPBOX "OpenVPN Engine", ID_RB_ENGINE_SELECTION, 6, 162, 235, 30
|
||||||
|
AUTORADIOBUTTON "openvpn2", ID_RB_ENGINE_OVPN2, 18, 175, 50, 10, WS_GROUP | WS_TABSTOP
|
||||||
|
AUTORADIOBUTTON "openvpn3 (experimental)", ID_RB_ENGINE_OVPN3, 76, 175, 90, 10
|
||||||
END
|
END
|
||||||
|
|
||||||
/* About Dialog */
|
/* About Dialog */
|
||||||
|
|
|
@ -163,6 +163,10 @@ BEGIN
|
||||||
AUTORADIOBUTTON "Bij verbinden", ID_RB_BALLOON1, 28, 155, 50, 10, WS_GROUP | WS_TABSTOP
|
AUTORADIOBUTTON "Bij verbinden", ID_RB_BALLOON1, 28, 155, 50, 10, WS_GROUP | WS_TABSTOP
|
||||||
AUTORADIOBUTTON "Bij opnieuw verbinden", ID_RB_BALLOON2, 86, 155, 90, 10
|
AUTORADIOBUTTON "Bij opnieuw verbinden", ID_RB_BALLOON2, 86, 155, 90, 10
|
||||||
AUTORADIOBUTTON "Nooit", ID_RB_BALLOON0, 181, 155, 40, 10
|
AUTORADIOBUTTON "Nooit", ID_RB_BALLOON0, 181, 155, 40, 10
|
||||||
|
|
||||||
|
GROUPBOX "OpenVPN Engine", ID_RB_ENGINE_SELECTION, 6, 162, 235, 30
|
||||||
|
AUTORADIOBUTTON "openvpn2", ID_RB_ENGINE_OVPN2, 18, 175, 50, 10, WS_GROUP | WS_TABSTOP
|
||||||
|
AUTORADIOBUTTON "openvpn3 (experimental)", ID_RB_ENGINE_OVPN3, 76, 175, 90, 10
|
||||||
END
|
END
|
||||||
|
|
||||||
/* Advanced Dialog */
|
/* Advanced Dialog */
|
||||||
|
|
|
@ -192,6 +192,10 @@ BEGIN
|
||||||
EDITTEXT ID_EDT_PRECONNECT_TIMEOUT, 103, 108, 20, 12, ES_AUTOHSCROLL|ES_NUMBER
|
EDITTEXT ID_EDT_PRECONNECT_TIMEOUT, 103, 108, 20, 12, ES_AUTOHSCROLL|ES_NUMBER
|
||||||
EDITTEXT ID_EDT_CONNECT_TIMEOUT, 103, 123, 20, 12, ES_AUTOHSCROLL|ES_NUMBER
|
EDITTEXT ID_EDT_CONNECT_TIMEOUT, 103, 123, 20, 12, ES_AUTOHSCROLL|ES_NUMBER
|
||||||
EDITTEXT ID_EDT_DISCONNECT_TIMEOUT, 103, 138, 20, 12, ES_AUTOHSCROLL|ES_NUMBER
|
EDITTEXT ID_EDT_DISCONNECT_TIMEOUT, 103, 138, 20, 12, ES_AUTOHSCROLL|ES_NUMBER
|
||||||
|
|
||||||
|
GROUPBOX "OpenVPN Engine", ID_RB_ENGINE_SELECTION, 6, 162, 235, 30
|
||||||
|
AUTORADIOBUTTON "openvpn2", ID_RB_ENGINE_OVPN2, 18, 175, 50, 10, WS_GROUP | WS_TABSTOP
|
||||||
|
AUTORADIOBUTTON "openvpn3 (experimental)", ID_RB_ENGINE_OVPN3, 76, 175, 90, 10
|
||||||
END
|
END
|
||||||
|
|
||||||
/* About Dialog */
|
/* About Dialog */
|
||||||
|
|
|
@ -193,6 +193,10 @@ BEGIN
|
||||||
EDITTEXT ID_EDT_PRECONNECT_TIMEOUT, 103, 108, 20, 12, ES_AUTOHSCROLL|ES_NUMBER
|
EDITTEXT ID_EDT_PRECONNECT_TIMEOUT, 103, 108, 20, 12, ES_AUTOHSCROLL|ES_NUMBER
|
||||||
EDITTEXT ID_EDT_CONNECT_TIMEOUT, 103, 123, 20, 12, ES_AUTOHSCROLL|ES_NUMBER
|
EDITTEXT ID_EDT_CONNECT_TIMEOUT, 103, 123, 20, 12, ES_AUTOHSCROLL|ES_NUMBER
|
||||||
EDITTEXT ID_EDT_DISCONNECT_TIMEOUT, 103, 138, 20, 12, ES_AUTOHSCROLL|ES_NUMBER
|
EDITTEXT ID_EDT_DISCONNECT_TIMEOUT, 103, 138, 20, 12, ES_AUTOHSCROLL|ES_NUMBER
|
||||||
|
|
||||||
|
GROUPBOX "OpenVPN Engine", ID_RB_ENGINE_SELECTION, 6, 162, 235, 30
|
||||||
|
AUTORADIOBUTTON "openvpn2", ID_RB_ENGINE_OVPN2, 18, 175, 50, 10, WS_GROUP | WS_TABSTOP
|
||||||
|
AUTORADIOBUTTON "openvpn3 (experimental)", ID_RB_ENGINE_OVPN3, 76, 175, 90, 10
|
||||||
END
|
END
|
||||||
|
|
||||||
/* About Dialog */
|
/* About Dialog */
|
||||||
|
|
|
@ -191,6 +191,10 @@ BEGIN
|
||||||
EDITTEXT ID_EDT_PRECONNECT_TIMEOUT, 103, 108, 20, 12, ES_AUTOHSCROLL|ES_NUMBER
|
EDITTEXT ID_EDT_PRECONNECT_TIMEOUT, 103, 108, 20, 12, ES_AUTOHSCROLL|ES_NUMBER
|
||||||
EDITTEXT ID_EDT_CONNECT_TIMEOUT, 103, 123, 20, 12, ES_AUTOHSCROLL|ES_NUMBER
|
EDITTEXT ID_EDT_CONNECT_TIMEOUT, 103, 123, 20, 12, ES_AUTOHSCROLL|ES_NUMBER
|
||||||
EDITTEXT ID_EDT_DISCONNECT_TIMEOUT, 103, 138, 20, 12, ES_AUTOHSCROLL|ES_NUMBER
|
EDITTEXT ID_EDT_DISCONNECT_TIMEOUT, 103, 138, 20, 12, ES_AUTOHSCROLL|ES_NUMBER
|
||||||
|
|
||||||
|
GROUPBOX "OpenVPN Engine", ID_RB_ENGINE_SELECTION, 6, 162, 235, 30
|
||||||
|
AUTORADIOBUTTON "openvpn2", ID_RB_ENGINE_OVPN2, 18, 175, 50, 10, WS_GROUP | WS_TABSTOP
|
||||||
|
AUTORADIOBUTTON "openvpn3 (experimental)", ID_RB_ENGINE_OVPN3, 76, 175, 90, 10
|
||||||
END
|
END
|
||||||
|
|
||||||
/* About Dialog */
|
/* About Dialog */
|
||||||
|
|
|
@ -194,6 +194,10 @@ BEGIN
|
||||||
EDITTEXT ID_EDT_PRECONNECT_TIMEOUT, 123, 108, 20, 12, ES_AUTOHSCROLL|ES_NUMBER
|
EDITTEXT ID_EDT_PRECONNECT_TIMEOUT, 123, 108, 20, 12, ES_AUTOHSCROLL|ES_NUMBER
|
||||||
EDITTEXT ID_EDT_CONNECT_TIMEOUT, 123, 123, 20, 12, ES_AUTOHSCROLL|ES_NUMBER
|
EDITTEXT ID_EDT_CONNECT_TIMEOUT, 123, 123, 20, 12, ES_AUTOHSCROLL|ES_NUMBER
|
||||||
EDITTEXT ID_EDT_DISCONNECT_TIMEOUT, 123, 138, 20, 12, ES_AUTOHSCROLL|ES_NUMBER
|
EDITTEXT ID_EDT_DISCONNECT_TIMEOUT, 123, 138, 20, 12, ES_AUTOHSCROLL|ES_NUMBER
|
||||||
|
|
||||||
|
GROUPBOX "OpenVPN Engine", ID_RB_ENGINE_SELECTION, 6, 162, 235, 30
|
||||||
|
AUTORADIOBUTTON "openvpn2", ID_RB_ENGINE_OVPN2, 18, 175, 50, 10, WS_GROUP | WS_TABSTOP
|
||||||
|
AUTORADIOBUTTON "openvpn3 (experimental)", ID_RB_ENGINE_OVPN3, 76, 175, 90, 10
|
||||||
END
|
END
|
||||||
|
|
||||||
/* About Dialog */
|
/* About Dialog */
|
||||||
|
|
|
@ -191,6 +191,10 @@ BEGIN
|
||||||
EDITTEXT ID_EDT_PRECONNECT_TIMEOUT, 103, 108, 20, 12, ES_AUTOHSCROLL|ES_NUMBER
|
EDITTEXT ID_EDT_PRECONNECT_TIMEOUT, 103, 108, 20, 12, ES_AUTOHSCROLL|ES_NUMBER
|
||||||
EDITTEXT ID_EDT_CONNECT_TIMEOUT, 103, 123, 20, 12, ES_AUTOHSCROLL|ES_NUMBER
|
EDITTEXT ID_EDT_CONNECT_TIMEOUT, 103, 123, 20, 12, ES_AUTOHSCROLL|ES_NUMBER
|
||||||
EDITTEXT ID_EDT_DISCONNECT_TIMEOUT, 103, 138, 20, 12, ES_AUTOHSCROLL|ES_NUMBER
|
EDITTEXT ID_EDT_DISCONNECT_TIMEOUT, 103, 138, 20, 12, ES_AUTOHSCROLL|ES_NUMBER
|
||||||
|
|
||||||
|
GROUPBOX "OpenVPN Engine", ID_RB_ENGINE_SELECTION, 6, 162, 235, 30
|
||||||
|
AUTORADIOBUTTON "openvpn2", ID_RB_ENGINE_OVPN2, 18, 175, 50, 10, WS_GROUP | WS_TABSTOP
|
||||||
|
AUTORADIOBUTTON "openvpn3 (experimental)", ID_RB_ENGINE_OVPN3, 76, 175, 90, 10
|
||||||
END
|
END
|
||||||
|
|
||||||
/* About Dialog */
|
/* About Dialog */
|
||||||
|
|
|
@ -193,6 +193,10 @@ BEGIN
|
||||||
EDITTEXT ID_EDT_PRECONNECT_TIMEOUT, 103, 108, 20, 12, ES_AUTOHSCROLL|ES_NUMBER
|
EDITTEXT ID_EDT_PRECONNECT_TIMEOUT, 103, 108, 20, 12, ES_AUTOHSCROLL|ES_NUMBER
|
||||||
EDITTEXT ID_EDT_CONNECT_TIMEOUT, 103, 123, 20, 12, ES_AUTOHSCROLL|ES_NUMBER
|
EDITTEXT ID_EDT_CONNECT_TIMEOUT, 103, 123, 20, 12, ES_AUTOHSCROLL|ES_NUMBER
|
||||||
EDITTEXT ID_EDT_DISCONNECT_TIMEOUT, 103, 138, 20, 12, ES_AUTOHSCROLL|ES_NUMBER
|
EDITTEXT ID_EDT_DISCONNECT_TIMEOUT, 103, 138, 20, 12, ES_AUTOHSCROLL|ES_NUMBER
|
||||||
|
|
||||||
|
GROUPBOX "OpenVPN Engine", ID_RB_ENGINE_SELECTION, 6, 162, 235, 30
|
||||||
|
AUTORADIOBUTTON "openvpn2", ID_RB_ENGINE_OVPN2, 18, 175, 50, 10, WS_GROUP | WS_TABSTOP
|
||||||
|
AUTORADIOBUTTON "openvpn3 (experimental)", ID_RB_ENGINE_OVPN3, 76, 175, 90, 10
|
||||||
END
|
END
|
||||||
|
|
||||||
/* About Dialog */
|
/* About Dialog */
|
||||||
|
|
|
@ -192,6 +192,10 @@ BEGIN
|
||||||
EDITTEXT ID_EDT_PRECONNECT_TIMEOUT, 123, 108, 20, 12, ES_AUTOHSCROLL|ES_NUMBER
|
EDITTEXT ID_EDT_PRECONNECT_TIMEOUT, 123, 108, 20, 12, ES_AUTOHSCROLL|ES_NUMBER
|
||||||
EDITTEXT ID_EDT_CONNECT_TIMEOUT, 123, 123, 20, 12, ES_AUTOHSCROLL|ES_NUMBER
|
EDITTEXT ID_EDT_CONNECT_TIMEOUT, 123, 123, 20, 12, ES_AUTOHSCROLL|ES_NUMBER
|
||||||
EDITTEXT ID_EDT_DISCONNECT_TIMEOUT, 123, 138, 20, 12, ES_AUTOHSCROLL|ES_NUMBER
|
EDITTEXT ID_EDT_DISCONNECT_TIMEOUT, 123, 138, 20, 12, ES_AUTOHSCROLL|ES_NUMBER
|
||||||
|
|
||||||
|
GROUPBOX "OpenVPN Engine", ID_RB_ENGINE_SELECTION, 6, 162, 235, 30
|
||||||
|
AUTORADIOBUTTON "openvpn2", ID_RB_ENGINE_OVPN2, 18, 175, 50, 10, WS_GROUP | WS_TABSTOP
|
||||||
|
AUTORADIOBUTTON "openvpn3 (experimental)", ID_RB_ENGINE_OVPN3, 76, 175, 90, 10
|
||||||
END
|
END
|
||||||
|
|
||||||
/* About Dialog */
|
/* About Dialog */
|
||||||
|
|
|
@ -195,6 +195,10 @@ BEGIN
|
||||||
EDITTEXT ID_EDT_CONNECT_TIMEOUT, 103, 123, 20, 12, ES_AUTOHSCROLL|ES_NUMBER
|
EDITTEXT ID_EDT_CONNECT_TIMEOUT, 103, 123, 20, 12, ES_AUTOHSCROLL|ES_NUMBER
|
||||||
LTEXT "断开连接时脚本超时时间:", ID_TXT_DISCONNECT_TIMEOUT, 17, 140, 90, 10
|
LTEXT "断开连接时脚本超时时间:", ID_TXT_DISCONNECT_TIMEOUT, 17, 140, 90, 10
|
||||||
EDITTEXT ID_EDT_DISCONNECT_TIMEOUT, 103, 138, 20, 12, ES_AUTOHSCROLL|ES_NUMBER
|
EDITTEXT ID_EDT_DISCONNECT_TIMEOUT, 103, 138, 20, 12, ES_AUTOHSCROLL|ES_NUMBER
|
||||||
|
|
||||||
|
GROUPBOX "OpenVPN Engine", ID_RB_ENGINE_SELECTION, 6, 162, 235, 30
|
||||||
|
AUTORADIOBUTTON "openvpn2", ID_RB_ENGINE_OVPN2, 18, 175, 50, 10, WS_GROUP | WS_TABSTOP
|
||||||
|
AUTORADIOBUTTON "openvpn3 (experimental)", ID_RB_ENGINE_OVPN3, 76, 175, 90, 10
|
||||||
END
|
END
|
||||||
|
|
||||||
/* About Dialog */
|
/* About Dialog */
|
||||||
|
|
|
@ -195,6 +195,10 @@ BEGIN
|
||||||
EDITTEXT ID_EDT_PRECONNECT_TIMEOUT, 103, 108, 20, 12, ES_AUTOHSCROLL|ES_NUMBER
|
EDITTEXT ID_EDT_PRECONNECT_TIMEOUT, 103, 108, 20, 12, ES_AUTOHSCROLL|ES_NUMBER
|
||||||
EDITTEXT ID_EDT_CONNECT_TIMEOUT, 103, 123, 20, 12, ES_AUTOHSCROLL|ES_NUMBER
|
EDITTEXT ID_EDT_CONNECT_TIMEOUT, 103, 123, 20, 12, ES_AUTOHSCROLL|ES_NUMBER
|
||||||
EDITTEXT ID_EDT_DISCONNECT_TIMEOUT, 103, 138, 20, 12, ES_AUTOHSCROLL|ES_NUMBER
|
EDITTEXT ID_EDT_DISCONNECT_TIMEOUT, 103, 138, 20, 12, ES_AUTOHSCROLL|ES_NUMBER
|
||||||
|
|
||||||
|
GROUPBOX "OpenVPN Engine", ID_RB_ENGINE_SELECTION, 6, 162, 235, 30
|
||||||
|
AUTORADIOBUTTON "openvpn2", ID_RB_ENGINE_OVPN2, 18, 175, 50, 10, WS_GROUP | WS_TABSTOP
|
||||||
|
AUTORADIOBUTTON "openvpn3 (experimental)", ID_RB_ENGINE_OVPN3, 76, 175, 90, 10
|
||||||
END
|
END
|
||||||
|
|
||||||
/* About Dialog */
|
/* About Dialog */
|
||||||
|
|
|
@ -35,6 +35,9 @@
|
||||||
#include "openvpn-gui-res.h"
|
#include "openvpn-gui-res.h"
|
||||||
#include "localization.h"
|
#include "localization.h"
|
||||||
|
|
||||||
|
#define OPENVPN_SERVICE_NAME_OVPN3 L"ovpnagent"
|
||||||
|
#define OPENVPN_SERVICE_NAME_OVPN2 L"OpenVPNServiceInteractive"
|
||||||
|
|
||||||
extern options_t o;
|
extern options_t o;
|
||||||
|
|
||||||
int MyStartService()
|
int MyStartService()
|
||||||
|
@ -265,8 +268,9 @@ CheckIServiceStatus(BOOL warn)
|
||||||
if (NULL == schSCManager)
|
if (NULL == schSCManager)
|
||||||
return(false);
|
return(false);
|
||||||
|
|
||||||
schService = OpenService(schSCManager, _T("OpenVPNServiceInteractive"),
|
schService = OpenService(schSCManager, o.ovpn_engine == OPENVPN_ENGINE_OVPN3 ?
|
||||||
SERVICE_QUERY_STATUS);
|
OPENVPN_SERVICE_NAME_OVPN3 : OPENVPN_SERVICE_NAME_OVPN2, SERVICE_QUERY_STATUS);
|
||||||
|
|
||||||
if (schService == NULL &&
|
if (schService == NULL &&
|
||||||
GetLastError() == ERROR_SERVICE_DOES_NOT_EXIST)
|
GetLastError() == ERROR_SERVICE_DOES_NOT_EXIST)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue