diff --git a/NetTunnelApp/MainForm.cs b/NetTunnelApp/MainForm.cs index 7c41f1c..1fe9be4 100644 --- a/NetTunnelApp/MainForm.cs +++ b/NetTunnelApp/MainForm.cs @@ -90,17 +90,31 @@ public partial class MainForm : Form Console.WriteLine("Create WireGuard Client Configure File: {0}", v); } + private void test_uninstall_wg_server() + { + var v = NetTunnelLib.WireGuardInstallServerService(false); + Console.WriteLine("Uninstall Result: {0}", v); + } + + private void test_install_wg_server() + { + var v = NetTunnelLib.WireGuardInstallServerService(true); + Console.WriteLine("Install Result: {0}", v); + } + private void button1_Click(object sender, EventArgs e) { - var buffer = new StringBuilder(256 + 1); + //var buffer = new StringBuilder(256 + 1); //NetTunnelLib.TunnelSDKInitEnv(); - var v = NetTunnelLib.FindWireguardExe(buffer, 256); - MessageBox.Show(buffer.ToString() + "----" + v.ToString()); + //var v = NetTunnelLib.FindWireguardExe(buffer, 256); + //MessageBox.Show(buffer.ToString() + "----" + v.ToString()); + + test_install_wg_server(); } private void button2_Click(object sender, EventArgs e) { - test_create_wg_svr_cfg(); - test_create_wg_cli_cfg(); + + test_uninstall_wg_server(); } } \ No newline at end of file diff --git a/NetTunnelApp/NetTunnelLib.cs b/NetTunnelApp/NetTunnelLib.cs index a49c3bf..933d385 100644 --- a/NetTunnelApp/NetTunnelLib.cs +++ b/NetTunnelApp/NetTunnelLib.cs @@ -129,6 +129,9 @@ public class NetTunnelLib [DllImport("NetTunnelSDK.dll", CallingConvention = CallingConvention.Cdecl)] public static extern int WireGuardCreateClientConfig(WgCliConfig cfg); + [DllImport("NetTunnelSDK.dll", CallingConvention = CallingConvention.Cdecl)] + public static extern int WireGuardInstallServerService(bool install); + //[DllImport("NetTunnelSDK.dll", CallingConvention = CallingConvention.Cdecl)] //public static extern int RunPipeCmd(String pszCmd, StringBuilder pszResultBuffer, int dwResultBufferSize); } \ No newline at end of file diff --git a/NetTunnelSDK/misc.cpp b/NetTunnelSDK/misc.cpp index 9f9851e..8c97e7d 100644 --- a/NetTunnelSDK/misc.cpp +++ b/NetTunnelSDK/misc.cpp @@ -18,7 +18,7 @@ void RemoveTailLineBreak(TCHAR *pInputStr, int strSize) { } } -int RunPipeCmd(TCHAR *pszCmd, TCHAR *pszResultBuffer, int dwResultBufferSize) { +int RunCommand(TCHAR *pszCmd, TCHAR *pszResultBuffer, int dwResultBufferSize) { BOOL bRet; HANDLE hReadPipe = nullptr; HANDLE hWritePipe = nullptr; @@ -26,6 +26,18 @@ int RunPipeCmd(TCHAR *pszCmd, TCHAR *pszResultBuffer, int dwResultBufferSize) { PROCESS_INFORMATION pi; SECURITY_ATTRIBUTES securityAttributes = {}; + if (pszCmd == nullptr) { + SPDLOG_ERROR(TEXT("Input params Error: [{0}]"), pszCmd); + return -ERR_INPUT_PARAMS; + } + + if (pszResultBuffer && dwResultBufferSize > 0) { + memset(pszResultBuffer, 0, dwResultBufferSize); + } else { + WinExec(pszCmd, SW_HIDE); + return ERR_SUCCESS; + } + memset(&si, 0, sizeof(STARTUPINFO)); memset(&pi, 0, sizeof(PROCESS_INFORMATION)); diff --git a/NetTunnelSDK/misc.h b/NetTunnelSDK/misc.h index d0f4d01..08937e5 100644 --- a/NetTunnelSDK/misc.h +++ b/NetTunnelSDK/misc.h @@ -6,10 +6,10 @@ extern "C" { // we need to export the C interface #endif - -void RemoveTailLineBreak(TCHAR* pInputStr, int strSize); -int RunPipeCmd(TCHAR* pszCmd, TCHAR* pszResultBuffer, int dwResultBufferSize); + +void RemoveTailLineBreak(TCHAR *pInputStr, int strSize); +int RunCommand(TCHAR *pszCmd, TCHAR *pszResultBuffer, int dwResultBufferSize); #ifdef __cplusplus } -#endif +#endif \ No newline at end of file diff --git a/NetTunnelSDK/tunnel.h b/NetTunnelSDK/tunnel.h index 7fd9cbd..95818fb 100644 --- a/NetTunnelSDK/tunnel.h +++ b/NetTunnelSDK/tunnel.h @@ -183,6 +183,13 @@ TUNNEL_API int __cdecl WireGuardCreateServerConfig(const PWGSERVER_CONFIG pWgCon */ TUNNEL_API int __cdecl WireGuardCreateClientConfig(const PWGCLIENT_CONFIG pWgConfig); +/** + * @brief 安装/卸载 WireGuard 服务 + * @param[in] bInstall TRUE 安装服务, FALSE 卸载服务 + * @return 函数执行结果 0: 成功, 小于0 失败 @see USER_ERRNO + */ +TUNNEL_API int __cdecl WireGuardInstallServerService(bool bInstall); + /** * @brief 清理 SDK 运行资源 */ diff --git a/NetTunnelSDK/wireguard.cpp b/NetTunnelSDK/wireguard.cpp index 554fd79..8d3e451 100644 --- a/NetTunnelSDK/wireguard.cpp +++ b/NetTunnelSDK/wireguard.cpp @@ -3,10 +3,13 @@ #include "usrerr.h" #include #include +#include #include "globalcfg.h" #include "misc.h" +#pragma comment(lib, "Shlwapi.lib") + constexpr auto WINENVBUF_SIZE = (4096); #define CFG_WIREGUARD_SECTION TEXT("WireGuard") @@ -15,6 +18,64 @@ constexpr auto WINENVBUF_SIZE = (4096); #define CFG_WGSVR_PATH TEXT("ServerConfig") #define CFG_WG_PATH TEXT("WgExe") +int WireGuardInstallServerService(bool bInstall) { + TCHAR cfgVal[MAX_PATH]; + TCHAR cmdBuf[MAX_PATH]; + + GetPrivateProfileString(CFG_WIREGUARD_SECTION, + CFG_WGSVR_PATH, + TEXT(""), + cfgVal, + MAX_PATH, + GetGlobalCfgInfo()->cfgPath); + + if (lstrlen(cfgVal) > 0) { + WIN32_FIND_DATA FindFileData; + const HANDLE hFind = FindFirstFile(cfgVal, &FindFileData); + + if (hFind != INVALID_HANDLE_VALUE) { + int ret; + + if (bInstall) { + // 安装服务 + StringCbPrintf(cmdBuf, + MAX_PATH, + TEXT("\"%s\" /installtunnelservice \"%s\""), + GetGlobalCfgInfo()->wireguardCfg.wireguardPath, + cfgVal); + } else { + // 卸载服务 + TCHAR svrName[MAX_PATH]; + + StringCbCopy(svrName, MAX_PATH, cfgVal); + PathStripPath(svrName); + PathRemoveExtension(svrName); + + StringCbPrintf(cmdBuf, + MAX_PATH, + TEXT("\"%s\" /uninstalltunnelservice %s"), + GetGlobalCfgInfo()->wireguardCfg.wireguardPath, + svrName); + } + + if ((ret = RunCommand(cmdBuf, nullptr, 0)) != ERR_SUCCESS) { + SPDLOG_ERROR("Run command [{0}] error: {1}", cmdBuf, ret); + return -ERR_CALL_SHELL; + } + + SPDLOG_DEBUG("Run command [{0}]", cmdBuf); + + return ERR_SUCCESS; + } else { + SPDLOG_ERROR("WireGuard configure file [{0}] not found", cfgVal); + return -ERR_FILE_NOT_EXISTS; + } + } else { + SPDLOG_ERROR("Configure [{0}] not found", CFG_WGSVR_PATH); + return -ERR_ITEM_UNEXISTS; + } +} + int WireGuardCreateClientConfig(const PWGCLIENT_CONFIG pWgConfig) { const size_t bufSize = 4096 * sizeof(TCHAR); const TCHAR cfgFormat[] = TEXT( @@ -255,7 +316,7 @@ int GenerateWireguardKeyPairs(TCHAR *pPubKey, int pubkeySize, TCHAR *pPrivKey, i StringCbPrintf(cmdBuffer, MAX_PATH, TEXT("cmd.exe /C \"%s\" genkey"), pCfg->wireguardCfg.wgPath); - if ((ret = RunPipeCmd(cmdBuffer, cmdResult, MAX_PATH)) != ERR_SUCCESS) { + if ((ret = RunCommand(cmdBuffer, cmdResult, MAX_PATH)) != ERR_SUCCESS) { SPDLOG_ERROR("Run command [{0}] error: {1}", cmdBuffer, ret); return -ERR_CALL_SHELL; } @@ -271,7 +332,7 @@ int GenerateWireguardKeyPairs(TCHAR *pPubKey, int pubkeySize, TCHAR *pPrivKey, i pCfg->wireguardCfg.wgPath); memset(cmdResult, 0, MAX_PATH); - if ((ret = RunPipeCmd(cmdBuffer, cmdResult, MAX_PATH)) != ERR_SUCCESS) { + if ((ret = RunCommand(cmdBuffer, cmdResult, MAX_PATH)) != ERR_SUCCESS) { SPDLOG_ERROR("Run command [{0}] error: {1}", cmdBuffer, ret); return -ERR_CALL_SHELL; } diff --git a/TestNetTunnelSDK/TestNetTunnelSDK.cpp b/TestNetTunnelSDK/TestNetTunnelSDK.cpp index 691b029..fc90b73 100644 --- a/TestNetTunnelSDK/TestNetTunnelSDK.cpp +++ b/TestNetTunnelSDK/TestNetTunnelSDK.cpp @@ -46,7 +46,7 @@ namespace TestNetTunnelSDK TCHAR buf[1024]; int ret = ERR_SUCCESS; - Assert::AreEqual(ret, RunPipeCmd(TEXT("cmd.exe /C dir E:\\"), buf, 1024)); + Assert::AreEqual(ret, RunCommand(TEXT("cmd.exe /C dir E:\\"), buf, 1024)); Logger::WriteMessage("Return:"); Logger::WriteMessage(buf); #endif