diff --git a/ReadMe.md b/ReadMe.md index 61df274..8e373dd 100644 --- a/ReadMe.md +++ b/ReadMe.md @@ -304,6 +304,10 @@ reorg: Move commands to common/commands.h 2024.12.31 生成服务时增加加密选项,当前支持XOR加密。配合使用解密程序来加载加密后的服务。 +2024.01.12 +修复被控程序关于远程桌面相关可能的2处问题(#28 #29)。增加对主控端列表窗口的排序功能(#26 #27),以便快速定位窗口、服务或进程。 + + # 沟通反馈 diff --git a/server/2015Remote/ServicesDlg.cpp b/server/2015Remote/ServicesDlg.cpp index 4922209..a4b18b5 100644 --- a/server/2015Remote/ServicesDlg.cpp +++ b/server/2015Remote/ServicesDlg.cpp @@ -11,6 +11,14 @@ IMPLEMENT_DYNAMIC(CServicesDlg, CDialog) +// ItemData1 ҪItemDataͬˣͬĻԻ +typedef struct ItemData1 +{ + CString Data[5]; + CString GetData(int index) const { + return this ? Data[index] : ""; + } +} ItemData1; CServicesDlg::CServicesDlg(CWnd* pParent, IOCPServer* IOCPServer, CONTEXT_OBJECT *ContextObject) : CDialog(CServicesDlg::IDD, pParent) @@ -39,6 +47,7 @@ BEGIN_MESSAGE_MAP(CServicesDlg, CDialog) ON_COMMAND(ID_SERVICES_START, &CServicesDlg::OnServicesStart) ON_COMMAND(ID_SERVICES_REFLASH, &CServicesDlg::OnServicesReflash) ON_NOTIFY(NM_RCLICK, IDC_LIST, &CServicesDlg::OnNMRClickList) + ON_NOTIFY(HDN_ITEMCLICK, 0, &CServicesDlg::OnHdnItemclickList) END_MESSAGE_MAP() @@ -79,7 +88,7 @@ int CServicesDlg::ShowServicesList(void) char *szAutoRun; char *szFilePath; DWORD dwOffset = 0; - m_ControlList.DeleteAllItems(); + DeleteAllItems(); int i = 0; for (i = 0; dwOffset < m_ContextObject->InDeCompressedBuffer.GetBufferLength() - 1; ++i) @@ -95,7 +104,8 @@ int CServicesDlg::ShowServicesList(void) m_ControlList.SetItemText(i, 2, szAutoRun); m_ControlList.SetItemText(i, 3, szRunWay); m_ControlList.SetItemText(i, 4, szFilePath ); - + auto data = new ItemData1{ szServiceName, szDisplayName, szAutoRun, szRunWay, szFilePath }; + m_ControlList.SetItemData(i, (DWORD_PTR)data); dwOffset += lstrlen(szDisplayName) + lstrlen(szServiceName) + lstrlen(szFilePath) + lstrlen(szRunWay) + lstrlen(szAutoRun) +5; } @@ -114,6 +124,7 @@ void CServicesDlg::OnClose() #if CLOSE_DELETE_DLG m_ContextObject->v1 = 0; #endif + DeleteAllItems(); CancelIo((HANDLE)m_ContextObject->sClientSocket); closesocket(m_ContextObject->sClientSocket); CDialog::OnClose(); @@ -153,6 +164,57 @@ void CServicesDlg::OnServicesReflash() m_iocpServer->OnClientPreSending(m_ContextObject, &bToken, 1); } +// ͷԴԺ +void CServicesDlg::DeleteAllItems() { + for (int i = 0; i < m_ControlList.GetItemCount(); i++) + { + auto data = (ItemData1*)m_ControlList.GetItemData(i); + if (NULL != data) { + delete data; + } + } + m_ControlList.DeleteAllItems(); +} + +int CALLBACK CServicesDlg::CompareFunction(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort) { + auto* pSortInfo = reinterpret_cast*>(lParamSort); + int nColumn = pSortInfo->first; + bool bAscending = pSortInfo->second; + + // ȡֵ + ItemData1* context1 = (ItemData1*)lParam1; + ItemData1* context2 = (ItemData1*)lParam2; + CString s1 = context1->GetData(nColumn); + CString s2 = context2->GetData(nColumn); + + int result = s1 > s2 ? 1 : -1; + return bAscending ? result : -result; +} + +void CServicesDlg::SortByColumn(int nColumn) { + static int m_nSortColumn = 0; + static bool m_bSortAscending = false; + if (nColumn == m_nSortColumn) { + // ͬһУл˳ + m_bSortAscending = !m_bSortAscending; + } + else { + // лвΪ + m_nSortColumn = nColumn; + m_bSortAscending = true; + } + + // Ϣ + std::pair sortInfo(m_nSortColumn, m_bSortAscending); + m_ControlList.SortItems(CompareFunction, reinterpret_cast(&sortInfo)); +} + +void CServicesDlg::OnHdnItemclickList(NMHDR* pNMHDR, LRESULT* pResult) { + LPNMHEADER pNMHeader = reinterpret_cast(pNMHDR); + int nColumn = pNMHeader->iItem; // ȡ + SortByColumn(nColumn); // + *pResult = 0; +} void CServicesDlg::OnNMRClickList(NMHDR *pNMHDR, LRESULT *pResult) { diff --git a/server/2015Remote/ServicesDlg.h b/server/2015Remote/ServicesDlg.h index 65a6359..80e1cb0 100644 --- a/server/2015Remote/ServicesDlg.h +++ b/server/2015Remote/ServicesDlg.h @@ -27,6 +27,12 @@ protected: public: CListCtrl m_ControlList; virtual BOOL OnInitDialog(); + + void DeleteAllItems(); + void SortByColumn(int nColumn); + afx_msg VOID OnHdnItemclickList(NMHDR* pNMHDR, LRESULT* pResult); + static int CALLBACK CompareFunction(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort); + CStatic m_ServicesCount; afx_msg void OnClose(); afx_msg void OnServicesAuto();