Feature: Add menu to use standard FRP to proxy client's port

This commit is contained in:
yuanyuanxiang
2026-01-29 22:53:49 +01:00
parent 3c013c1346
commit 91ddf936dc
12 changed files with 216 additions and 68 deletions

View File

@@ -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;

View File

@@ -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);

View File

@@ -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 或更高版本来启用可视化方式,

Binary file not shown.

View File

@@ -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*)&param, 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*)&param, 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("导入主控程序的历史主机记录。此操作会覆盖本机的历史记录,请仅在迁移主控程序时进行操作。"

View File

@@ -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();
};

View File

@@ -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("透明度");
}
}

View File

@@ -391,6 +391,8 @@ Rar
<EFBFBD>ͻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>=Client Proxy
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӳ<EFBFBD><EFBFBD>=Proxy Mapping
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD>=Proxy Port
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD> - <20><><EFBFBD><EFBFBD>=Proxy Port - Custom
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD> - <20><>׼=Proxy Port - Standard
<EFBFBD><EFBFBD>Ȩ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>=Run as Admin
ִ<EFBFBD>г<EFBFBD><EFBFBD><EFBFBD>=Execute
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD><EFBFBD>=Download & Run
@@ -1141,3 +1143,20 @@ WIN32
ʹ<CEB4><CAB9>FRP]=[Not Using FRP]
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԡ<EFBFBD><EFBFBD><EFBFBD>״<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>κα<EFBFBD>֤<EFBFBD><EFBFBD>ʹ<EFBFBD>ñ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ķ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ге<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Dz<EFBFBD><EFBFBD><EFBFBD><EFBFBD>κ<EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>ñ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ķǷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>;<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD>Ӧ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ط<EFBFBD><EFBFBD>ɷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ε<EFBFBD>ʹ<EFBFBD>ñ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߶<EFBFBD><EFBFBD>κ<EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>ñ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>𺦲<EFBFBD><EFBFBD>е<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ρ<EFBFBD>=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.
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD>ж<EFBFBD><EFBFBD>Ƶ<EFBFBD>FRPS<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˳<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˲˵<EFBFBD>! <20>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>?=Warning: Do not click this menu if you do not have a customized FRPS server program! Do you wish to proceed?
<EFBFBD>˹<EFBFBD><EFBFBD>ܻὫFRP<EFBFBD><EFBFBD>token<EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD><EFBFBD>ͻ<EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>ã<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>! <20>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>?=This feature will pass the FRP token to the client. Please proceed with caution! Do you wish to continue?
<EFBFBD><EFBFBD>ͣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>=Pause Control
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ļ=Control Screen
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>=Unlock
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>=Lock
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>=Move Up
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>=Move Down
<EFBFBD><EFBFBD>ͼ=Screenshot
͸<EFBFBD><EFBFBD>75%=Opacity 75%
͸<EFBFBD><EFBFBD>50%=Opacity 50%
͸<EFBFBD><EFBFBD><EFBFBD><EFBFBD>=Opacity
Ŀ¼<EFBFBD><EFBFBD>ѡ<EFBFBD>񣬿<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>=Directory selected. A restart may be required.
<EFBFBD><EFBFBD>ѡ<EFBFBD><EFBFBD>Ŀ¼=Language location
<EFBFBD><EFBFBD><EFBFBD>ʻ<EFBFBD>(&N)=Internationalization
<EFBFBD><EFBFBD><EFBFBD>԰<EFBFBD>Ŀ¼(&D)=Language Pack Directory
<EFBFBD><EFBFBD>ͨ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>չ<EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>԰<EFBFBD>Ŀ¼<EFBFBD><EFBFBD>֧<EFBFBD>ֶ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>=Please specify the language pack directory via the "Extensions" menu to enable multi-language support.

View File

