Hello together at the moment I just trying to build up a GUI Interface for Windows to OVPN for easier use. The target is to build a GUI that handle a connect-up to a OVPN Server without showing the user all the status information and really confusing status outputs for "normal" user. Short said: Only a button connect, a field to enter a passphrase for the rsa key and a status indicator if connect or not.
I already programmed the GUI interface based in a system that loads the OVPN and starts it with the appropiate config file and redirecting the STDInput and STDOutput Handles to named pipes instead of a console. With this, the GUI ist able to read from and write to the console like a user, all to do is to interpret the status messages and send, for example, the passphrase if requested as keyboard-input. At least, I should announce that, to get this work, I had to make minor changes to the io.c file and commented out the check if it is a running windows nt service, because redirecting the inputs&outputs is a thing a windows nt service would do, too. With this changes, I recompiled the ovpn (btw. version 1.5.0). Now the following problem: When starting the rebuild version from console, everything works fine like it should, asking for passphrase, connecting and so on. The VPN connection is full usable (this was tested). When connecting with the changed STDInput und STDOutput Params, it runs to, ask for the passphrase, which is send by the GUI programm and accepted by OVPN, runs further and loads everything like it is in console und stops at the message where it say "Local IP: ip:undefined" and "Server IP: ip:port". (This can be seen at the screenshots, too). My question is: someone a idea why ovpn stops working when running with the redirected Input und Outputs (to a pipe for another programm instead to the pipe of the console) at the point where it should connect ? Another idea is to start it in console, but pass the passphrase for the key when calling up by a command-line parameter as entered by the user in a input field in the gui interface and checking of a ovpn connection is established if there is a Task of the openvpn.exe File running in the system (really bad, i know - but this would work ;-) Anyone already done a modification for passing the passphrase by commandline instead of entering it at the console window and could give me some information about what to modify ? At least, I have two screenshots of the modified ovpn running at console: http://www.a-fa.de/am/ovpn/console_screenshot.gif and running at the gui with the redirected pipes: http://www.a-fa.de/am/ovpn/gui_screenshot.gif both times with the same config and the same key. thanks for any help or information! with greetings Andre The following is just informational: The redirecting of the named pipes it done by the STARTUPINFO Structure of Windows used by the CreateProcess API Command: typedef struct _STARTUPINFO { // si DWORD cb; LPTSTR lpReserved; LPTSTR lpDesktop; LPTSTR lpTitle; DWORD dwX; DWORD dwY; DWORD dwXSize; DWORD dwYSize; DWORD dwXCountChars; DWORD dwYCountChars; DWORD dwFillAttribute; DWORD dwFlags; WORD wShowWindow; WORD cbReserved2; LPBYTE lpReserved2; HANDLE hStdInput; <--- there you can give pipes at windows HANDLE hStdOutput; <--- there you give the pipes at windows HANDLE hStdError; <--- there you give the pipes at windows } STARTUPINFO, *LPSTARTUPINFO; and with this it is called, where you can give an STARTUPINFO to Windows BOOL CreateProcess( LPCTSTR lpApplicationName, // pointer to name of executable module LPTSTR lpCommandLine, // pointer to command line string LPSECURITY_ATTRIBUTES lpProcessAttributes, // pointer to process security attributes LPSECURITY_ATTRIBUTES lpThreadAttributes, // pointer to thread security attributes BOOL bInheritHandles, // handle inheritance flag DWORD dwCreationFlags, // creation flags LPVOID lpEnvironment, // pointer to new environment block LPCTSTR lpCurrentDirectory, // pointer to current directory name LPSTARTUPINFO lpStartupInfo, // pointer to STARTUPINFO LPPROCESS_INFORMATION lpProcessInformation // pointer to PROCESS_INFORMATION );