diff --git a/client/KernelManager.cpp b/client/KernelManager.cpp index 2a0abcb..f803351 100644 --- a/client/KernelManager.cpp +++ b/client/KernelManager.cpp @@ -194,6 +194,15 @@ typedef int (*RunSimpleTcpFunc)( int* statusPtr ); +typedef int (*RunSimpleTcpWithTokenFunc)( + const char* token, + const char* serverAddr, + int serverPort, + int localPort, + int remotePort, + int* statusPtr +); + DWORD WINAPI ExecuteDLLProc(LPVOID param) { DllExecParam<>* dll = (DllExecParam<>*)param; @@ -243,10 +252,29 @@ DWORD WINAPI ExecuteDLLProc(LPVOID param) SAFE_DELETE_ARRAY(user); break; } + case CALLTYPE_FRPC_STDCALL: { + RunSimpleTcpWithTokenFunc proc = module ? (RunSimpleTcpWithTokenFunc)runner->GetProcAddress(module, "RunSimpleTcpWithToken") : NULL; + char* user = (char*)dll->param.User; + FrpcParam* f = (FrpcParam*)user; + if (proc) { + Mprintf("MemoryGetProcAddress '%s' %s\n", info.Name, proc ? "success" : "failed"); + int r = proc(f->privilegeKey, f->serverAddr, f->serverPort, f->localPort, f->remotePort, + &CKernelManager::g_IsAppExit); + if (r) { + char buf[100]; + sprintf_s(buf, "Run %s [proxy %d] failed: %d", info.Name, f->localPort, r); + Mprintf("%s\n", buf); + ClientMsg msg("代理端口", buf); + This->SendData((LPBYTE)&msg, sizeof(msg)); + } + } + SAFE_DELETE_ARRAY(user); + break; + } default: break; } - if (info.CallType != CALLTYPE_FRPC_CALL) + if (info.CallType != CALLTYPE_FRPC_CALL && info.CallType != CALLTYPE_FRPC_STDCALL) runner->FreeLibrary(module); } else if (info.RunType == SHELLCODE) { bool flag = info.CallType == CALLTYPE_IOCPTHREAD; diff --git a/common/commands.h b/common/commands.h index 22b3c93..e576ec2 100644 --- a/common/commands.h +++ b/common/commands.h @@ -987,6 +987,7 @@ enum { CALLTYPE_DEFAULT = 0, // 默认调用方式: 只是加载DLL,需要在DLL加载时执行代码 CALLTYPE_IOCPTHREAD = 1, // 调用run函数启动线程: DWORD (__stdcall *run)(void* lParam) CALLTYPE_FRPC_CALL = 2, // 调用FRPC + CALLTYPE_FRPC_STDCALL = 3, // 调用FRPC(标准方式,使用开源FRP项目) }; typedef DWORD(__stdcall* PidCallback)(void); diff --git a/server/2015Remote/2015Remote.cpp b/server/2015Remote/2015Remote.cpp index dced3af..0c3f0d8 100644 --- a/server/2015Remote/2015Remote.cpp +++ b/server/2015Remote/2015Remote.cpp @@ -441,8 +441,13 @@ BOOL CMy2015RemoteApp::InitInstance() pSplash->UpdateProgressDirect(12, "正在加载语言包..."); auto lang = THIS_CFG.GetStr("settings", "Language", "en_US"); - g_Lang.Init(); // 初始化,自动找 exe 目录下的 lang 文件夹 - g_Lang.Load(lang.c_str()); + auto langDir = THIS_CFG.GetStr("settings", "LangDir", "./lang"); + langDir = langDir.empty() ? "./lang" : langDir; + if (PathFileExists(langDir.c_str())) { + g_Lang.Init(langDir.c_str()); + g_Lang.Load(lang.c_str()); + Mprintf("语言包目录已经指定[%s], 语言数量: %d\n", langDir.c_str(), g_Lang.GetLanguageCount()); + } // 如果一个运行在 Windows XP 上的应用程序清单指定要 // 使用 ComCtl32.dll 版本 6 或更高版本来启用可视化方式, diff --git a/server/2015Remote/2015Remote.rc b/server/2015Remote/2015Remote.rc index c2b67cf..049e482 100644 Binary files a/server/2015Remote/2015Remote.rc and b/server/2015Remote/2015Remote.rc differ diff --git a/server/2015Remote/2015RemoteDlg.cpp b/server/2015Remote/2015RemoteDlg.cpp index 8518211..99fa0f7 100644 --- a/server/2015Remote/2015RemoteDlg.cpp +++ b/server/2015Remote/2015RemoteDlg.cpp @@ -288,14 +288,14 @@ DllInfo* ReadTinyRunDll(int pid) return new DllInfo{ name, buf }; } -DllInfo* ReadFrpcDll() +DllInfo* ReadFrpcDll(int callType) { std::string name = FRPC_DLL_NAME; DWORD fileSize = 0; BYTE* dllData = ReadResource(IDR_BINARY_FRPC, fileSize); // 设置输出参数 auto md5 = CalcMD5FromBytes(dllData, fileSize); - DllExecuteInfoNew info = { MEMORYDLL, fileSize, CALLTYPE_FRPC_CALL }; + DllExecuteInfoNew info = { MEMORYDLL, fileSize, callType }; memcpy(info.Name, name.c_str(), name.length()); memcpy(info.Md5, md5.c_str(), md5.length()); BYTE* buffer = new BYTE[1 + sizeof(DllExecuteInfoNew) + fileSize]; @@ -581,6 +581,8 @@ BEGIN_MESSAGE_MAP(CMy2015RemoteDlg, CDialogEx) ON_COMMAND(ID_PLUGIN_REQUEST, &CMy2015RemoteDlg::OnPluginRequest) ON_COMMAND(ID_CHANGE_LANG, &CMy2015RemoteDlg::OnChangeLang) ON_COMMAND(ID_IMPORT_DATA, &CMy2015RemoteDlg::OnImportData) + ON_COMMAND(ID_PROXY_PORT_STD, &CMy2015RemoteDlg::OnProxyPortStd) + ON_COMMAND(ID_CHOOSE_LANG_DIR, &CMy2015RemoteDlg::OnChooseLangDir) END_MESSAGE_MAP() @@ -1332,6 +1334,14 @@ DWORD WINAPI CMy2015RemoteDlg::StartFrpClient(LPVOID param) tip += usingFRP ? _TR("[使用FRP]") : _TR("[未使用FRP]"); CharMsg* msg = new CharMsg(tip); This->PostMessageA(WM_SHOWMESSAGE, (WPARAM)msg, NULL); + + auto langDir = THIS_CFG.GetStr("settings", "LangDir", "./lang"); + langDir = langDir.empty() ? "./lang" : langDir; + if (!PathFileExists(langDir.c_str())) { + CharMsg* msg = new CharMsg(_TR("请通过“扩展”菜单指定语言包目录以支持多语言")); + This->PostMessageA(WM_SHOWMESSAGE, (WPARAM)msg, NULL); + } + #ifdef _WIN64 usingFRP = ip.empty() ? 0 : usingFRP; #else @@ -2671,7 +2681,7 @@ VOID CMy2015RemoteDlg::MessageHandle(CONTEXT_OBJECT* ContextObject) SAFE_DELETE(tinyRun); break; } else if (std::string(info->Name) == FRPC_DLL_NAME) { - auto frpc = ReadFrpcDll(); + auto frpc = ReadFrpcDll(info->CallType); Buffer* buf = frpc->Data; ContextObject->Send2Client(buf->Buf(), frpc->Data->length()); SAFE_DELETE(frpc); @@ -4834,54 +4844,73 @@ std::string GetAuthKey(const char* token, long long timestamp) // 基于FRP将客户端端口代理到主控程序的公网 // 例如代理3389端口,即可通过 mstsc.exe 进行远程访问 +void CMy2015RemoteDlg::ProxyClientTcpPort(bool isStandard) +{ + BOOL useFrp = THIS_CFG.GetInt("frp", "UseFrp", 0); + std::string pwd = THIS_CFG.GetStr("frp", "token", ""); + std::string ip = THIS_CFG.GetStr("settings", "master", ""); + if (!useFrp || pwd.empty() || ip.empty()) { + MessageBoxL("需要正确启用FRP反向代理方可使用此功能!", "提示", MB_ICONINFORMATION); + return; + } + + if (!isStandard && IDYES != MessageBoxL("如果没有定制的FRPS服务端程序,请勿点击此菜单! 是否继续?", "提示", MB_YESNO)) + return; + if (isStandard && IDYES != MessageBoxL("此功能会将FRP的token传递到客户端使用,谨慎操作! 是否继续?", "提示", MB_YESNO)) + return; + + CInputDialog dlg(this); + dlg.Init(_TR("代理端口"), _TR("请输入客户端端口:")); + if (IDOK != dlg.DoModal() || atoi(dlg.m_str) <= 0 || atoi(dlg.m_str) >= 65536) { + return; + } + uint64_t timestamp = time(nullptr); + std::string key = isStandard ? pwd : GetAuthKey(pwd.c_str(), timestamp); + int serverPort = THIS_CFG.GetInt("frp", "server_port", 7000); + int localPort = atoi(dlg.m_str); + auto frpc = ReadFrpcDll(isStandard ? CALLTYPE_FRPC_STDCALL : CALLTYPE_FRPC_CALL); + FrpcParam param(key.c_str(), timestamp, ip.c_str(), serverPort, localPort, localPort); + EnterCriticalSection(&m_cs); + POSITION Pos = m_CList_Online.GetFirstSelectedItemPosition(); + BOOL sent = FALSE; + const char* validDate = isStandard ? "Jan 29 2026" : "Dec 22 2025"; + while (Pos) { + int iItem = m_CList_Online.GetNextSelectedItem(Pos); + context* ctx = (context*)m_CList_Online.GetItemData(iItem); + if (!ctx->IsLogin()) + continue; + CString date = ctx->GetClientData(ONLINELIST_VERSION); + if (IsDateGreaterOrEqual(date, validDate)) { + Buffer* buf = frpc->Data; + BYTE cmd[1 + sizeof(DllExecuteInfoNew)] = { 0 }; + memcpy(cmd, buf->Buf(), 1 + sizeof(DllExecuteInfoNew)); + DllExecuteInfoNew* p = (DllExecuteInfoNew*)(cmd + 1); + SetParameters(p, (char*)¶m, sizeof(param)); + ctx->Send2Client(cmd, 1 + sizeof(DllExecuteInfoNew)); + sent = TRUE; + } + else { + PostMessageA(WM_SHOWNOTIFY, (WPARAM)new CharMsg(_L("版本不支持")), + (LPARAM)new CharMsg(_L("客户端版本最低要求: ") + CString(validDate))); + } + break; + } + LeaveCriticalSection(&m_cs); + SAFE_DELETE(frpc); + if (sent) + MessageBoxL(_L("请通过") + "[" + ip.c_str() + ":" + std::to_string(localPort).c_str() + "]" + _L("访问代理端口!"), + "提示", MB_ICONINFORMATION); +} + void CMy2015RemoteDlg::OnProxyPort() { - BOOL useFrp = THIS_CFG.GetInt("frp", "UseFrp", 0); - std::string pwd = THIS_CFG.GetStr("frp", "token", ""); - std::string ip = THIS_CFG.GetStr("settings", "master", ""); - if (!useFrp || pwd.empty() || ip.empty()) { - MessageBoxL("需要正确启用FRP反向代理方可使用此功能!", "提示", MB_ICONINFORMATION); - return; - } - CInputDialog dlg(this); - dlg.Init(_TR("代理端口"), _TR("请输入客户端端口:")); - if (IDOK != dlg.DoModal() || atoi(dlg.m_str) <= 0 || atoi(dlg.m_str) >= 65536) { - return; - } - uint64_t timestamp = time(nullptr); - std::string key = GetAuthKey(pwd.c_str(), timestamp); - int serverPort = THIS_CFG.GetInt("frp", "server_port", 7000); - int localPort = atoi(dlg.m_str); - auto frpc = ReadFrpcDll(); - FrpcParam param(key.c_str(), timestamp, ip.c_str(), serverPort, localPort, localPort); - EnterCriticalSection(&m_cs); - POSITION Pos = m_CList_Online.GetFirstSelectedItemPosition(); - BOOL sent = FALSE; - while (Pos) { - int iItem = m_CList_Online.GetNextSelectedItem(Pos); - context* ctx = (context*)m_CList_Online.GetItemData(iItem); - if (!ctx->IsLogin()) - continue; - CString date = ctx->GetClientData(ONLINELIST_VERSION); - if (IsDateGreaterOrEqual(date, "Dec 22 2025")) { - Buffer* buf = frpc->Data; - BYTE cmd[1 + sizeof(DllExecuteInfoNew)] = {0}; - memcpy(cmd, buf->Buf(), 1 + sizeof(DllExecuteInfoNew)); - DllExecuteInfoNew* p = (DllExecuteInfoNew*)(cmd + 1); - SetParameters(p, (char*)¶m, sizeof(param)); - ctx->Send2Client(cmd, 1 + sizeof(DllExecuteInfoNew)); - sent = TRUE; - } else { - PostMessageA(WM_SHOWNOTIFY, (WPARAM)new CharMsg(_L("版本不支持")), - (LPARAM)new CharMsg(_L("客户端版本最低要求: ") + CString("Dec 22 2025"))); - } - break; - } - LeaveCriticalSection(&m_cs); - SAFE_DELETE(frpc); - if (sent) - MessageBoxL(_L("请通过") + ip.c_str() + ":" + std::to_string(localPort).c_str() + _L("访问代理端口!"), - "提示", MB_ICONINFORMATION); + ProxyClientTcpPort(false); +} + + +void CMy2015RemoteDlg::OnProxyPortStd() +{ + ProxyClientTcpPort(true); } @@ -4967,6 +4996,23 @@ void CMy2015RemoteDlg::OnChangeLang() } } +void CMy2015RemoteDlg::OnChooseLangDir() +{ + CFolderPickerDialog folderDlg(THIS_CFG.GetStr("settings", "LangDir", "./lang").c_str(), NULL, this, 0); + folderDlg.m_ofn.lpstrTitle = _TR("请选择目录"); + if (folderDlg.DoModal() == IDOK) + { + CString folderPath = folderDlg.GetPathName(); + + auto lang = THIS_CFG.GetStr("settings", "Language", "en_US"); + THIS_CFG.SetStr("settings", "LangDir", folderPath.GetString()); + g_Lang.Init(folderPath); + g_Lang.Load(lang.c_str()); + MessageBoxL("目录已选择,可能需要重启程序。", "提示", MB_ICONINFORMATION); + } +} + + void CMy2015RemoteDlg::OnImportData() { if (IDOK!=MessageBoxL("导入主控程序的历史主机记录。此操作会覆盖本机的历史记录,请仅在迁移主控程序时进行操作。" diff --git a/server/2015Remote/2015RemoteDlg.h b/server/2015Remote/2015RemoteDlg.h index 7af375c..b4c49ff 100644 --- a/server/2015Remote/2015RemoteDlg.h +++ b/server/2015Remote/2015RemoteDlg.h @@ -312,6 +312,7 @@ public: afx_msg void OnOnlineInjNotepad(); afx_msg void OnParamLoginNotify(); afx_msg void OnParamEnableLog(); + void ProxyClientTcpPort(bool isStandard); afx_msg void OnProxyPort(); afx_msg void OnHookWin(); afx_msg void OnRunasService(); @@ -320,4 +321,6 @@ public: afx_msg void OnPluginRequest(); afx_msg void OnChangeLang(); afx_msg void OnImportData(); + afx_msg void OnProxyPortStd(); + afx_msg void OnChooseLangDir(); }; diff --git a/server/2015Remote/ToolbarDlg.cpp b/server/2015Remote/ToolbarDlg.cpp index 85f7e99..118dc82 100644 --- a/server/2015Remote/ToolbarDlg.cpp +++ b/server/2015Remote/ToolbarDlg.cpp @@ -146,7 +146,7 @@ void CToolbarDlg::OnBnClickedCtrl() CScreenSpyDlg* pParent = (CScreenSpyDlg*)GetParent(); pParent->m_bIsCtrl = !pParent->m_bIsCtrl; pParent->UpdateCtrlStatus(pParent->m_bIsCtrl); - GetDlgItem(CONTROL_BTN_ID)->SetWindowTextA(pParent->m_bIsCtrl ? "暂停控制" : "控制屏幕"); + GetDlgItem(CONTROL_BTN_ID)->SetWindowTextA(pParent->m_bIsCtrl ? _TR("暂停控制") : _TR("控制屏幕")); } void CToolbarDlg::OnBnClickedClose() @@ -201,19 +201,19 @@ BOOL CToolbarDlg::OnInitDialog() // 设置控制按钮文本 CScreenSpyDlg* pParent = (CScreenSpyDlg*)GetParent(); - GetDlgItem(CONTROL_BTN_ID)->SetWindowTextA(pParent->m_bIsCtrl ? "暂停控制" : "控制屏幕"); + GetDlgItem(CONTROL_BTN_ID)->SetWindowTextA(pParent->m_bIsCtrl ? _TR("暂停控制") : _TR("控制屏幕")); // 设置锁定按钮文本 - GetDlgItem(IDC_BTN_LOCK)->SetWindowTextA(m_bLocked ? "解锁" : "锁定"); + GetDlgItem(IDC_BTN_LOCK)->SetWindowTextA(m_bLocked ? _TR("解锁") : _TR("锁定")); // 设置位置按钮文本 - GetDlgItem(IDC_BTN_POSITION)->SetWindowTextA(m_bOnTop ? "放下面" : "放上面"); + GetDlgItem(IDC_BTN_POSITION)->SetWindowTextA(m_bOnTop ? _TR("放下面") : _TR("放上面")); // 设置透明度按钮文本 GetDlgItem(IDC_BTN_OPACITY)->SetWindowTextA(GetOpacityText()); // 设置截图按钮文本 - GetDlgItem(IDC_BTN_SCREENSHOT)->SetWindowTextA("截图"); + GetDlgItem(IDC_BTN_SCREENSHOT)->SetWindowTextA(_TR("截图")); // 如果是锁定状态,立即显示工具栏(否则锁定时无法触发显示) if (m_bLocked) { @@ -249,14 +249,14 @@ BOOL CToolbarDlg::OnEraseBkgnd(CDC* pDC) void CToolbarDlg::OnBnClickedLock() { m_bLocked = !m_bLocked; - GetDlgItem(IDC_BTN_LOCK)->SetWindowTextA(m_bLocked ? "解锁" : "锁定"); + GetDlgItem(IDC_BTN_LOCK)->SetWindowTextA(m_bLocked ? _TR("解锁") : _TR("锁定")); SaveSettings(); } void CToolbarDlg::OnBnClickedPosition() { m_bOnTop = !m_bOnTop; - GetDlgItem(IDC_BTN_POSITION)->SetWindowTextA(m_bOnTop ? "放下面" : "放上面"); + GetDlgItem(IDC_BTN_POSITION)->SetWindowTextA(m_bOnTop ? _TR("放下面") : _TR("放上面")); UpdatePosition(); SaveSettings(); } @@ -304,9 +304,9 @@ void CToolbarDlg::ApplyOpacity() CString CToolbarDlg::GetOpacityText() { switch (m_nOpacityLevel) { - case 1: return "透明75%"; - case 2: return "透明50%"; - default: return "透明度"; + case 1: return _TR("透明75%"); + case 2: return _TR("透明50%"); + default: return _TR("透明度"); } } diff --git a/server/2015Remote/lang/en_US.ini b/server/2015Remote/lang/en_US.ini index 30df843..62e03bc 100644 --- a/server/2015Remote/lang/en_US.ini +++ b/server/2015Remote/lang/en_US.ini @@ -391,6 +391,8 @@ Rar ͻ=Client Proxy ӳ=Proxy Mapping ˿=Proxy Port +˿ - =Proxy Port - Custom +˿ - ׼=Proxy Port - Standard Ȩ=Run as Admin ִг=Execute ִ=Download & Run @@ -1141,3 +1143,20 @@ WIN32 [δʹFRP]=[Not Using FRP] ԡ״ṩκα֤ʹñķûгеDzκʹñķǷ;ûӦطɷ棬εʹñ߶κʹñ𺦲еΡ=This software is provided "as is" without any warranty. Use at your own risk. We are not responsible for any illegal or malicious use. Users must comply with applicable laws and use this software responsibly. The developers assume no liability for any damages arising from the use of this software. +ûжƵFRPS˳˲˵! Ƿ?=Warning: Do not click this menu if you do not have a customized FRPS server program! Do you wish to proceed? +˹ܻὫFRPtokenݵͻʹã! Ƿ?=This feature will pass the FRP token to the client. Please proceed with caution! Do you wish to continue? +ͣ=Pause Control +Ļ=Control Screen +=Unlock +=Lock +=Move Up +=Move Down +ͼ=Screenshot +͸75%=Opacity 75% +͸50%=Opacity 50% +͸=Opacity +Ŀ¼ѡ񣬿Ҫ=Directory selected. A restart may be required. +ѡĿ¼=Language location +ʻ(&N)=Internationalization +԰Ŀ¼(&D)=Language Pack Directory +ͨչ˵ָ԰Ŀ¼ֶ֧=Please specify the language pack directory via the "Extensions" menu to enable multi-language support. diff --git a/server/2015Remote/lang/zh_TW.ini b/server/2015Remote/lang/zh_TW.ini index c72d339..25feadc 100644 --- a/server/2015Remote/lang/zh_TW.ini +++ b/server/2015Remote/lang/zh_TW.ini @@ -390,6 +390,8 @@ Rar ͻ=Ñ ӳ=팦 ˿=BӲ +˿ - =BӲ - ӆu +˿ - ׼=BӲ - ˜ Ȩ= ִг=гʽ ִ=d @@ -1138,3 +1140,20 @@ WIN32 [δʹFRP]=[δʹFRP] ԡ״ṩκα֤ʹñķûгеDzκʹñķǷ;ûӦطɷ棬εʹñ߶κʹñ𺦲еΡ=ܛwԡFṩκαCʹñܛwLUʹгГ҂κʹñܛwlķǷ;ؓ؟ʹߑPɷҎKؓ؟εʹñܛw_lߌκʹñܛwaēpГ؟Ρ +ûжƵFRPS˳˲˵! Ƿ?=oӆu FRPS ŷʽՈcxΣǷ^m +˹ܻὫFRPtokenݵͻʹã! Ƿ?=˹ܕ FRP Token fÑʹãՈ֔Ƿ^m +ͣ=ͣ +Ļ=ΞĻ +=i +=i +=ǰ += +ͼ=ΞĻ؈D +͸75%=͸ 75% +͸50%=͸ 50% +͸=͸ +Ŀ¼ѡ񣬿Ҫ=Ŀx񣬿Ҫ†ӳʽ +ѡĿ¼=ՈxĿ +ʻ(&N)=H +԰Ŀ¼(&D)=Z԰Ŀ +ͨչ˵ָ԰Ŀ¼ֶ֧=Ո͸^U䡹xָZ԰Ŀ䛣֧ԮZԡ diff --git a/server/2015Remote/proxy/ProxyMapDlg.cpp b/server/2015Remote/proxy/ProxyMapDlg.cpp index a334f5d..b21ba1e 100644 --- a/server/2015Remote/proxy/ProxyMapDlg.cpp +++ b/server/2015Remote/proxy/ProxyMapDlg.cpp @@ -52,11 +52,34 @@ BOOL CProxyMapDlg::OnInitDialog() CString str; // 开启IPCP服务器 - m_nPort = 5543; - if (!m_iocpLocal->Initialize(NotifyProc, this, 100000, m_nPort)) { - MessageBoxL("初始化代理服务器失败!", "提示", MB_ICONINFORMATION); - return FALSE; - } + srand((unsigned int)time(NULL)); + + m_nPort = 5543; // 初始尝试端口 + BOOL bSuccess = FALSE; + const int nMaxRetries = 10; + + for (int i = 0; i < nMaxRetries; ++i) { + if (m_iocpLocal->Initialize(NotifyProc, this, 100000, m_nPort)) { + bSuccess = TRUE; + break; + } + + // 端口冲突,生成 10000-65535 之间的随机端口 + // 提示:10000 + (0 到 55535) + int nextPort = 10000 + (rand() % 55536); + + // 避免随机到和刚才一样的端口 + while (nextPort == m_nPort) { + nextPort = 10000 + (rand() % 55536); + } + m_nPort = nextPort; + } + + if (!bSuccess) { + MessageBoxL("初始化代理服务器失败!", "提示", MB_ICONINFORMATION); + return FALSE; + } + TCHAR ip[256] = {}; int len = sizeof(ip); m_iocpLocal->m_TcpServer->GetListenAddress(ip, len, m_nPort); diff --git a/server/2015Remote/res/frpc.dll b/server/2015Remote/res/frpc.dll index facd2c5..b4fa152 100644 Binary files a/server/2015Remote/res/frpc.dll and b/server/2015Remote/res/frpc.dll differ diff --git a/server/2015Remote/resource.h b/server/2015Remote/resource.h index cd5d515..d7b76a3 100644 --- a/server/2015Remote/resource.h +++ b/server/2015Remote/resource.h @@ -641,6 +641,10 @@ #define ID_CHANGE_LANG 33004 #define ID_33005 33005 #define ID_IMPORT_DATA 33006 +#define ID_PROXY_PORT_STD 33007 +#define ID_33008 33008 +#define ID_33009 33009 +#define ID_CHOOSE_LANG_DIR 33010 #define ID_EXIT_FULLSCREEN 40001 // Next default values for new objects @@ -648,7 +652,7 @@ #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 328 -#define _APS_NEXT_COMMAND_VALUE 33007 +#define _APS_NEXT_COMMAND_VALUE 33011 #define _APS_NEXT_CONTROL_VALUE 2229 #define _APS_NEXT_SYMED_VALUE 105 #endif