@@ -390,6 +390,8 @@ Rar
<EFBFBD>ͻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>=<EFBFBD>Ñ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӳ<EFBFBD><EFBFBD>=<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD>=<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>B<EFBFBD>Ӳ<EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD> - <20><><EFBFBD><EFBFBD>=<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>B<EFBFBD>Ӳ<EFBFBD> - ӆ<>u
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD> - <20><>׼=<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>B<EFBFBD>Ӳ<EFBFBD> - <20>˜<EFBFBD>
<EFBFBD><EFBFBD>Ȩ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>=<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ִ<EFBFBD>г<EFBFBD><EFBFBD><EFBFBD>=<EFBFBD><EFBFBD><EFBFBD>г<EFBFBD>ʽ
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD><EFBFBD>=<EFBFBD><EFBFBD><EFBFBD>d<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
@@ -1138,3 +1140,20 @@ WIN32
ʹ<CEB4><CAB9>FRP]=[δʹ<CEB4><CAB9>FRP]
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԡ<EFBFBD><EFBFBD><EFBFBD>״<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>κα<EFBFBD>֤<EFBFBD><EFBFBD>ʹ<EFBFBD>ñ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ķ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ге<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Dz<EFBFBD><EFBFBD><EFBFBD><EFBFBD>κ<EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>ñ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ķǷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>;<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD>Ӧ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ط<EFBFBD><EFBFBD>ɷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ε<EFBFBD>ʹ<EFBFBD>ñ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߶<EFBFBD><EFBFBD>κ<EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>ñ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>𺦲<EFBFBD><EFBFBD>е<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ρ<EFBFBD>=<EFBFBD><EFBFBD>ܛ<EFBFBD>w<EFBFBD>ԡ<EFBFBD><EFBFBD>F<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>κα<EFBFBD><EFBFBD>C<EFBFBD><EFBFBD>ʹ<EFBFBD>ñ<EFBFBD>ܛ<EFBFBD>w<EFBFBD><EFBFBD><EFBFBD>L<EFBFBD>U<EFBFBD><EFBFBD>ʹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>гГ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>҂<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>κ<EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>ñ<EFBFBD>ܛ<EFBFBD>w<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>l<EFBFBD>ķǷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>;ؓ؟<EFBFBD><EFBFBD>ʹ<EFBFBD><EFBFBD><EFBFBD>ߑ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>P<EFBFBD><EFBFBD><EFBFBD>ɷ<EFBFBD>Ҏ<EFBFBD><EFBFBD><EFBFBD>Kؓ؟<EFBFBD>ε<EFBFBD>ʹ<EFBFBD>ñ<EFBFBD>ܛ<EFBFBD>w<EFBFBD><EFBFBD><EFBFBD>_<EFBFBD>l<EFBFBD>ߌ<EFBFBD><EFBFBD>κ<EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>ñ<EFBFBD>ܛ<EFBFBD>w<EFBFBD>a<EFBFBD><EFBFBD><EFBFBD>ēp<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Г<EFBFBD>؟<EFBFBD>Ρ<EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD>ж<EFBFBD><EFBFBD>Ƶ<EFBFBD>FRPS<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˳<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˲˵<EFBFBD>! <20>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>?=<EFBFBD><EFBFBD><EFBFBD><EFBFBD>u<EFBFBD><EFBFBD> FRPS <20>ŷ<EFBFBD><C5B7><EFBFBD><EFBFBD><EFBFBD>ʽ<EFBFBD><CABD>Ո<EFBFBD><D588><EFBFBD>c<EFBFBD><63><EFBFBD><EFBFBD><EFBFBD>x<EFBFBD>Σ<EFBFBD><CEA3>Ƿ<EFBFBD><C7B7>^<5E>m<EFBFBD><6D>
<EFBFBD>˹<EFBFBD><EFBFBD>ܻὫFRP<EFBFBD><EFBFBD>token<EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD><EFBFBD>ͻ<EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>ã<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>! <20>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>?=<EFBFBD>˹<EFBFBD><EFBFBD>ܕ<EFBFBD><EFBFBD><EFBFBD> FRP <20><> Token <20><><EFBFBD>f<EFBFBD><66><EFBFBD>Ñ<EFBFBD><C391><EFBFBD>ʹ<EFBFBD>ã<EFBFBD>Ո֔<D588><D694><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7>^<5E>m<EFBFBD><6D>
<EFBFBD><EFBFBD>ͣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>=<EFBFBD><EFBFBD>ͣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ļ=<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ΞĻ
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>=<EFBFBD><EFBFBD><EFBFBD>i
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>=<EFBFBD>i<EFBFBD><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>=<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>=<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<EFBFBD><EFBFBD>ͼ=ΞĻ<EFBFBD>؈D
͸<EFBFBD><EFBFBD>75%=͸<EFBFBD><EFBFBD> 75%
͸<EFBFBD><EFBFBD>50%=͸<EFBFBD><EFBFBD> 50%
͸<EFBFBD><EFBFBD><EFBFBD><EFBFBD>=͸<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
Ŀ¼<EFBFBD><EFBFBD>ѡ<EFBFBD>񣬿<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>=Ŀ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>x<EFBFBD>񣬿<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD><EFBFBD>†<EFBFBD><EFBFBD>ӳ<EFBFBD>ʽ<EFBFBD><EFBFBD>
<EFBFBD><EFBFBD>ѡ<EFBFBD><EFBFBD>Ŀ¼=Ո<EFBFBD>x<EFBFBD><EFBFBD>Ŀ<EFBFBD><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD>ʻ<EFBFBD>(&N)=<EFBFBD><EFBFBD><EFBFBD>H<EFBFBD><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD>԰<EFBFBD>Ŀ¼(&D)=<EFBFBD>Z<EFBFBD>԰<EFBFBD>Ŀ<EFBFBD><EFBFBD>
<EFBFBD><EFBFBD>ͨ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>չ<EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>԰<EFBFBD>Ŀ¼<EFBFBD><EFBFBD>֧<EFBFBD>ֶ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>=Ո͸<EFBFBD>^<5E><><EFBFBD>U<EFBFBD><EFBFBD>x<EFBFBD><78>ָ<EFBFBD><D6B8><EFBFBD>Z<EFBFBD>԰<EFBFBD>Ŀ䛣<C4BF><E49BA3><EFBFBD>֧Ԯ<D6A7><D4AE><EFBFBD><EFBFBD><EFBFBD>Z<EFBFBD>ԡ<EFBFBD>

View File

@@ -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);

Binary file not shown.

View File

@@ -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