Hello,
Here is a simple program that will make it easier for you....
The file in ca and pkcs12 parameters is found when using Hebrew.
Alon.
---
#include <Windows.h>
int main(void) {
WCHAR cmdline[] =
L"s:\\Temp\\openvpn\\build-win32\\src\\openvpn\\.libs\\openvpn.exe
--dev tap --tls-client --ca c:\\temp\\עברית\\ניסוי.txt --pkcs12
c:\\temp\\עברית\\ניסוי.txt";
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
ZeroMemory(&pi, sizeof(pi));
CreateProcessW(
NULL,
cmdline,
NULL,
NULL,
TRUE,
0,
NULL,
NULL,
&si,
&pi
);
return 0;
}
---
2012/4/27 Samuli Seppänen <[email protected]>:
>
>> Hello Samuli,
>>
>> Curios: Did you manage to get it work using master without my patch?
>
> Nope, although I only tested it briefly. I'll try that again just in case.
>
>> If not, to make it easy...
>>
>> Use Windows Explorer and rename the key file to something non-ascii.
>> Then open openvpn configuration using UTF-8 editor and modify key file there.
>> This should work, as we do not use unicode/conversion command-line.
>>
>> Next step would be to remove the key from configuration and use it in
>> command-line.
>>
>> Alon.
>
> Thanks, I'll try that.
>
> Samuli
>
>>
>> 2012/4/27 Samuli Seppänen <[email protected]>:
>>> Hi,
>>>
>>> As promised in yesterday's IRC meeting (summary coming today), I tested
>>> this patch on Windows 7 (64-bit). So far I've had no luck, but don't
>>> think the problems have anything to do with this patch.
>>>
>>> Anyways, I cross-compiled latest "master" with this patch applied and
>>> "bin" and "lib" directories on top of an existing openvpn-2.3-alpha1
>>> install. The old "bin" directory was renamed to make sure none of it was
>>> used. I then renamed "openvpn.ovpn" to "ääliö.ovpn" and "ta.key" to
>>> "ääliö.key" using Windows Explorer. Then I updated the configuration
>>> file to point to these files using Notepad (and later Wordpad).
>>>
>>> OpenVPN-GUI (Heiko's new version) detected the configuration file
>>> properly, showing "ääliö" as one available connection option. However,
>>> it output the following when trying to connect:
>>>
>>> Options error: --tls-auth fails with 'ääliö.key': No such file or
>>> directory
>>>
>>> Git Bash showed the file as ??li?.key, which could mean Windows Explorer
>>> is using a single-byte character set.
>>>
>>> Windows command prompt shows the characters properly, but issuing
>>> "openvpn --config ääliö.ovpn" gives the same error as OpenVPN-GUI above,
>>> except that 'ääliö.key' shows faulty glyphs[1]. This also triggers an
>>> interesting bug in the command prompt[2]
>>>
>>> Anyways, as the Windows 7 install is English-language, I suspect it's
>>> using a single-byte character set instead of UCS-2. I'll continue
>>> debugging, but any pointers are obviously much appreciated!
>>>
>>> Samuli
>>>
>>> [1] <http://users.utu.fi/sjsepp/cmd.png>
>>> [2] Typing an "ä" or "ö" moves the (invisible) cursor forward one
>>> character, but each backspace will delete two characters instead of one.
>>> This does not happen until openvpn has been (unsuccessfully) started.
>>>
>>>
>>>> Discussed at [1].
>>>>
>>>> Use wmain under windows, drop the custom parsing and shell32 linkage.
>>>>
>>>> There is no need for gc magic as this allocation is static.
>>>>
>>>> [1] http://permalink.gmane.org/gmane.network.openvpn.devel/5433
>>>>
>>>> Signed-off-by: Alon Bar-Lev <[email protected]>
>>>> ---
>>>> src/openvpn/Makefile.am | 6 +++++-
>>>> src/openvpn/openvpn.c | 37 ++++++++++++++++++++++++++++++++++++-
>>>> src/openvpn/openvpn.vcxproj | 10 ++++++----
>>>> src/openvpn/options.c | 27 ---------------------------
>>>> 4 files changed, 47 insertions(+), 33 deletions(-)
>>>> mode change 100644 => 100755 src/openvpn/openvpn.vcxproj
>>>>
>>>> diff --git a/src/openvpn/Makefile.am b/src/openvpn/Makefile.am
>>>> index 4e485e7..0506b11 100644
>>>> --- a/src/openvpn/Makefile.am
>>>> +++ b/src/openvpn/Makefile.am
>>>> @@ -27,6 +27,10 @@ AM_CFLAGS = \
>>>> $(OPTIONAL_CRYPTO_CFLAGS) \
>>>> $(OPTIONAL_LZO_CFLAGS) \
>>>> $(OPTIONAL_PKCS11_HELPER_CFLAGS)
>>>> +if WIN32
>>>> +# we want unicode entry point but not the macro
>>>> +AM_CFLAGS += -municode -UUNICODE
>>>> +endif
>>>>
>>>> sbin_PROGRAMS = openvpn
>>>>
>>>> @@ -118,5 +122,5 @@ openvpn_LDADD = \
>>>> $(OPTIONAL_DL_LIBS)
>>>> if WIN32
>>>> openvpn_SOURCES += openvpn_win32_resources.rc
>>>> -openvpn_LDADD += -lgdi32 -lws2_32 -lwininet -lcrypt32 -liphlpapi -lwinmm
>>>> -lshell32
>>>> +openvpn_LDADD += -lgdi32 -lws2_32 -lwininet -lcrypt32 -liphlpapi -lwinmm
>>>> endif
>>>> diff --git a/src/openvpn/openvpn.c b/src/openvpn/openvpn.c
>>>> index 3db1b86..6e70a58 100644
>>>> --- a/src/openvpn/openvpn.c
>>>> +++ b/src/openvpn/openvpn.c
>>>> @@ -127,8 +127,9 @@ tunnel_point_to_point (struct context *c)
>>>> * @param argc - Commandline argument count.
>>>> * @param argv - Commandline argument values.
>>>> */
>>>> +static
>>>> int
>>>> -main (int argc, char *argv[])
>>>> +openvpn_main (int argc, char *argv[])
>>>> {
>>>> struct context c;
>>>>
>>>> @@ -289,3 +290,37 @@ main (int argc, char *argv[])
>>>> openvpn_exit (OPENVPN_EXIT_STATUS_GOOD); /* exit point */
>>>> return 0; /* NOTREACHED */
>>>> }
>>>> +
>>>> +#ifdef WIN32
>>>> +int
>>>> +wmain (int argc, wchar_t *wargv[]) {
>>>> + char **argv;
>>>> + int ret;
>>>> + int i;
>>>> +
>>>> + if ((argv = calloc(argc+1, sizeof(char*))) == NULL)
>>>> + return 1;
>>>> +
>>>> + for (i = 0; i < argc; i++)
>>>> + {
>>>> + int n = WideCharToMultiByte (CP_UTF8, 0, wargv[i], -1, NULL, 0,
>>>> NULL, NULL);
>>>> + argv[i] = malloc (n);
>>>> + WideCharToMultiByte (CP_UTF8, 0, wargv[i], -1, argv[i], n, NULL,
>>>> NULL);
>>>> + }
>>>> +
>>>> + ret = openvpn_main(argc, argv);
>>>> +
>>>> + for (i=0; i < argc; i++ )
>>>> + {
>>>> + free (argv[i]);
>>>> + }
>>>> + free(argv);
>>>> +
>>>> + return ret;
>>>> +}
>>>> +#else
>>>> +int
>>>> +main (int argc, char *argv[]) {
>>>> + return openvpn_main(argc, argv);
>>>> +}
>>>> +#endif
>>>> diff --git a/src/openvpn/openvpn.vcxproj b/src/openvpn/openvpn.vcxproj
>>>> old mode 100644
>>>> new mode 100755
>>>> index 51e19af..452876f
>>>> --- a/src/openvpn/openvpn.vcxproj
>>>> +++ b/src/openvpn/openvpn.vcxproj
>>>> @@ -18,12 +18,12 @@
>>>> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
>>>> <PropertyGroup
>>>> Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"
>>>> Label="Configuration">
>>>> <ConfigurationType>Application</ConfigurationType>
>>>> - <CharacterSet>MultiByte</CharacterSet>
>>>> <WholeProgramOptimization>true</WholeProgramOptimization>
>>>> + <CharacterSet>Unicode</CharacterSet>
>>>> </PropertyGroup>
>>>> <PropertyGroup
>>>> Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"
>>>> Label="Configuration">
>>>> <ConfigurationType>Application</ConfigurationType>
>>>> - <CharacterSet>MultiByte</CharacterSet>
>>>> + <CharacterSet>Unicode</CharacterSet>
>>>> </PropertyGroup>
>>>> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
>>>> <ImportGroup Label="ExtensionSettings">
>>>> @@ -56,12 +56,13 @@
>>>> </PrecompiledHeader>
>>>> <WarningLevel>Level3</WarningLevel>
>>>> <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
>>>> +
>>>> <UndefinePreprocessorDefinitions>UNICODE</UndefinePreprocessorDefinitions>
>>>> </ClCompile>
>>>> <ResourceCompile>
>>>>
>>>> <AdditionalIncludeDirectories>$(SOURCEBASE);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
>>>> </ResourceCompile>
>>>> <Link>
>>>> -
>>>> <AdditionalDependencies>libeay32.lib;ssleay32.lib;lzo2.lib;pkcs11-helper.dll.lib;gdi32.lib;ws2_32.lib;wininet.lib;crypt32.lib;iphlpapi.lib;winmm.lib;shell32.lib;%(AdditionalDependencies)</AdditionalDependencies>
>>>> +
>>>> <AdditionalDependencies>libeay32.lib;ssleay32.lib;lzo2.lib;pkcs11-helper.dll.lib;gdi32.lib;ws2_32.lib;wininet.lib;crypt32.lib;iphlpapi.lib;winmm.lib;%(AdditionalDependencies)</AdditionalDependencies>
>>>>
>>>> <AdditionalLibraryDirectories>$(OPENSSL_HOME)/lib;$(LZO_HOME)/lib;$(PKCS11H_HOME)/lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
>>>> <GenerateDebugInformation>true</GenerateDebugInformation>
>>>> <SubSystem>Console</SubSystem>
>>>> @@ -80,12 +81,13 @@
>>>> </PrecompiledHeader>
>>>> <WarningLevel>Level3</WarningLevel>
>>>> <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
>>>> +
>>>> <UndefinePreprocessorDefinitions>UNICODE</UndefinePreprocessorDefinitions>
>>>> </ClCompile>
>>>> <ResourceCompile>
>>>>
>>>> <AdditionalIncludeDirectories>$(SOURCEBASE);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
>>>> </ResourceCompile>
>>>> <Link>
>>>> -
>>>> <AdditionalDependencies>libeay32.lib;ssleay32.lib;lzo2.lib;pkcs11-helper.dll.lib;gdi32.lib;ws2_32.lib;wininet.lib;crypt32.lib;iphlpapi.lib;winmm.lib;shell32.lib;%(AdditionalDependencies)</AdditionalDependencies>
>>>> +
>>>> <AdditionalDependencies>libeay32.lib;ssleay32.lib;lzo2.lib;pkcs11-helper.dll.lib;gdi32.lib;ws2_32.lib;wininet.lib;crypt32.lib;iphlpapi.lib;winmm.lib;%(AdditionalDependencies)</AdditionalDependencies>
>>>>
>>>> <AdditionalLibraryDirectories>$(OPENSSL_HOME)/lib;$(LZO_HOME)/lib;$(PKCS11H_HOME)/lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
>>>> <GenerateDebugInformation>true</GenerateDebugInformation>
>>>> <SubSystem>Console</SubSystem>
>>>> diff --git a/src/openvpn/options.c b/src/openvpn/options.c
>>>> index 25786f6..66241b4 100644
>>>> --- a/src/openvpn/options.c
>>>> +++ b/src/openvpn/options.c
>>>> @@ -3832,33 +3832,6 @@ parse_argv (struct options *options,
>>>> {
>>>> int i, j;
>>>>
>>>> -#ifdef WIN32
>>>> - /*
>>>> - * Windows replaces Unicode characters in argv[] that are not present
>>>> - * in the current codepage with '?'. Get the wide char command line and
>>>> - * convert it to UTF-8 ourselves.
>>>> - */
>>>> - int wargc;
>>>> - WCHAR **wargv;
>>>> - char **uargv;
>>>> -
>>>> - wargv = CommandLineToArgvW (GetCommandLineW (), &wargc);
>>>> - if (wargv == NULL || wargc != argc)
>>>> - usage ();
>>>> -
>>>> - uargv = gc_malloc (wargc * sizeof (*uargv), false, &options->gc);
>>>> -
>>>> - for (i = 0; i < wargc; i++)
>>>> - {
>>>> - int n = WideCharToMultiByte (CP_UTF8, 0, wargv[i], -1, NULL, 0,
>>>> NULL, NULL);
>>>> - uargv[i] = gc_malloc (n, false, &options->gc);
>>>> - WideCharToMultiByte (CP_UTF8, 0, wargv[i], -1, uargv[i], n, NULL,
>>>> NULL);
>>>> - }
>>>> -
>>>> - LocalFree (wargv);
>>>> - argv = uargv;
>>>> -#endif
>>>> -
>>>> /* usage message */
>>>> if (argc <= 1)
>>>> usage ();
>
>