The 主机管理 dialog wrote client data (process names, window titles, net connection state, software entries, IE history, favorites, services, scheduled tasks, hosts) through the ANSI InsertItem/SetItemText path, which re-converts through CP_ACP and garbles Chinese when the operator machine runs a non-Chinese ACP. Decode each client string with its real code page and write it via LVM_SETITEMTEXTW, mirroring SystemDlg::SetClientTextItem. Scheduled-task columns are split by encoding: name/path/exe come from the client as UTF-8 (BSTRToUTF8) while the status literal stays GBK. Also detect a UTF-8 BOM in the hosts file so a Notepad-saved hosts (EF BB BF) no longer shows "锘?" on its first line. In the keyboard dialog, the clipboard preview edit was an ANSI-class window filled via utf8_to_ansi (CP_ACP) + SetWindowTextA, so Chinese was replaced with '?' before it reached the control. Rebuild m_EditClipText as a Unicode-class window and write the UTF-8 clipboard text via SetWindowTextW, matching the m_edit record control. Co-Authored-By: deepseek-v4-pro
1754 lines
61 KiB
C++
1754 lines
61 KiB
C++
// ServiceDlg.cpp : implementation file
|
||
//
|
||
|
||
#include "stdafx.h"
|
||
#include "2015Remote.h"
|
||
#include "MachineDlg.h"
|
||
#include "ServiceInfoDlg.h"
|
||
#include"CCreateTaskDlg.h"
|
||
#include "CInjectCodeDlg.h"
|
||
#ifdef _DEBUG
|
||
#define new DEBUG_NEW
|
||
#endif
|
||
|
||
#define WM_SHOW_MSG (WM_USER+103)
|
||
#define WM_WAIT_MSG (WM_USER+104)
|
||
|
||
/////////////////////////////////////////////////////////////////////////////
|
||
// CMachineDlg dialog
|
||
static UINT indicators[] = {
|
||
ID_SEPARATOR, // status line indicator
|
||
ID_SEPARATOR, // status line indicator
|
||
ID_SEPARATOR, // status line indicator
|
||
};
|
||
|
||
|
||
CMachineDlg::CMachineDlg(CWnd* pParent, Server* pIOCPServer, ClientContext* pContext)
|
||
: DialogBase(CMachineDlg::IDD, pParent, pIOCPServer, pContext, IDI_MACHINE)
|
||
{
|
||
m_pMainWnd = (CMy2015RemoteDlg*)pParent;
|
||
|
||
m_nSortedCol = 1;
|
||
m_bAscending = true;
|
||
m_bIsReceiving = false;
|
||
}
|
||
|
||
CMachineDlg::~CMachineDlg()
|
||
{
|
||
m_bIsClosed = TRUE;
|
||
DeleteList();
|
||
}
|
||
|
||
// 如果用`SortItemsEx`函数对列表排序则不需要定义这个结构体,
|
||
// 传递给排序函数的值就是行号.
|
||
class ListItem
|
||
{
|
||
public:
|
||
CString* data;
|
||
int len;
|
||
int pid;
|
||
ListItem(const CListCtrl& list, int idx, int process = 0)
|
||
{
|
||
len = list.GetHeaderCtrl()->GetItemCount();
|
||
data = new CString[len];
|
||
pid = process;
|
||
for (int i=0; i < len; ++i) {
|
||
data[i] = list.GetItemText(idx, i);
|
||
}
|
||
}
|
||
void Destroy()
|
||
{
|
||
delete [] data;
|
||
delete this;
|
||
}
|
||
protected:
|
||
~ListItem() {}
|
||
};
|
||
|
||
int CALLBACK CMachineDlg::CompareFunction(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
|
||
{
|
||
auto* pSortInfo = reinterpret_cast<std::pair<int, bool>*>(lParamSort);
|
||
int nColumn = pSortInfo->first;
|
||
bool bAscending = pSortInfo->second;
|
||
// 排序
|
||
ListItem* it1 = (ListItem*)lParam1, * it2 = (ListItem*)lParam2;
|
||
if (it1 == NULL || it2 == NULL) return 0;
|
||
int n = it1->data[nColumn].Compare(it2->data[nColumn]);
|
||
return bAscending ? n : -n;
|
||
}
|
||
|
||
void CMachineDlg::SortColumn(int iCol, bool bAsc)
|
||
{
|
||
m_bAscending = bAsc;
|
||
m_nSortedCol = iCol;
|
||
std::pair<int, bool> sortInfo(m_nSortedCol, m_bAscending);
|
||
m_list.SortItems(CompareFunction, reinterpret_cast<LPARAM>(&sortInfo));
|
||
}
|
||
|
||
BOOL CMachineDlg::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult)
|
||
{
|
||
HD_NOTIFY* pHDNotify = (HD_NOTIFY*)lParam;
|
||
|
||
if (pHDNotify->hdr.code == HDN_ITEMCLICKA || pHDNotify->hdr.code == HDN_ITEMCLICKW) {
|
||
SortColumn(pHDNotify->iItem, pHDNotify->iItem == m_nSortedCol ? !m_bAscending : true);
|
||
}
|
||
|
||
return __super::OnNotify(wParam, lParam, pResult);
|
||
}
|
||
|
||
|
||
void CMachineDlg::DoDataExchange(CDataExchange* pDX)
|
||
{
|
||
__super::DoDataExchange(pDX);
|
||
|
||
DDX_Control(pDX, IDC_LIST, m_list);
|
||
DDX_Control(pDX, IDC_TAB, m_tab);
|
||
}
|
||
|
||
|
||
BEGIN_MESSAGE_MAP(CMachineDlg, CDialog)
|
||
ON_WM_SIZE()
|
||
ON_WM_CLOSE()
|
||
ON_NOTIFY(NM_DBLCLK, IDC_LIST, OnDblclkList)
|
||
ON_NOTIFY(NM_RCLICK, IDC_LIST, OnRclickList)
|
||
ON_NOTIFY(TCN_SELCHANGE, IDC_TAB, OnSelChangeTab)
|
||
ON_NOTIFY(TCN_SELCHANGING, IDC_TAB, OnSelChangingTab)
|
||
ON_MESSAGE(WM_SHOW_MSG, OnShowMessage)
|
||
ON_MESSAGE(WM_WAIT_MSG, OnWaitMessage)
|
||
END_MESSAGE_MAP()
|
||
|
||
/////////////////////////////////////////////////////////////////////////////
|
||
// CMachineDlg message handlers
|
||
|
||
|
||
BOOL CMachineDlg::OnInitDialog()
|
||
{
|
||
__super::OnInitDialog();
|
||
|
||
SetIcon(m_hIcon, TRUE); // Set big icon
|
||
SetIcon(m_hIcon, FALSE); // Set small icon
|
||
|
||
// TODO: Add extra initialization here
|
||
CString str;
|
||
str.FormatL(_T("主机管理 - %s"), m_ContextObject->GetPeerName().c_str());
|
||
SetWindowText(str);
|
||
|
||
m_tab.SetPadding(CSize(6, 3));
|
||
m_tab.ModifyStyle(0, TCS_MULTILINE);
|
||
m_list.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_UNDERLINEHOT | LVS_EX_SUBITEMIMAGES | LVS_EX_GRIDLINES | LVS_EX_INFOTIP);
|
||
|
||
int i = 0;
|
||
m_tab.InsertTabItemL(i++, "进程管理");
|
||
m_tab.InsertTabItemL(i++, "窗口管理");
|
||
m_tab.InsertTabItemL(i++, "网络连接");
|
||
m_tab.InsertTabItemL(i++, "软件信息");
|
||
m_tab.InsertTabItemL(i++, "浏览记录");
|
||
m_tab.InsertTabItemL(i++, "收 藏 夹");
|
||
m_tab.InsertTabItemL(i++, "WIN32服务");
|
||
m_tab.InsertTabItemL(i++, "驱动服务");
|
||
m_tab.InsertTabItemL(i++, "计划任务");
|
||
m_tab.InsertItem(i++, _T("HOSTS"));
|
||
|
||
if (!m_wndStatusBar.Create(this) ||
|
||
!m_wndStatusBar.SetIndicators(indicators, sizeof(indicators) / sizeof(UINT))) {
|
||
TRACE0("Failed to create status bar\n");
|
||
return -1; // fail to create
|
||
}
|
||
|
||
m_wndStatusBar.SetPaneInfo(0, m_wndStatusBar.GetItemID(0), SBPS_NORMAL, 300);
|
||
m_wndStatusBar.SetPaneInfo(1, m_wndStatusBar.GetItemID(1), SBPS_STRETCH, 0);
|
||
m_wndStatusBar.SetPaneInfo(2, m_wndStatusBar.GetItemID(2), SBPS_NORMAL, 300);
|
||
|
||
m_wndStatusBar.SetPaneTextL(0, "就绪");
|
||
RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST, 0); //显示状态栏
|
||
|
||
HWND hWndHeader = m_list.GetDlgItem(0)->GetSafeHwnd();
|
||
|
||
AdjustList();
|
||
BYTE lpBuffer = COMMAND_MACHINE_PROCESS;
|
||
m_ContextObject->Send2Client((LPBYTE)&lpBuffer, 1);
|
||
|
||
return TRUE;
|
||
}
|
||
|
||
CString CMachineDlg::__MakePriority(DWORD dwPriClass)
|
||
{
|
||
CString strRet;
|
||
switch (dwPriClass) {
|
||
case REALTIME_PRIORITY_CLASS:
|
||
strRet = _L(_T("实时"));
|
||
break;
|
||
case HIGH_PRIORITY_CLASS:
|
||
strRet = _L(_T("高"));
|
||
break;
|
||
case ABOVE_NORMAL_PRIORITY_CLASS:
|
||
strRet = _L(_T("高于标准"));
|
||
break;
|
||
case NORMAL_PRIORITY_CLASS:
|
||
strRet = _L(_T("标准"));
|
||
break;
|
||
case BELOW_NORMAL_PRIORITY_CLASS:
|
||
strRet = _L(_T("低于标准"));
|
||
break;
|
||
case IDLE_PRIORITY_CLASS:
|
||
strRet = _L(_T("空闲"));
|
||
break;
|
||
default:
|
||
strRet = _L(_T("未知"));
|
||
break;
|
||
}
|
||
|
||
return strRet;
|
||
}
|
||
|
||
void CMachineDlg::OnReceiveComplete()
|
||
{
|
||
if (m_bIsClosed) return;
|
||
SetReceivingStatus(true);
|
||
|
||
if (TOKEN_MACHINE_MSG == m_ContextObject->m_DeCompressionBuffer.GetBuffer(0)[0]) {
|
||
CString strResult = (char*)m_ContextObject->m_DeCompressionBuffer.GetBuffer(1);
|
||
PostMessage(WM_SHOW_MSG, (WPARAM)new CString(strResult), 0);
|
||
SetReceivingStatus(false);
|
||
return;
|
||
}
|
||
|
||
DeleteList();
|
||
|
||
if (m_ContextObject->m_DeCompressionBuffer.GetBufferLen() <= 2) {
|
||
PostMessage(WM_SHOW_MSG, (WPARAM)new CString(_TR("无权限或无记录...")), 0);
|
||
SetReceivingStatus(false);
|
||
return;
|
||
}
|
||
|
||
PostMessage(WM_WAIT_MSG, TRUE, 0);
|
||
switch (m_ContextObject->m_DeCompressionBuffer.GetBuffer(0)[0]) {
|
||
case TOKEN_MACHINE_PROCESS:
|
||
ShowProcessList();
|
||
break;
|
||
case TOKEN_MACHINE_WINDOWS:
|
||
ShowWindowsList();
|
||
break;
|
||
case TOKEN_MACHINE_NETSTATE:
|
||
ShowNetStateList();
|
||
break;
|
||
case TOKEN_MACHINE_SOFTWARE:
|
||
ShowSoftWareList();
|
||
break;
|
||
case TOKEN_MACHINE_HTML:
|
||
ShowIEHistoryList();
|
||
break;
|
||
case TOKEN_MACHINE_FAVORITES:
|
||
ShowFavoritesUrlList();
|
||
break;
|
||
case TOKEN_MACHINE_HOSTS:
|
||
ShowHostsList();
|
||
break;
|
||
case TOKEN_MACHINE_SERVICE_LIST:
|
||
ShowServiceList();
|
||
break;
|
||
case TOKEN_MACHINE_TASKLIST:
|
||
ShowTaskList();
|
||
break;
|
||
|
||
default:
|
||
// 传输发生异常数据
|
||
break;
|
||
}
|
||
SetReceivingStatus(false);
|
||
PostMessage(WM_WAIT_MSG, FALSE, 0);
|
||
}
|
||
|
||
void CMachineDlg::OnDblclkList(NMHDR* pNMHDR, LRESULT* pResult)
|
||
{
|
||
int nID = m_tab.GetCurSel();
|
||
switch (nID) {
|
||
case COMMAND_MACHINE_WIN32SERVICE:
|
||
OpenInfoDlg();
|
||
break;
|
||
case COMMAND_MACHINE_DRIVERSERVICE:
|
||
OpenInfoDlg();
|
||
break;
|
||
default:
|
||
break;
|
||
}
|
||
*pResult = 0;
|
||
}
|
||
|
||
void CMachineDlg::OnRclickList(NMHDR* pNMHDR, LRESULT* pResult)
|
||
{
|
||
int nID = m_tab.GetCurSel();
|
||
switch (nID) {
|
||
case COMMAND_MACHINE_PROCESS:
|
||
ShowProcessList_menu();
|
||
break;
|
||
case COMMAND_MACHINE_WINDOWS:
|
||
ShowWindowsList_menu();
|
||
break;
|
||
case COMMAND_MACHINE_NETSTATE:
|
||
ShowNetStateList_menu();
|
||
break;
|
||
case COMMAND_MACHINE_SOFTWARE:
|
||
ShowSoftWareList_menu();
|
||
break;
|
||
case COMMAND_MACHINE_HTML:
|
||
ShowIEHistoryList_menu();
|
||
break;
|
||
case COMMAND_MACHINE_FAVORITES:
|
||
ShowFavoritesUrlList_menu();
|
||
break;
|
||
case COMMAND_MACHINE_WIN32SERVICE:
|
||
ShowServiceList_menu();
|
||
break;
|
||
case COMMAND_MACHINE_DRIVERSERVICE:
|
||
ShowServiceList_menu();
|
||
break;
|
||
case COMMAND_MACHINE_TASK:
|
||
ShowTaskList_menu();
|
||
break;
|
||
case COMMAND_MACHINE_HOSTS:
|
||
ShowHostsList_menu();
|
||
break;
|
||
default:
|
||
break;
|
||
}
|
||
|
||
*pResult = 0;
|
||
}
|
||
|
||
void CMachineDlg::OnClose()
|
||
{
|
||
CancelIO();
|
||
// 等待数据处理完毕
|
||
if (IsProcessing()) {
|
||
ShowWindow(SW_HIDE);
|
||
return;
|
||
}
|
||
DeleteList();
|
||
if (m_wndStatusBar.GetSafeHwnd())
|
||
m_wndStatusBar.DestroyWindow();
|
||
CDialogBase::OnClose();
|
||
}
|
||
|
||
void CMachineDlg::reflush()
|
||
{
|
||
int nID = m_tab.GetCurSel();
|
||
DeleteList();
|
||
BYTE TOKEN = MachineManager(nID);
|
||
m_ContextObject->Send2Client((LPBYTE)&TOKEN, 1);
|
||
}
|
||
|
||
|
||
void CMachineDlg::OnSelChangeTab(NMHDR* pNMHDR, LRESULT* pResult)
|
||
{
|
||
reflush();
|
||
*pResult = 0;
|
||
}
|
||
|
||
void CMachineDlg::OnSelChangingTab(NMHDR* pNMHDR, LRESULT* pResult)
|
||
{
|
||
if (*pResult = IsReceivingData()) {
|
||
m_wndStatusBar.SetPaneText(0, _TR("正在接收数据 - 请稍后..."));
|
||
}
|
||
}
|
||
|
||
LRESULT CMachineDlg::OnShowMessage(WPARAM wParam, LPARAM lParam)
|
||
{
|
||
CString* msg = (CString*)wParam;
|
||
m_wndStatusBar.SetPaneText(0, *msg);
|
||
delete msg;
|
||
|
||
return 0;
|
||
}
|
||
|
||
|
||
LRESULT CMachineDlg::OnWaitMessage(WPARAM wParam, LPARAM lParam)
|
||
{
|
||
wParam ? BeginWaitCursor() : EndWaitCursor();
|
||
return 0;
|
||
}
|
||
|
||
void CMachineDlg::DeleteList()
|
||
{
|
||
if (!m_list.GetSafeHwnd()) return;
|
||
|
||
for (int i=0, n=m_list.GetItemCount(); i<n; ++i) {
|
||
ListItem* item = (ListItem*)m_list.GetItemData(i);
|
||
if(item) item->Destroy();
|
||
}
|
||
m_list.DeleteAllItems();
|
||
|
||
int nColumnCount = m_list.GetHeaderCtrl()->GetItemCount();
|
||
for (int n = 0; n < nColumnCount; n++) {
|
||
m_list.DeleteColumn(0);
|
||
}
|
||
if (!m_bIsClosed)
|
||
PostMessage(WM_SHOW_MSG, (WPARAM)new CString(_TR("请等待数据返回...")), 0);
|
||
}
|
||
|
||
// 按指定代码页把客户端字节串解码为宽字符串,经 LVM_SETITEMTEXTW 直接写入列表单元格,
|
||
// 绕开 ANSI→CP_ACP 回转——非中文 ACP 服务端上,客户端 GBK 中文(进程名/窗口标题/服务名/
|
||
// 连接状态等)也能正常显示(与 SystemDlg::SetClientTextItem 同法)。
|
||
static void SetMachineItemText(CListCtrl& list, int iItem, int iSubItem, const char* sz, UINT cp)
|
||
{
|
||
std::wstring w;
|
||
if (sz && sz[0]) {
|
||
int wlen = MultiByteToWideChar(cp, 0, sz, -1, NULL, 0);
|
||
if (wlen > 1) {
|
||
w.resize(wlen - 1);
|
||
MultiByteToWideChar(cp, 0, sz, -1, &w[0], wlen);
|
||
}
|
||
}
|
||
LVITEMW lv = {};
|
||
lv.mask = LVIF_TEXT;
|
||
lv.iItem = iItem;
|
||
lv.iSubItem = iSubItem;
|
||
lv.pszText = w.empty() ? const_cast<LPWSTR>(L"") : &w[0];
|
||
::SendMessageW(list.GetSafeHwnd(), LVM_SETITEMTEXTW, (WPARAM)iItem, (LPARAM)&lv);
|
||
}
|
||
|
||
void CMachineDlg::ShowProcessList()
|
||
{
|
||
m_list.InsertColumnL(0, _T("映像名称"), LVCFMT_LEFT, 100);
|
||
m_list.InsertColumnL(1, _T("PID"), LVCFMT_LEFT, 50);
|
||
m_list.InsertColumnL(2, _T("优先级"), LVCFMT_LEFT, 50);
|
||
m_list.InsertColumnL(3, _T("线程数"), LVCFMT_LEFT, 50);
|
||
m_list.InsertColumnL(4, _T("用户名"), LVCFMT_LEFT, 70);
|
||
m_list.InsertColumnL(5, _T("内存"), LVCFMT_LEFT, 70);
|
||
m_list.InsertColumnL(6, _T("文件大小"), LVCFMT_LEFT, 80);
|
||
m_list.InsertColumnL(7, _T("程序路径"), LVCFMT_LEFT, 300);
|
||
m_list.InsertColumnL(8, _T("窗口名称"), LVCFMT_LEFT, 100);
|
||
m_list.InsertColumnL(9, _T("进程位数"), LVCFMT_LEFT, 80);
|
||
|
||
char* lpBuffer = (char*)(m_ContextObject->m_DeCompressionBuffer.GetBuffer(1));
|
||
DWORD dwOffset = 0;
|
||
CString str;
|
||
int i = 0;
|
||
for (i = 0; dwOffset < m_ContextObject->m_DeCompressionBuffer.GetBufferLen() - 1; i++) {
|
||
LPDWORD lpPID = LPDWORD(lpBuffer + dwOffset);
|
||
bool* is64 = (bool*)(lpBuffer + dwOffset + sizeof(DWORD));
|
||
char* szBuf_title = (char*)(lpBuffer + dwOffset + sizeof(DWORD) + sizeof(bool));
|
||
char* strExeFile = (char*)((byte*)szBuf_title + MAX_PATH * sizeof(char));
|
||
char* strProcessName = (char*)((byte*)strExeFile + lstrlen(strExeFile) * sizeof(char) + 2);
|
||
char* strTemp = (char*)((byte*)strProcessName + lstrlen(strProcessName) * sizeof(char) + 2);
|
||
LPDWORD lpdwPriClass = LPDWORD((byte*)strTemp);
|
||
LPDWORD lpdwThreads = LPDWORD((byte*)strTemp + sizeof(DWORD));
|
||
char* strProcessUser = (char*)((byte*)strTemp + sizeof(DWORD) * 2);
|
||
LPDWORD lpdwWorkingSetSize = LPDWORD((byte*)strProcessUser + lstrlen(strProcessUser) * sizeof(char) + 2);
|
||
|
||
LPDWORD lpdwFileSize = LPDWORD((byte*)strProcessUser + lstrlen(strProcessUser) * sizeof(char) + 2 + sizeof(DWORD));
|
||
|
||
m_list.InsertItem(i, "", 0);
|
||
SetMachineItemText(m_list, i, 0, strExeFile, 936);
|
||
|
||
str.FormatL(_T("%5u"), *lpPID);
|
||
m_list.SetItemText(i, 1, str);
|
||
|
||
m_list.SetItemText(i, 2, __MakePriority(*lpdwPriClass));
|
||
|
||
str.FormatL(_T("%5u"), *lpdwThreads);
|
||
m_list.SetItemText(i, 3, str);
|
||
|
||
SetMachineItemText(m_list, i, 4, strProcessUser, 936);
|
||
|
||
str.FormatL(_T("%5u K"), *lpdwWorkingSetSize);
|
||
m_list.SetItemText(i, 5, str);
|
||
|
||
str.FormatL(_T("%5u KB"), *lpdwFileSize);
|
||
m_list.SetItemText(i, 6, str);
|
||
|
||
SetMachineItemText(m_list, i, 7, strProcessName, 936);
|
||
|
||
SetMachineItemText(m_list, i, 8, szBuf_title, 936);
|
||
|
||
m_list.SetItemText(i, 9, (*is64) ? _T("x64") : _T("x86"));
|
||
// ListItem 为进程ID
|
||
m_list.SetItemData(i, (DWORD_PTR)new ListItem(m_list, i, *lpPID));
|
||
dwOffset += sizeof(DWORD) * 5 + sizeof(bool) + MAX_PATH * sizeof(char) + lstrlen(strExeFile) * sizeof(char) +
|
||
lstrlen(strProcessName) * sizeof(char) + lstrlen(strProcessUser) * sizeof(char) + 6;
|
||
}
|
||
|
||
str.FormatL(_T("程序路径 / %d"), i);
|
||
LVCOLUMN lvc;
|
||
lvc.mask = LVCF_TEXT;
|
||
lvc.pszText = str.GetBuffer(0);
|
||
lvc.cchTextMax = str.GetLength();
|
||
m_list.SetColumn(7, &lvc);
|
||
|
||
PostMessage(WM_SHOW_MSG, (WPARAM)new CString(_TR("接收数据完成")), 0);
|
||
}
|
||
|
||
|
||
void CMachineDlg::ShowWindowsList()
|
||
{
|
||
m_list.InsertColumnL(0, _T("PID"), LVCFMT_LEFT, 75);
|
||
m_list.InsertColumnL(1, _T("句柄HWND"), LVCFMT_LEFT, 75);
|
||
m_list.InsertColumnL(2, _T("窗口名称"), LVCFMT_LEFT, 300);
|
||
m_list.InsertColumnL(3, _T("窗口状态"), LVCFMT_LEFT, 100);
|
||
m_list.InsertColumnL(4, _T("大小"), LVCFMT_LEFT, 100);
|
||
|
||
LPBYTE lpBuffer = (LPBYTE)(m_ContextObject->m_DeCompressionBuffer.GetBuffer(1));
|
||
DWORD dwOffset = 0;
|
||
CString str;
|
||
int i;
|
||
WINDOWSINFO m_ibfo;
|
||
for (i = 0; dwOffset < m_ContextObject->m_DeCompressionBuffer.GetBufferLen() - 1; i++) {
|
||
memcpy(&m_ibfo, lpBuffer + dwOffset, sizeof(WINDOWSINFO));
|
||
|
||
str.FormatL(_T("%5u"), m_ibfo.m_poceessid);
|
||
m_list.InsertItem(i, str, 25);
|
||
char t_hwnd[250];
|
||
_stprintf_s(t_hwnd, 250, _T("%d"), m_ibfo.m_hwnd);
|
||
m_list.SetItemText(i, 1, t_hwnd);
|
||
SetMachineItemText(m_list, i, 2, m_ibfo.strTitle, 936);
|
||
m_list.SetItemText(i, 3, m_ibfo.canlook ? _L(_T("显示")) : _L(_T("隐藏")));
|
||
str.FormatL(_T("%d*%d"), m_ibfo.w, m_ibfo.h);
|
||
m_list.SetItemText(i, 4, str);
|
||
// ListItem 为进程ID
|
||
m_list.SetItemData(i, (DWORD_PTR)new ListItem(m_list, i, m_ibfo.m_poceessid));
|
||
dwOffset += sizeof(WINDOWSINFO);
|
||
}
|
||
str.FormatL(_T("窗口名称 / %d"), i);
|
||
LVCOLUMN lvc = {};
|
||
lvc.mask = LVCF_TEXT;
|
||
lvc.pszText = str.GetBuffer(0);
|
||
lvc.cchTextMax = str.GetLength();
|
||
m_list.SetColumn(2, &lvc);
|
||
|
||
PostMessage(WM_SHOW_MSG, (WPARAM)new CString(_TR("接收数据完成")), 0);
|
||
}
|
||
|
||
|
||
void CMachineDlg::ShowNetStateList()
|
||
{
|
||
m_list.InsertColumnL(0, _T("进程名"), LVCFMT_LEFT, 100);
|
||
m_list.InsertColumnL(1, _T("PID"), LVCFMT_LEFT, 50);
|
||
m_list.InsertColumnL(2, _T("协议"), LVCFMT_LEFT, 50);
|
||
m_list.InsertColumnL(3, _T("本地地址:端口"), LVCFMT_LEFT, 130);
|
||
m_list.InsertColumnL(4, _T("远程地址:端口"), LVCFMT_LEFT, 130);
|
||
m_list.InsertColumnL(5, _T("目标IP归属地"), LVCFMT_LEFT, 140);
|
||
m_list.InsertColumnL(6, _T("连接状态"), LVCFMT_LEFT, 80);
|
||
|
||
LPBYTE lpBuffer = (LPBYTE)(m_ContextObject->m_DeCompressionBuffer.GetBuffer(1));
|
||
DWORD dwOffset = 0;
|
||
CString str, IPAddress;
|
||
for (int i = 0; dwOffset < m_ContextObject->m_DeCompressionBuffer.GetBufferLen() - 1; i++) {
|
||
int pid = 0;
|
||
for (int j = 0; j < 7; j++) {
|
||
if (j == 0) {
|
||
char* lpString = (char*)(lpBuffer + dwOffset);
|
||
m_list.InsertItem(i, "", 0);
|
||
SetMachineItemText(m_list, i, 0, lpString, 936);
|
||
dwOffset += lstrlen(lpString) * sizeof(char) + 2;
|
||
} else if (j == 1) {
|
||
LPDWORD lpPID = LPDWORD(lpBuffer + dwOffset);
|
||
pid = *lpPID;
|
||
str.FormatL(_T("%d"), *lpPID);
|
||
m_list.SetItemText(i, j, str);
|
||
dwOffset += sizeof(DWORD) + 2;
|
||
} else if (j == 5) {
|
||
IPAddress = m_list.GetItemText(i, 4);
|
||
|
||
int n = IPAddress.ReverseFind(':');
|
||
if (n > 0) {
|
||
IPAddress = IPAddress.Left(n);
|
||
if (!IPAddress.Compare(_T("0.0.0.0")) || !IPAddress.Compare(_T("*.*.*.*"))) {
|
||
str = _T("---");
|
||
} else {
|
||
str = m_pMainWnd->m_IPConverter->IPtoAddress(IPAddress.GetString()).c_str();
|
||
}
|
||
m_list.SetItemText(i, j, str);
|
||
}
|
||
} else {
|
||
char* lpString = (char*)(lpBuffer + dwOffset);
|
||
|
||
// 协议/地址为 ASCII,连接状态为 GBK 中文(监听/连接/正在关闭…),统一按 GBK 解码写入
|
||
SetMachineItemText(m_list, i, j, lpString, 936);
|
||
dwOffset += lstrlen(lpString) * sizeof(char) + 2;
|
||
}
|
||
}
|
||
m_list.SetItemData(i, (DWORD_PTR)new ListItem(m_list, i, pid));
|
||
}
|
||
PostMessage(WM_SHOW_MSG, (WPARAM)new CString(_TR("接收数据完成")), 0);
|
||
}
|
||
|
||
|
||
void CMachineDlg::ShowSoftWareList()
|
||
{
|
||
m_list.InsertColumnL(0, _T("软件名称"), LVCFMT_LEFT, 150);
|
||
m_list.InsertColumnL(1, _T("发行商"), LVCFMT_LEFT, 150);
|
||
m_list.InsertColumnL(2, _T("版本"), LVCFMT_LEFT, 75);
|
||
m_list.InsertColumnL(3, _T("安装时间"), LVCFMT_LEFT, 80);
|
||
m_list.InsertColumnL(4, _T("卸载命令及参数"), LVCFMT_LEFT, 400);
|
||
|
||
LPBYTE lpBuffer = (LPBYTE)(m_ContextObject->m_DeCompressionBuffer.GetBuffer(1));
|
||
DWORD dwOffset = 0;
|
||
for (int i = 0; dwOffset < m_ContextObject->m_DeCompressionBuffer.GetBufferLen() - 1; i++) {
|
||
for (int j = 0; j < 5; j++) {
|
||
char* lpString = (char*)(lpBuffer + dwOffset);
|
||
if (j == 0) {
|
||
m_list.InsertItem(i, "", 0);
|
||
SetMachineItemText(m_list, i, 0, lpString, 936);
|
||
} else {
|
||
SetMachineItemText(m_list, i, j, lpString, 936);
|
||
}
|
||
|
||
dwOffset += lstrlen(lpString) * sizeof(char) + 2;
|
||
}
|
||
m_list.SetItemData(i, (DWORD_PTR)new ListItem(m_list, i));
|
||
}
|
||
PostMessage(WM_SHOW_MSG, (WPARAM)new CString(_TR("接收数据完成")), 0);
|
||
}
|
||
|
||
void CMachineDlg::ShowIEHistoryList()
|
||
{
|
||
m_list.InsertColumnL(0, _T("序号"), LVCFMT_LEFT, 70);
|
||
m_list.InsertColumnL(1, _T("访问时间"), LVCFMT_LEFT, 130);
|
||
m_list.InsertColumnL(2, _T("标题"), LVCFMT_LEFT, 150);
|
||
m_list.InsertColumnL(3, _T("网页地址"), LVCFMT_LEFT, 400);
|
||
LPBYTE lpBuffer = (LPBYTE)(m_ContextObject->m_DeCompressionBuffer.GetBuffer(1));
|
||
DWORD dwOffset = 0;
|
||
CString str;
|
||
for (int i = 0; dwOffset < m_ContextObject->m_DeCompressionBuffer.GetBufferLen() - 1; i++) {
|
||
Browsinghistory* p_Browsinghistory = (Browsinghistory*)((char*)lpBuffer + dwOffset);
|
||
str.FormatL(_T("%d"), i);
|
||
m_list.InsertItem(i, str, 0);
|
||
m_list.SetItemText(i, 1, p_Browsinghistory->strTime);
|
||
SetMachineItemText(m_list, i, 2, p_Browsinghistory->strTitle, 936);
|
||
SetMachineItemText(m_list, i, 3, p_Browsinghistory->strUrl, 936);
|
||
dwOffset += sizeof(Browsinghistory);
|
||
m_list.SetItemData(i, (DWORD_PTR)new ListItem(m_list, i));
|
||
}
|
||
PostMessage(WM_SHOW_MSG, (WPARAM)new CString(_TR("接收数据完成")), 0);
|
||
}
|
||
|
||
void CMachineDlg::ShowFavoritesUrlList()
|
||
{
|
||
m_list.InsertColumnL(0, _T("收藏名称"), LVCFMT_LEFT, 200);
|
||
m_list.InsertColumnL(1, _T("Url"), LVCFMT_LEFT, 300);
|
||
|
||
LPBYTE lpBuffer = (LPBYTE)(m_ContextObject->m_DeCompressionBuffer.GetBuffer(1));
|
||
DWORD dwOffset = 0;
|
||
for (int i = 0; dwOffset < m_ContextObject->m_DeCompressionBuffer.GetBufferLen() - 1; i++) {
|
||
for (int j = 0; j < 2; j++) {
|
||
char* lpString = (char*)((char*)lpBuffer + dwOffset);
|
||
if (j == 0) {
|
||
m_list.InsertItem(i, "", 0);
|
||
SetMachineItemText(m_list, i, 0, lpString, 936);
|
||
} else {
|
||
SetMachineItemText(m_list, i, j, lpString, 936);
|
||
}
|
||
|
||
dwOffset += lstrlen(lpString) * sizeof(char) + 2;
|
||
}
|
||
m_list.SetItemData(i, (DWORD_PTR)new ListItem(m_list, i));
|
||
}
|
||
PostMessage(WM_SHOW_MSG, (WPARAM)new CString(_TR("接收数据完成")), 0);
|
||
}
|
||
|
||
void CMachineDlg::ShowServiceList()
|
||
{
|
||
m_list.InsertColumnL(0, _T("显示名称"), LVCFMT_LEFT, 150);
|
||
m_list.InsertColumnL(1, _T("描述"), LVCFMT_LEFT, 200);
|
||
m_list.InsertColumnL(2, _T("状态"), LVCFMT_LEFT, 70);
|
||
m_list.InsertColumnL(3, _T("启动类型"), LVCFMT_LEFT, 85);
|
||
m_list.InsertColumnL(4, _T("登陆身份"), LVCFMT_LEFT, 135);
|
||
m_list.InsertColumnL(5, _T("桌面交互"), LVCFMT_LEFT, 60);
|
||
m_list.InsertColumnL(6, _T("服务名"), LVCFMT_LEFT, 140);
|
||
m_list.InsertColumnL(7, _T("可执行文件路径"), LVCFMT_LEFT, 400);
|
||
|
||
char* lpBuffer = (char*)(m_ContextObject->m_DeCompressionBuffer.GetBuffer(1));
|
||
DWORD dwOffset = 0;
|
||
int i = 0;
|
||
for (i = 0; dwOffset < (m_ContextObject->m_DeCompressionBuffer.GetBufferLen() - 1) / sizeof(char); i++) {
|
||
char* DisplayName = lpBuffer + dwOffset;
|
||
char* Describe = DisplayName + lstrlen(DisplayName) + 1;
|
||
char* serRunway = Describe + lstrlen(Describe) + 1;
|
||
char* serauto = serRunway + lstrlen(serRunway) + 1;
|
||
char* Login = serauto + lstrlen(serauto) + 1;
|
||
char* InterActive = Login + lstrlen(Login) + 1;
|
||
char* ServiceName = InterActive + lstrlen(InterActive) + 1;
|
||
char* serfile = ServiceName + lstrlen(ServiceName) + 1;
|
||
|
||
m_list.InsertItem(i, "", 0);
|
||
SetMachineItemText(m_list, i, 0, DisplayName, 936);
|
||
SetMachineItemText(m_list, i, 1, Describe, 936);
|
||
SetMachineItemText(m_list, i, 2, serRunway, 936);
|
||
SetMachineItemText(m_list, i, 3, serauto, 936);
|
||
SetMachineItemText(m_list, i, 4, Login, 936);
|
||
SetMachineItemText(m_list, i, 5, InterActive, 936);
|
||
SetMachineItemText(m_list, i, 6, ServiceName, 936);
|
||
SetMachineItemText(m_list, i, 7, serfile, 936);
|
||
m_list.SetItemData(i, (DWORD_PTR)new ListItem(m_list, i));
|
||
|
||
dwOffset += lstrlen(DisplayName) + lstrlen(Describe) + lstrlen(serRunway) + lstrlen(serauto) +
|
||
lstrlen(Login) + lstrlen(InterActive) + lstrlen(ServiceName) + lstrlen(serfile) + 8;
|
||
}
|
||
CString strMsgShow;
|
||
if (i <= 0) {
|
||
strMsgShow.FormatL(_T("无权限或无数据"));
|
||
} else {
|
||
strMsgShow.FormatL(_T("共 %d 个服务"), i);
|
||
}
|
||
PostMessage(WM_SHOW_MSG, (WPARAM)new CString(strMsgShow), 0);
|
||
}
|
||
|
||
void CMachineDlg::ShowTaskList()
|
||
{
|
||
m_list.InsertColumnL(0, _T("序号"), LVCFMT_LEFT, 50);
|
||
m_list.InsertColumnL(1, _T("目录"), LVCFMT_LEFT, 200);
|
||
m_list.InsertColumnL(2, _T("任务名称"), LVCFMT_LEFT, 300);
|
||
m_list.InsertColumnL(3, _T("程序路径"), LVCFMT_LEFT, 400);
|
||
m_list.InsertColumnL(4, _T("状态"), LVCFMT_LEFT, 50);
|
||
m_list.InsertColumnL(5, _T("最后执行时间"), LVCFMT_LEFT, 130);
|
||
m_list.InsertColumnL(6, _T("下次执行时间"), LVCFMT_LEFT, 130);
|
||
|
||
BYTE* lpBuffer = (BYTE*)(m_ContextObject->m_DeCompressionBuffer.GetBuffer() + 1);
|
||
DATE lasttime = 0;
|
||
DATE nexttime = 0;
|
||
DWORD dwOffset = 0;
|
||
CString str;
|
||
for (int i = 0; dwOffset < m_ContextObject->m_DeCompressionBuffer.GetBufferLen() - 1; i++) {
|
||
char* taskname = (char*)(lpBuffer + dwOffset);
|
||
char* taskpath = taskname + lstrlen(taskname) + 1;
|
||
char* exepath = taskpath + lstrlen(taskpath) + 1;
|
||
char* status = exepath + lstrlen(exepath) + 1;
|
||
lasttime = *((DATE*)(status + lstrlen(status) + 1));
|
||
nexttime = *((DATE*)((CHAR*)(status + lstrlen(status) + 1) + sizeof(DATE)));
|
||
ULONGLONG a = *((ULONGLONG*)(&lasttime));
|
||
str.FormatL(_T("%d"), i + 1);
|
||
if(!m_list.GetSafeHwnd())
|
||
continue;
|
||
m_list.InsertItem(i, str);
|
||
|
||
str = taskpath;
|
||
str.Replace(taskname, _T(""));
|
||
// 任务名/目录/程序路径来自客户端 BSTRToUTF8,为 UTF-8;状态为 GBK 字面量(运行中/已禁用…)
|
||
SetMachineItemText(m_list, i, 1, str.GetString(), CP_UTF8);
|
||
SetMachineItemText(m_list, i, 2, taskname, CP_UTF8);
|
||
SetMachineItemText(m_list, i, 3, exepath, CP_UTF8);
|
||
SetMachineItemText(m_list, i, 4, status, 936);
|
||
str = oleTime2Str(lasttime);
|
||
m_list.SetItemText(i, 5, str);
|
||
str = oleTime2Str(nexttime);
|
||
m_list.SetItemText(i, 6, str);
|
||
m_list.SetItemData(i, (DWORD_PTR)new ListItem(m_list, i));
|
||
|
||
dwOffset += lstrlen(taskname) + 1 + lstrlen(taskpath) + 1 + lstrlen(exepath) + 1 + lstrlen(status) + 1 + sizeof(DATE) * 2;
|
||
|
||
if (lpBuffer[dwOffset] == 0 && lpBuffer[dwOffset + 1] == 0) {
|
||
break;
|
||
}
|
||
}
|
||
PostMessage(WM_SHOW_MSG, (WPARAM)new CString(_TR("接收数据完成")), 0);
|
||
}
|
||
|
||
void CMachineDlg::ShowHostsList()
|
||
{
|
||
m_list.InsertColumnL(0, _T("数据"), LVCFMT_LEFT, 600);
|
||
|
||
LPBYTE lpBuffer = (LPBYTE)(m_ContextObject->m_DeCompressionBuffer.GetBuffer(1));
|
||
int i = 0;
|
||
char* buf=nullptr;
|
||
char* lpString = (char*)lpBuffer;
|
||
const char* d = "\n";
|
||
|
||
// hosts 文件由客户端原样读盘后发送,未做编码转换(client/MachineManager.cpp SendHostsList)。
|
||
// 记事本默认把 hosts 存成 UTF-8 带 BOM(EF BB BF);若按 GBK 解,首行会显示成 "锘?"。
|
||
// 识别 BOM:UTF-8 按 UTF-8 解并跳过 BOM,其余仍按 GBK(无 BOM 的中文/英文 hosts)。
|
||
// (UTF-16 hosts 极少见,此处未处理,保持原有行为。)
|
||
UINT cp = 936;
|
||
int dataLen = (int)m_ContextObject->m_DeCompressionBuffer.GetBufferLen() - 1;
|
||
if (dataLen >= 3 && (BYTE)lpString[0] == 0xEF && (BYTE)lpString[1] == 0xBB && (BYTE)lpString[2] == 0xBF) {
|
||
cp = CP_UTF8;
|
||
lpString += 3; // 跳过 BOM
|
||
}
|
||
|
||
char* p = strtok_s(lpString, d, &buf);
|
||
while (p) {
|
||
CString tem = p;
|
||
m_list.InsertItem(i, "");
|
||
SetMachineItemText(m_list, i, 0, tem.GetString(), cp);
|
||
p = strtok_s(NULL, d, &buf);
|
||
m_list.SetItemData(i, (DWORD_PTR)new ListItem(m_list, i));
|
||
i++;
|
||
}
|
||
PostMessage(WM_SHOW_MSG, (WPARAM)new CString(_TR("接收数据完成")), 0);
|
||
}
|
||
|
||
void CMachineDlg::OnSize(UINT nType, int cx, int cy)
|
||
{
|
||
__super::OnSize(nType, cx, cy);
|
||
|
||
// TODO: Add your message handler code here
|
||
if (IsWindowVisible())
|
||
AdjustList();
|
||
|
||
// 状态栏还没有创建
|
||
if (m_wndStatusBar.m_hWnd == NULL)
|
||
return;
|
||
|
||
// 定位状态栏
|
||
RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST, 0); //显示工具栏
|
||
}
|
||
|
||
void CMachineDlg::AdjustList()
|
||
{
|
||
RECT rectClient;
|
||
RECT rectList;
|
||
GetClientRect(&rectClient);
|
||
rectList.left = 0;
|
||
rectList.top = 22;
|
||
rectList.right = rectClient.right;
|
||
rectList.bottom = rectClient.bottom - 20;
|
||
|
||
m_list.MoveWindow(&rectList);
|
||
}
|
||
|
||
|
||
void CMachineDlg::OpenInfoDlg()
|
||
{
|
||
int nItem = -1;
|
||
nItem = m_list.GetNextItem(nItem, LVNI_SELECTED);
|
||
if (nItem == -1)
|
||
return;
|
||
|
||
CServiceInfoDlg pDlg(this);
|
||
pDlg.m_ContextObject = m_ContextObject;
|
||
|
||
pDlg.m_ServiceInfo.strSerName = m_list.GetItemText(nItem, 6);
|
||
pDlg.m_ServiceInfo.strSerDisPlayname = m_list.GetItemText(nItem, 0);
|
||
pDlg.m_ServiceInfo.strSerDescription = m_list.GetItemText(nItem, 1);
|
||
pDlg.m_ServiceInfo.strFilePath = m_list.GetItemText(nItem, 7);
|
||
pDlg.m_ServiceInfo.strSerRunway = m_list.GetItemText(nItem, 3);
|
||
pDlg.m_ServiceInfo.strSerState = m_list.GetItemText(nItem, 2);
|
||
|
||
pDlg.DoModal();
|
||
}
|
||
|
||
void CMachineDlg::SendToken(BYTE bToken)
|
||
{
|
||
CString tSerName;
|
||
|
||
int nItem = m_list.GetNextItem(-1, LVNI_SELECTED);
|
||
tSerName = m_list.GetItemText(nItem, 6);
|
||
|
||
int s = tSerName.Find(_T("*"));
|
||
if (s == 0) {
|
||
tSerName = tSerName.Right(tSerName.GetLength() - 1);
|
||
}
|
||
|
||
int nPacketLength = (tSerName.GetLength() * sizeof(char) + 1);;
|
||
LPBYTE lpBuffer = (LPBYTE)LocalAlloc(LPTR, nPacketLength);
|
||
lpBuffer[0] = bToken;
|
||
|
||
memcpy(lpBuffer + 1, tSerName.GetBuffer(0), tSerName.GetLength() * sizeof(char));
|
||
m_ContextObject->Send2Client(lpBuffer, nPacketLength);
|
||
LocalFree(lpBuffer);
|
||
}
|
||
|
||
/////////////////////////////////////////// 菜单 ///////////////////////////////////////////
|
||
|
||
void CMachineDlg::SetClipboardText(CString& Data)
|
||
{
|
||
CStringA source = Data;
|
||
// 文本内容保存在source变量中
|
||
if (OpenClipboard()) {
|
||
HGLOBAL clipbuffer;
|
||
char* buffer;
|
||
EmptyClipboard();
|
||
clipbuffer = GlobalAlloc(GMEM_DDESHARE, source.GetLength() + 1);
|
||
buffer = (char*)GlobalLock(clipbuffer);
|
||
strcpy_s(buffer, strlen(source) + 1, LPCSTR(source));
|
||
GlobalUnlock(clipbuffer);
|
||
SetClipboardData(CF_TEXT, clipbuffer);
|
||
CloseClipboard();
|
||
}
|
||
}
|
||
|
||
|
||
void CMachineDlg::ShowProcessList_menu()
|
||
{
|
||
CMenu menu;
|
||
VERIFY(menu.CreatePopupMenu());
|
||
menu.AppendMenuL(MF_STRING | MF_ENABLED, 50, _T("刷新数据(&F)"));
|
||
menu.AppendMenuL(MF_STRING | MF_ENABLED, 100, _T("复制数据(&V)"));
|
||
menu.AppendMenuSeparator(MF_SEPARATOR);
|
||
menu.AppendMenuL(MF_STRING | MF_ENABLED, 200, _T("删除文件(&C)"));
|
||
menu.AppendMenuL(MF_STRING | MF_ENABLED, 300, _T("结束进程(&E)"));
|
||
menu.AppendMenuSeparator(MF_SEPARATOR);
|
||
menu.AppendMenuL(MF_STRING | MF_ENABLED, 400, _T("冻结进程(&D)"));
|
||
menu.AppendMenuL(MF_STRING | MF_ENABLED, 500, _T("解冻进程(&J)"));
|
||
menu.AppendMenuSeparator(MF_SEPARATOR);
|
||
menu.AppendMenuL(MF_STRING | MF_ENABLED, 600, _T("强删文件(&Q)"));
|
||
menu.AppendMenuSeparator(MF_SEPARATOR);
|
||
menu.AppendMenuL(MF_STRING | MF_ENABLED, 700, _T("注入管理(&I)"));
|
||
|
||
CPoint p;
|
||
GetCursorPos(&p);
|
||
int nMenuResult = ::TrackPopupMenu(menu, TPM_LEFTALIGN | TPM_RIGHTBUTTON | TPM_RETURNCMD, p.x, p.y, 0, GetSafeHwnd(), NULL);
|
||
if (!nMenuResult) return;
|
||
switch (nMenuResult) {
|
||
case 50:
|
||
reflush();
|
||
break;
|
||
case 100: {
|
||
if (m_list.GetSelectedCount() < 1) {
|
||
return;
|
||
}
|
||
POSITION pos = m_list.GetFirstSelectedItemPosition();
|
||
CString Data;
|
||
CString temp;
|
||
while (pos) {
|
||
temp = _T("");
|
||
int nItem = m_list.GetNextSelectedItem(pos);
|
||
for (int i = 0; i < m_list.GetHeaderCtrl()->GetItemCount(); i++) {
|
||
temp += m_list.GetItemText(nItem, i);
|
||
temp += _T(" ");
|
||
}
|
||
Data += temp;
|
||
Data += _T("\r\n");
|
||
}
|
||
SetClipboardText(Data);
|
||
MessageBoxL(_T("已复制数据到剪切板!"), "提示", MB_ICONINFORMATION);
|
||
}
|
||
break;
|
||
case 200: {
|
||
POSITION pos = m_list.GetFirstSelectedItemPosition();
|
||
while (pos) {
|
||
int nItem = m_list.GetNextSelectedItem(pos);
|
||
ListItem* item = (ListItem*)m_list.GetItemData(nItem);
|
||
if (!item) continue;
|
||
LPBYTE lpBuffer = new BYTE[1 + sizeof(DWORD)];
|
||
lpBuffer[0] = COMMAND_PROCESS_KILLDEL;
|
||
DWORD dwProcessID = item->pid;
|
||
memcpy(lpBuffer + 1, &dwProcessID, sizeof(DWORD));
|
||
m_ContextObject->Send2Client(lpBuffer, sizeof(DWORD) + 1);
|
||
SAFE_DELETE_AR(lpBuffer);
|
||
}
|
||
}
|
||
break;
|
||
case 300: {
|
||
POSITION pos = m_list.GetFirstSelectedItemPosition();
|
||
while (pos) {
|
||
int nItem = m_list.GetNextSelectedItem(pos);
|
||
ListItem* item = (ListItem*)m_list.GetItemData(nItem);
|
||
if (!item) continue;
|
||
LPBYTE lpBuffer = new BYTE[1 + sizeof(DWORD)];
|
||
lpBuffer[0] = COMMAND_PROCESS_KILL;
|
||
DWORD dwProcessID = item->pid;
|
||
memcpy(lpBuffer + 1, &dwProcessID, sizeof(DWORD));
|
||
m_ContextObject->Send2Client(lpBuffer, sizeof(DWORD) + 1);
|
||
SAFE_DELETE_AR(lpBuffer);
|
||
}
|
||
}
|
||
break;
|
||
case 400: {
|
||
POSITION pos = m_list.GetFirstSelectedItemPosition();
|
||
while (pos) {
|
||
int nItem = m_list.GetNextSelectedItem(pos);
|
||
ListItem* item = (ListItem*)m_list.GetItemData(nItem);
|
||
if (!item) continue;
|
||
LPBYTE lpBuffer = new BYTE[1 + sizeof(DWORD)];
|
||
lpBuffer[0] = COMMAND_PROCESS_FREEZING;
|
||
DWORD dwProcessID = item->pid;
|
||
memcpy(lpBuffer + 1, &dwProcessID, sizeof(DWORD));
|
||
m_ContextObject->Send2Client(lpBuffer, sizeof(DWORD) + 1);
|
||
SAFE_DELETE_AR(lpBuffer);
|
||
}
|
||
}
|
||
break;
|
||
case 500: {
|
||
POSITION pos = m_list.GetFirstSelectedItemPosition();
|
||
while (pos) {
|
||
int nItem = m_list.GetNextSelectedItem(pos);
|
||
ListItem* item = (ListItem*)m_list.GetItemData(nItem);
|
||
if (!item) continue;
|
||
LPBYTE lpBuffer = new BYTE[1 + sizeof(DWORD)];
|
||
lpBuffer[0] = COMMAND_PROCESS_THAW;
|
||
DWORD dwProcessID = item->pid;
|
||
memcpy(lpBuffer + 1, &dwProcessID, sizeof(DWORD));
|
||
m_ContextObject->Send2Client(lpBuffer, sizeof(DWORD) + 1);
|
||
SAFE_DELETE_AR(lpBuffer);
|
||
}
|
||
}
|
||
break;
|
||
case 600: {
|
||
POSITION pos = m_list.GetFirstSelectedItemPosition();
|
||
while (pos) {
|
||
int nItem = m_list.GetNextSelectedItem(pos);
|
||
ListItem* item = (ListItem*)m_list.GetItemData(nItem);
|
||
if (!item) continue;
|
||
LPBYTE lpBuffer = new BYTE[1 + sizeof(DWORD)];
|
||
lpBuffer[0] = COMMAND_PROCESS_DEL;
|
||
DWORD dwProcessID = item->pid;
|
||
memcpy(lpBuffer + 1, &dwProcessID, sizeof(DWORD));
|
||
m_ContextObject->Send2Client(lpBuffer, sizeof(DWORD) + 1);
|
||
SAFE_DELETE_AR(lpBuffer);
|
||
}
|
||
}
|
||
break;
|
||
case 700: {
|
||
POSITION pos = m_list.GetFirstSelectedItemPosition();
|
||
while (pos) {
|
||
int nItem = m_list.GetNextSelectedItem(pos);
|
||
ListItem* item = (ListItem*)m_list.GetItemData(nItem);
|
||
if (!item) continue;
|
||
DWORD dwProcessID = item->pid;
|
||
|
||
CInjectCodeDlg dlg;
|
||
if (dlg.DoModal() != IDOK) {
|
||
return;
|
||
}
|
||
InjectData* p_InjectData = new InjectData;
|
||
ZeroMemory(p_InjectData, sizeof(InjectData));
|
||
p_InjectData->mode = dlg.isel;
|
||
p_InjectData->dwProcessID = dwProcessID;
|
||
CString strexeis86 = m_list.GetItemText(nItem, 9);
|
||
strexeis86 == _T("x86") ? p_InjectData->ExeIsx86 = 1 : p_InjectData->ExeIsx86 = 0;
|
||
memcpy(p_InjectData->strpath, dlg.Str_remote, dlg.Str_remote.GetLength() * 2 + 2);
|
||
//读取文件
|
||
BYTE* lpBuffer = NULL;
|
||
HANDLE hFile = CreateFile(dlg.Str_loacal, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
|
||
if (hFile == INVALID_HANDLE_VALUE) {
|
||
PostMessage(WM_SHOW_MSG, (WPARAM)new CString(_TR("打开文件失败...")), 0);
|
||
} else {
|
||
p_InjectData->datasize = GetFileSize(hFile, NULL);
|
||
int allsize = p_InjectData->datasize + sizeof(InjectData)+1;
|
||
lpBuffer = new BYTE[allsize];
|
||
ZeroMemory(lpBuffer, allsize);
|
||
lpBuffer[0]= COMMAND_INJECT;
|
||
memcpy(lpBuffer+1, p_InjectData, sizeof(InjectData));
|
||
DWORD wr = 0;
|
||
ReadFile(hFile, lpBuffer + sizeof(InjectData)+1, p_InjectData->datasize, &wr, NULL);
|
||
SAFE_CLOSE_HANDLE(hFile);
|
||
m_ContextObject->Send2Client(lpBuffer, allsize);
|
||
SAFE_DELETE_AR(lpBuffer);
|
||
}
|
||
SAFE_DELETE(p_InjectData);
|
||
break;
|
||
}
|
||
}
|
||
break;
|
||
default:
|
||
break;
|
||
}
|
||
|
||
menu.DestroyMenu();
|
||
}
|
||
|
||
void CMachineDlg::ShowWindowsList_menu()
|
||
{
|
||
CMenu menu;
|
||
VERIFY(menu.CreatePopupMenu());
|
||
menu.AppendMenuL(MF_STRING | MF_ENABLED, 50, _T("刷新数据(&F)"));
|
||
menu.AppendMenuL(MF_STRING | MF_ENABLED, 100, _T("复制数据(&V)"));
|
||
menu.AppendMenuSeparator(MF_SEPARATOR);
|
||
menu.AppendMenuL(MF_STRING | MF_ENABLED, 200, _T("还原窗口(&H)"));
|
||
menu.AppendMenuL(MF_STRING | MF_ENABLED, 300, _T("隐藏窗口(&Y)"));
|
||
menu.AppendMenuL(MF_STRING | MF_ENABLED, 400, _T("关闭窗口(&E)"));
|
||
menu.AppendMenuSeparator(MF_SEPARATOR);
|
||
menu.AppendMenuL(MF_STRING | MF_ENABLED, 500, _T("最 大 化(&M)"));
|
||
menu.AppendMenuL(MF_STRING | MF_ENABLED, 600, _T("最 小 化(&I)"));
|
||
menu.AppendMenuSeparator(MF_SEPARATOR);
|
||
menu.AppendMenuL(MF_STRING | MF_ENABLED, 700, _T("冻结进程(&D)"));
|
||
menu.AppendMenuL(MF_STRING | MF_ENABLED, 800, _T("解冻进程(&J)"));
|
||
menu.AppendMenuSeparator(MF_SEPARATOR);
|
||
menu.AppendMenuL(MF_STRING | MF_ENABLED, 900, _T("结束进程(&E)"));
|
||
menu.AppendMenuSeparator(MF_SEPARATOR);
|
||
CPoint p;
|
||
GetCursorPos(&p);
|
||
int nMenuResult = ::TrackPopupMenu(menu, TPM_LEFTALIGN | TPM_RIGHTBUTTON | TPM_RETURNCMD, p.x, p.y, 0, GetSafeHwnd(), NULL);
|
||
if (!nMenuResult) return;
|
||
switch (nMenuResult) {
|
||
case 50:
|
||
reflush();
|
||
break;
|
||
case 100: {
|
||
if (m_list.GetSelectedCount() < 1) {
|
||
return;
|
||
}
|
||
POSITION pos = m_list.GetFirstSelectedItemPosition();
|
||
CString Data;
|
||
CString temp;
|
||
while (pos) {
|
||
temp = _T("");
|
||
int nItem = m_list.GetNextSelectedItem(pos);
|
||
for (int i = 0; i < m_list.GetHeaderCtrl()->GetItemCount(); i++) {
|
||
temp += m_list.GetItemText(nItem, i);
|
||
temp += _T(" ");
|
||
}
|
||
Data += temp;
|
||
Data += _T("\r\n");
|
||
}
|
||
SetClipboardText(Data);
|
||
MessageBoxL(_T("已复制数据到剪切板!"), "提示", MB_ICONINFORMATION);
|
||
}
|
||
break;
|
||
case 200: {
|
||
BYTE lpMsgBuf[20];
|
||
int nItem = m_list.GetSelectionMark();
|
||
if (nItem >= 0) {
|
||
ZeroMemory(lpMsgBuf, 20);
|
||
lpMsgBuf[0] = COMMAND_WINDOW_OPERATE;
|
||
DWORD hwnd = _tstoi(m_list.GetItemText(nItem, 1));
|
||
m_list.SetItemTextL(nItem, 3, "发送还原命令");
|
||
memcpy(lpMsgBuf + 1, &hwnd, sizeof(DWORD));
|
||
DWORD dHow = SW_RESTORE;
|
||
memcpy(lpMsgBuf + 1 + sizeof(hwnd), &dHow, sizeof(DWORD));
|
||
m_ContextObject->Send2Client(lpMsgBuf, sizeof(lpMsgBuf));
|
||
}
|
||
}
|
||
break;
|
||
case 300: {
|
||
BYTE lpMsgBuf[20];
|
||
int nItem = m_list.GetSelectionMark();
|
||
if (nItem >= 0) {
|
||
ZeroMemory(lpMsgBuf, 20);
|
||
lpMsgBuf[0] = COMMAND_WINDOW_OPERATE;
|
||
DWORD hwnd = _tstoi(m_list.GetItemText(nItem, 1));
|
||
m_list.SetItemTextL(nItem, 3, "发送隐藏命令");
|
||
memcpy(lpMsgBuf + 1, &hwnd, sizeof(DWORD));
|
||
DWORD dHow = SW_HIDE;
|
||
memcpy(lpMsgBuf + 1 + sizeof(hwnd), &dHow, sizeof(DWORD));
|
||
m_ContextObject->Send2Client(lpMsgBuf, sizeof(lpMsgBuf));
|
||
}
|
||
}
|
||
break;
|
||
case 400: {
|
||
// TODO: Add your command handler code here
|
||
BYTE lpMsgBuf[20];
|
||
int nItem = m_list.GetSelectionMark();
|
||
if (nItem >= 0) {
|
||
ZeroMemory(lpMsgBuf, 20);
|
||
lpMsgBuf[0] = COMMAND_WINDOW_CLOSE;
|
||
DWORD hwnd = _tstoi(m_list.GetItemText(nItem, 1));
|
||
m_list.SetItemTextL(nItem, 3, "发送关闭命令");
|
||
memcpy(lpMsgBuf + 1, &hwnd, sizeof(DWORD));
|
||
m_ContextObject->Send2Client(lpMsgBuf, sizeof(lpMsgBuf));
|
||
}
|
||
}
|
||
break;
|
||
case 500: {
|
||
BYTE lpMsgBuf[20];
|
||
int nItem = m_list.GetSelectionMark();
|
||
if (nItem >= 0) {
|
||
ZeroMemory(lpMsgBuf, 20);
|
||
lpMsgBuf[0] = COMMAND_WINDOW_OPERATE;
|
||
DWORD hwnd = _tstoi(m_list.GetItemText(nItem, 1));
|
||
m_list.SetItemTextL(nItem, 3, "发送最大化命令");
|
||
memcpy(lpMsgBuf + 1, &hwnd, sizeof(DWORD));
|
||
DWORD dHow = SW_MAXIMIZE;
|
||
memcpy(lpMsgBuf + 1 + sizeof(hwnd), &dHow, sizeof(DWORD));
|
||
m_ContextObject->Send2Client(lpMsgBuf, sizeof(lpMsgBuf));
|
||
}
|
||
}
|
||
break;
|
||
case 600: {
|
||
BYTE lpMsgBuf[20];
|
||
int nItem = m_list.GetSelectionMark();
|
||
if (nItem >= 0) {
|
||
ZeroMemory(lpMsgBuf, 20);
|
||
lpMsgBuf[0] = COMMAND_WINDOW_OPERATE;
|
||
DWORD hwnd = _tstoi(m_list.GetItemText(nItem, 1));
|
||
m_list.SetItemTextL(nItem, 3, "发送最小化命令");
|
||
memcpy(lpMsgBuf + 1, &hwnd, sizeof(DWORD));
|
||
DWORD dHow = SW_MINIMIZE;
|
||
memcpy(lpMsgBuf + 1 + sizeof(hwnd), &dHow, sizeof(DWORD));
|
||
m_ContextObject->Send2Client(lpMsgBuf, sizeof(lpMsgBuf));
|
||
}
|
||
}
|
||
break;
|
||
case 700: {
|
||
POSITION pos = m_list.GetFirstSelectedItemPosition();
|
||
while (pos) {
|
||
int nItem = m_list.GetNextSelectedItem(pos);
|
||
LPBYTE lpBuffer = new BYTE[1 + sizeof(DWORD)];
|
||
lpBuffer[0] = COMMAND_PROCESS_FREEZING;
|
||
CString pid;
|
||
pid = m_list.GetItemText(nItem, 0);
|
||
DWORD dwProcessID = _tstoi(pid);
|
||
memcpy(lpBuffer + 1, &dwProcessID, sizeof(DWORD));
|
||
m_ContextObject->Send2Client(lpBuffer, sizeof(DWORD) + 1);
|
||
SAFE_DELETE_AR(lpBuffer);
|
||
}
|
||
}
|
||
break;
|
||
case 800: {
|
||
POSITION pos = m_list.GetFirstSelectedItemPosition();
|
||
while (pos) {
|
||
int nItem = m_list.GetNextSelectedItem(pos);
|
||
LPBYTE lpBuffer = new BYTE[1 + sizeof(DWORD)];
|
||
lpBuffer[0] = COMMAND_PROCESS_THAW;
|
||
CString pid;
|
||
pid = m_list.GetItemText(nItem, 0);
|
||
DWORD dwProcessID = _tstoi(pid);
|
||
memcpy(lpBuffer + 1, &dwProcessID, sizeof(DWORD));
|
||
m_ContextObject->Send2Client(lpBuffer, sizeof(DWORD) + 1);
|
||
SAFE_DELETE_AR(lpBuffer);
|
||
}
|
||
}
|
||
break;
|
||
case 900: {
|
||
POSITION pos = m_list.GetFirstSelectedItemPosition();
|
||
while (pos) {
|
||
int nItem = m_list.GetNextSelectedItem(pos);
|
||
LPBYTE lpBuffer = new BYTE[1 + sizeof(DWORD)];
|
||
lpBuffer[0] = COMMAND_PROCESS_KILL;
|
||
CString pid;
|
||
pid = m_list.GetItemText(nItem, 0);
|
||
DWORD dwProcessID = _tstoi(pid);
|
||
memcpy(lpBuffer + 1, &dwProcessID, sizeof(DWORD));
|
||
m_ContextObject->Send2Client(lpBuffer, sizeof(DWORD) + 1);
|
||
SAFE_DELETE_AR(lpBuffer);
|
||
}
|
||
}
|
||
break;
|
||
default:
|
||
break;
|
||
}
|
||
|
||
menu.DestroyMenu();
|
||
}
|
||
|
||
void CMachineDlg::ShowNetStateList_menu()
|
||
{
|
||
CMenu menu;
|
||
VERIFY(menu.CreatePopupMenu());
|
||
menu.AppendMenuL(MF_STRING | MF_ENABLED, 50, _T("刷新数据(&F)"));
|
||
menu.AppendMenuL(MF_STRING | MF_ENABLED, 100, _T("复制数据(&V)"));
|
||
menu.AppendMenuL(MF_STRING | MF_ENABLED, 150, _T("结束进程(&C)"));
|
||
menu.AppendMenuSeparator(MF_SEPARATOR);
|
||
CPoint p;
|
||
GetCursorPos(&p);
|
||
int nMenuResult = ::TrackPopupMenu(menu, TPM_LEFTALIGN | TPM_RIGHTBUTTON | TPM_RETURNCMD, p.x, p.y, 0, GetSafeHwnd(), NULL);
|
||
if (!nMenuResult) return;
|
||
switch (nMenuResult) {
|
||
case 50:
|
||
reflush();
|
||
break;
|
||
case 100: {
|
||
if (m_list.GetSelectedCount() < 1) {
|
||
return;
|
||
}
|
||
POSITION pos = m_list.GetFirstSelectedItemPosition();
|
||
CString Data;
|
||
CString temp;
|
||
while (pos) {
|
||
temp = _T("");
|
||
int nItem = m_list.GetNextSelectedItem(pos);
|
||
for (int i = 0; i < m_list.GetHeaderCtrl()->GetItemCount(); i++) {
|
||
temp += m_list.GetItemText(nItem, i);
|
||
temp += _T(" ");
|
||
}
|
||
Data += temp;
|
||
Data += _T("\r\n");
|
||
}
|
||
SetClipboardText(Data);
|
||
MessageBoxL(_T("已复制数据到剪切板!"), "提示", MB_ICONINFORMATION);
|
||
}
|
||
break;
|
||
case 150: {
|
||
POSITION pos = m_list.GetFirstSelectedItemPosition();
|
||
while (pos) {
|
||
int nItem = m_list.GetNextSelectedItem(pos);
|
||
ListItem* item = (ListItem*)m_list.GetItemData(nItem);
|
||
if (!item) continue;
|
||
LPBYTE lpBuffer = new BYTE[1 + sizeof(DWORD)];
|
||
lpBuffer[0] = COMMAND_PROCESS_KILL;
|
||
DWORD dwProcessID = item->pid;
|
||
memcpy(lpBuffer + 1, &dwProcessID, sizeof(DWORD));
|
||
m_ContextObject->Send2Client(lpBuffer, sizeof(DWORD) + 1);
|
||
SAFE_DELETE_AR(lpBuffer);
|
||
}
|
||
}
|
||
break;
|
||
default:
|
||
break;
|
||
}
|
||
menu.DestroyMenu();
|
||
}
|
||
|
||
|
||
void CMachineDlg::ShowSoftWareList_menu()
|
||
{
|
||
CMenu menu;
|
||
VERIFY(menu.CreatePopupMenu());
|
||
menu.AppendMenuL(MF_STRING | MF_ENABLED, 50, _T("刷新数据(&F)"));
|
||
menu.AppendMenuL(MF_STRING | MF_ENABLED, 100, _T("复制数据(&V)"));
|
||
menu.AppendMenuL(MF_STRING | MF_ENABLED, 200, _T("卸载程序(&X)"));
|
||
menu.AppendMenuSeparator(MF_SEPARATOR);
|
||
CPoint p;
|
||
GetCursorPos(&p);
|
||
int nMenuResult = ::TrackPopupMenu(menu, TPM_LEFTALIGN | TPM_RIGHTBUTTON | TPM_RETURNCMD, p.x, p.y, 0, GetSafeHwnd(), NULL);
|
||
if (!nMenuResult) return;
|
||
switch (nMenuResult) {
|
||
case 50:
|
||
reflush();
|
||
break;
|
||
case 100: {
|
||
if (m_list.GetSelectedCount() < 1) {
|
||
return;
|
||
}
|
||
POSITION pos = m_list.GetFirstSelectedItemPosition();
|
||
CString Data;
|
||
CString temp;
|
||
while (pos) {
|
||
temp = _T("");
|
||
int nItem = m_list.GetNextSelectedItem(pos);
|
||
for (int i = 0; i < m_list.GetHeaderCtrl()->GetItemCount(); i++) {
|
||
temp += m_list.GetItemText(nItem, i);
|
||
temp += _T(" ");
|
||
}
|
||
Data += temp;
|
||
Data += _T("\r\n");
|
||
}
|
||
SetClipboardText(Data);
|
||
MessageBoxL(_T("已复制数据到剪切板!"), "提示", MB_ICONINFORMATION);
|
||
}
|
||
break;
|
||
case 200: {
|
||
if (m_list.GetSelectedCount() < 1) {
|
||
return;
|
||
}
|
||
|
||
if (MessageBoxL(_T("确定要卸载该程序?"), _T("提示"), MB_YESNO | MB_ICONQUESTION) == IDNO)
|
||
return;
|
||
|
||
POSITION pos = m_list.GetFirstSelectedItemPosition();
|
||
CString str;
|
||
CStringA str_a;
|
||
while (pos) {
|
||
int nItem = m_list.GetNextSelectedItem(pos);
|
||
str = m_list.GetItemText(nItem, 4);
|
||
|
||
if (str.GetLength() > 0) {
|
||
str_a = str;
|
||
LPBYTE lpBuffer = new BYTE[1 + str_a.GetLength()];
|
||
lpBuffer[0] = COMMAND_APPUNINSTALL;
|
||
memcpy(lpBuffer + 1, str_a.GetBuffer(0), str_a.GetLength());
|
||
m_ContextObject->Send2Client(lpBuffer, str_a.GetLength() + 1);
|
||
SAFE_DELETE_AR(lpBuffer);
|
||
}
|
||
}
|
||
}
|
||
break;
|
||
default:
|
||
break;
|
||
}
|
||
|
||
menu.DestroyMenu();
|
||
}
|
||
|
||
void CMachineDlg::ShowIEHistoryList_menu()
|
||
{
|
||
CMenu menu;
|
||
VERIFY(menu.CreatePopupMenu());
|
||
menu.AppendMenuL(MF_STRING | MF_ENABLED, 50, _T("刷新数据(&F)"));
|
||
menu.AppendMenuL(MF_STRING | MF_ENABLED, 100, _T("复制数据(&V)"));
|
||
|
||
menu.AppendMenuSeparator(MF_SEPARATOR);
|
||
CPoint p;
|
||
GetCursorPos(&p);
|
||
int nMenuResult = ::TrackPopupMenu(menu, TPM_LEFTALIGN | TPM_RIGHTBUTTON | TPM_RETURNCMD, p.x, p.y, 0, GetSafeHwnd(), NULL);
|
||
if (!nMenuResult) return;
|
||
switch (nMenuResult) {
|
||
case 50:
|
||
reflush();
|
||
break;
|
||
case 100: {
|
||
if (m_list.GetSelectedCount() < 1) {
|
||
return;
|
||
}
|
||
POSITION pos = m_list.GetFirstSelectedItemPosition();
|
||
CString Data;
|
||
CString temp;
|
||
while (pos) {
|
||
temp = _T("");
|
||
int nItem = m_list.GetNextSelectedItem(pos);
|
||
for (int i = 0; i < m_list.GetHeaderCtrl()->GetItemCount(); i++) {
|
||
temp += m_list.GetItemText(nItem, i);
|
||
temp += _T(" ");
|
||
}
|
||
Data += temp;
|
||
Data += _T("\r\n");
|
||
}
|
||
SetClipboardText(Data);
|
||
MessageBoxL(_T("已复制数据到剪切板!"), "提示", MB_ICONINFORMATION);
|
||
}
|
||
break;
|
||
|
||
default:
|
||
break;
|
||
}
|
||
|
||
menu.DestroyMenu();
|
||
}
|
||
|
||
void CMachineDlg::ShowTaskList_menu()
|
||
{
|
||
CMenu menu;
|
||
VERIFY(menu.CreatePopupMenu());
|
||
menu.AppendMenuL(MF_STRING | MF_ENABLED, 100, _T("&(R)执行任务"));
|
||
menu.AppendMenuL(MF_STRING | MF_ENABLED, 101, _T("&(T)停止任务"));
|
||
menu.AppendMenuL(MF_STRING | MF_ENABLED, 102, _T("&(D)删除任务"));
|
||
menu.AppendMenuL(MF_STRING | MF_ENABLED, 103, _T("&(C)创建任务"));
|
||
menu.AppendMenuL(MF_STRING | MF_ENABLED, 104, _T("&(F)刷新任务"));
|
||
CPoint p;
|
||
GetCursorPos(&p);
|
||
int nMenuResult = menu.TrackPopupMenu(TPM_RETURNCMD | TPM_LEFTALIGN | TPM_RIGHTBUTTON, p.x, p.y, this, NULL);
|
||
menu.DestroyMenu();
|
||
if (!nMenuResult) return;
|
||
switch (nMenuResult) {
|
||
case 100: {
|
||
CString taskpath;
|
||
CString taskname;
|
||
DWORD offset = 0;
|
||
int nItem = m_list.GetNextItem(-1, LVNI_SELECTED);
|
||
if (nItem == -1) {
|
||
return;
|
||
}
|
||
|
||
taskpath = m_list.GetItemText(nItem, 1);
|
||
taskname = m_list.GetItemText(nItem, 2);
|
||
|
||
int nPacketLength = lstrlen(taskpath.GetBuffer()) * 2 + lstrlen(taskname.GetBuffer()) * 2 + 5;
|
||
LPBYTE lpBuffer = (LPBYTE)LocalAlloc(LPTR, nPacketLength);
|
||
lpBuffer[0] = COMMAND_TASKSTART;
|
||
offset++;
|
||
|
||
memcpy(lpBuffer + offset, taskpath.GetBuffer(), lstrlen(taskpath.GetBuffer()) * 2 + 2);
|
||
offset += lstrlen(taskpath.GetBuffer()) * 2 + 2;
|
||
|
||
memcpy(lpBuffer + offset, taskname.GetBuffer(), lstrlen(taskname.GetBuffer()) * 2 + 2);
|
||
offset += lstrlen(taskname.GetBuffer()) * 2 + 2;
|
||
|
||
m_ContextObject->Send2Client(lpBuffer, nPacketLength);
|
||
|
||
LocalFree(lpBuffer);
|
||
}
|
||
break;
|
||
case 101: {
|
||
CString taskpath;
|
||
CString taskname;
|
||
DWORD offset = 0;
|
||
int nItem = m_list.GetNextItem(-1, LVNI_SELECTED);
|
||
if (nItem == -1) {
|
||
return;
|
||
}
|
||
|
||
taskpath = m_list.GetItemText(nItem, 1);
|
||
taskname = m_list.GetItemText(nItem, 2);
|
||
|
||
int nPacketLength = lstrlen(taskpath.GetBuffer()) * 2 + lstrlen(taskname.GetBuffer()) * 2 + 5;
|
||
LPBYTE lpBuffer = (LPBYTE)LocalAlloc(LPTR, nPacketLength);
|
||
lpBuffer[0] = COMMAND_TASKSTOP;
|
||
offset++;
|
||
|
||
memcpy(lpBuffer + offset, taskpath.GetBuffer(), lstrlen(taskpath.GetBuffer()) * 2 + 2);
|
||
offset += lstrlen(taskpath.GetBuffer()) * 2 + 2;
|
||
|
||
memcpy(lpBuffer + offset, taskname.GetBuffer(), lstrlen(taskname.GetBuffer()) * 2 + 2);
|
||
offset += lstrlen(taskname.GetBuffer()) * 2 + 2;
|
||
|
||
m_ContextObject->Send2Client(lpBuffer, nPacketLength);
|
||
|
||
LocalFree(lpBuffer);
|
||
}
|
||
break;
|
||
case 102: {
|
||
CString taskpath;
|
||
CString taskname;
|
||
DWORD offset = 0;
|
||
int nItem = m_list.GetNextItem(-1, LVNI_SELECTED);
|
||
if (nItem == -1) {
|
||
return;
|
||
}
|
||
|
||
taskpath = m_list.GetItemText(nItem, 1);
|
||
taskname = m_list.GetItemText(nItem, 2);
|
||
|
||
int nPacketLength = lstrlen(taskpath.GetBuffer()) * 2 + lstrlen(taskname.GetBuffer()) * 2 + 5;
|
||
LPBYTE lpBuffer = (LPBYTE)LocalAlloc(LPTR, nPacketLength);
|
||
lpBuffer[0] = COMMAND_TASKDEL;
|
||
offset++;
|
||
|
||
memcpy(lpBuffer + offset, taskpath.GetBuffer(), lstrlen(taskpath.GetBuffer()) * 2 + 2);
|
||
offset += lstrlen(taskpath.GetBuffer()) * 2 + 2;
|
||
|
||
memcpy(lpBuffer + offset, taskname.GetBuffer(), lstrlen(taskname.GetBuffer()) * 2 + 2);
|
||
offset += lstrlen(taskname.GetBuffer()) * 2 + 2;
|
||
|
||
m_ContextObject->Send2Client(lpBuffer, nPacketLength);
|
||
|
||
LocalFree(lpBuffer);
|
||
}
|
||
break;
|
||
case 103: {
|
||
DWORD len = 0;
|
||
DWORD offset = 0;
|
||
CCreateTaskDlg* dlg = new CCreateTaskDlg(this);
|
||
if (IDOK == dlg->DoModal()) {
|
||
// 计算字符串长度
|
||
len = lstrlen(dlg->m_TaskPath.GetBuffer()) * 2 + lstrlen(dlg->m_TaskNames.GetBuffer()) * 2 + lstrlen(dlg->m_ExePath.GetBuffer()) *
|
||
2 + lstrlen(dlg->m_Author.GetBuffer()) * 2 + lstrlen(dlg->m_Description.GetBuffer()) * 2 + 12;
|
||
LPBYTE lpBuffer = (LPBYTE)LocalAlloc(LPTR, len);
|
||
if (lpBuffer) {
|
||
lpBuffer[0] = COMMAND_TASKCREAT;
|
||
offset++;
|
||
|
||
memcpy(lpBuffer + offset, dlg->m_TaskPath.GetBuffer(), lstrlen(dlg->m_TaskPath.GetBuffer()) * 2 + 2);
|
||
offset += lstrlen(dlg->m_TaskPath.GetBuffer()) * 2 + 2;
|
||
|
||
memcpy(lpBuffer + offset, dlg->m_TaskNames.GetBuffer(), lstrlen(dlg->m_TaskNames.GetBuffer()) * 2 + 2);
|
||
offset += lstrlen(dlg->m_TaskNames.GetBuffer()) * 2 + 2;
|
||
|
||
memcpy(lpBuffer + offset, dlg->m_ExePath.GetBuffer(), lstrlen(dlg->m_ExePath.GetBuffer()) * 2 + 2);
|
||
offset += lstrlen(dlg->m_ExePath.GetBuffer()) * 2 + 2;
|
||
|
||
memcpy(lpBuffer + offset, dlg->m_Author.GetBuffer(), lstrlen(dlg->m_Author.GetBuffer()) * 2 + 2);
|
||
offset += lstrlen(dlg->m_Author.GetBuffer()) * 2 + 2;
|
||
|
||
memcpy(lpBuffer + offset, dlg->m_Description.GetBuffer(), lstrlen(dlg->m_Description.GetBuffer()) * 2 + 2);
|
||
offset += lstrlen(dlg->m_Description.GetBuffer()) * 2 + 2;
|
||
m_ContextObject->Send2Client(lpBuffer, len);
|
||
|
||
LocalFree(lpBuffer);
|
||
}
|
||
}
|
||
|
||
delete dlg;
|
||
}
|
||
break;
|
||
case 104: {
|
||
BYTE bToken = COMMAND_MACHINE_TASK;
|
||
m_ContextObject->Send2Client(&bToken, 1);
|
||
}
|
||
break;
|
||
}
|
||
}
|
||
|
||
void CMachineDlg::ShowFavoritesUrlList_menu()
|
||
{
|
||
CMenu menu;
|
||
VERIFY(menu.CreatePopupMenu());
|
||
menu.AppendMenuL(MF_STRING | MF_ENABLED, 50, _T("刷新数据(&F)"));
|
||
menu.AppendMenuL(MF_STRING | MF_ENABLED, 100, _T("复制数据(&V)"));
|
||
|
||
menu.AppendMenuSeparator(MF_SEPARATOR);
|
||
CPoint p;
|
||
GetCursorPos(&p);
|
||
int nMenuResult = ::TrackPopupMenu(menu, TPM_LEFTALIGN | TPM_RIGHTBUTTON | TPM_RETURNCMD, p.x, p.y, 0, GetSafeHwnd(), NULL);
|
||
if (!nMenuResult) return;
|
||
switch (nMenuResult) {
|
||
case 50:
|
||
reflush();
|
||
break;
|
||
case 100: {
|
||
if (m_list.GetSelectedCount() < 1) {
|
||
return;
|
||
}
|
||
POSITION pos = m_list.GetFirstSelectedItemPosition();
|
||
CString Data;
|
||
CString temp;
|
||
while (pos) {
|
||
temp = _T("");
|
||
int nItem = m_list.GetNextSelectedItem(pos);
|
||
for (int i = 0; i < m_list.GetHeaderCtrl()->GetItemCount(); i++) {
|
||
temp += m_list.GetItemText(nItem, i);
|
||
temp += _T(" ");
|
||
}
|
||
Data += temp;
|
||
Data += _T("\r\n");
|
||
}
|
||
SetClipboardText(Data);
|
||
MessageBoxL(_T("已复制数据到剪切板!"), "提示", MB_ICONINFORMATION);
|
||
}
|
||
break;
|
||
default:
|
||
break;
|
||
}
|
||
|
||
menu.DestroyMenu();
|
||
}
|
||
|
||
void CMachineDlg::ShowServiceList_menu()
|
||
{
|
||
CMenu menu;
|
||
VERIFY(menu.CreatePopupMenu());
|
||
menu.AppendMenuL(MF_STRING | MF_ENABLED, 100, _T("启动(&S)"));
|
||
menu.AppendMenuL(MF_STRING | MF_ENABLED, 200, _T("停止(&O)"));
|
||
menu.AppendMenuL(MF_STRING | MF_ENABLED, 300, _T("暂停(&U)"));
|
||
menu.AppendMenuL(MF_STRING | MF_ENABLED, 400, _T("恢复(&M)"));
|
||
menu.AppendMenuL(MF_STRING | MF_ENABLED, 500, _T("重新启动(&E)"));
|
||
menu.AppendMenuSeparator(MF_SEPARATOR);
|
||
menu.AppendMenuL(MF_STRING | MF_ENABLED, 600, _T("刷新(&R)"));
|
||
menu.AppendMenuSeparator(MF_SEPARATOR);
|
||
menu.AppendMenuL(MF_STRING | MF_ENABLED, 700, _T("属性(&R)"));
|
||
menu.AppendMenuSeparator(MF_SEPARATOR);
|
||
menu.AppendMenuL(MF_STRING | MF_ENABLED, 800, _T("删除服务(&D)"));
|
||
CPoint p;
|
||
GetCursorPos(&p);
|
||
int nMenuResult = ::TrackPopupMenu(menu, TPM_LEFTALIGN | TPM_RIGHTBUTTON | TPM_RETURNCMD, p.x, p.y, 0, GetSafeHwnd(), NULL);
|
||
if (!nMenuResult) return;
|
||
switch (nMenuResult) {
|
||
case 100:
|
||
SendToken(COMMAND_STARTSERVERICE);
|
||
break;
|
||
case 200:
|
||
SendToken(COMMAND_STOPSERVERICE);
|
||
break;
|
||
case 300:
|
||
SendToken(COMMAND_PAUSESERVERICE);
|
||
break;
|
||
case 400:
|
||
SendToken(COMMAND_CONTINUESERVERICE);
|
||
break;
|
||
case 500: {
|
||
SendToken(COMMAND_STOPSERVERICE);
|
||
Sleep(100);
|
||
SendToken(COMMAND_STARTSERVERICE);
|
||
}
|
||
break;
|
||
case 600: {
|
||
BYTE bToken;
|
||
int nID = m_tab.GetCurSel();
|
||
if (nID == 6)
|
||
bToken = COMMAND_SERVICE_LIST_WIN32;
|
||
else
|
||
bToken = COMMAND_SERVICE_LIST_DRIVER;
|
||
m_ContextObject->Send2Client(&bToken, sizeof(BYTE));
|
||
}
|
||
break;
|
||
case 700:
|
||
OpenInfoDlg();
|
||
break;
|
||
case 800:
|
||
SendToken(COMMAND_DELETESERVERICE);
|
||
break;
|
||
|
||
default:
|
||
break;
|
||
}
|
||
|
||
menu.DestroyMenu();
|
||
}
|
||
|
||
|
||
void CMachineDlg::ShowHostsList_menu()
|
||
{
|
||
CMenu menu;
|
||
VERIFY(menu.CreatePopupMenu());
|
||
menu.AppendMenuL(MF_STRING | MF_ENABLED, 50, _T("刷新数据(&F)"));
|
||
menu.AppendMenuL(MF_STRING | MF_ENABLED, 100, _T("复制数据(&V)"));
|
||
menu.AppendMenuSeparator(MF_SEPARATOR);
|
||
menu.AppendMenuL(MF_STRING | MF_ENABLED, 200, _T("修改远程文件(&S)"));
|
||
menu.AppendMenuL(MF_STRING | MF_ENABLED, 300, _T("加载本地文件(&S)"));
|
||
CPoint p;
|
||
GetCursorPos(&p);
|
||
int nMenuResult = ::TrackPopupMenu(menu, TPM_LEFTALIGN | TPM_RIGHTBUTTON | TPM_RETURNCMD, p.x, p.y, 0, GetSafeHwnd(), NULL);
|
||
if (!nMenuResult) return;
|
||
switch (nMenuResult) {
|
||
case 50:
|
||
reflush();
|
||
break;
|
||
case 100: {
|
||
if (m_list.GetSelectedCount() < 1) {
|
||
return;
|
||
}
|
||
POSITION pos = m_list.GetFirstSelectedItemPosition();
|
||
CString Data;
|
||
CString temp;
|
||
while (pos) {
|
||
temp = _T("");
|
||
int nItem = m_list.GetNextSelectedItem(pos);
|
||
for (int i = 0; i < m_list.GetHeaderCtrl()->GetItemCount(); i++) {
|
||
temp += m_list.GetItemText(nItem, i);
|
||
temp += _T(" ");
|
||
}
|
||
Data += temp;
|
||
Data += _T("\r\n");
|
||
}
|
||
SetClipboardText(Data);
|
||
MessageBoxL(_T("已复制数据到剪切板!"), "提示", MB_ICONINFORMATION);
|
||
}
|
||
break;
|
||
case 200: {
|
||
CString Data;
|
||
CString temp;
|
||
for (int i = 0; i < m_list.GetItemCount(); i++) {
|
||
int nItem = m_list.GetNextItem(i - 1, LVNI_ALL);
|
||
temp = m_list.GetItemText(nItem, 0);
|
||
Data += temp;
|
||
Data += _T("\r\n");
|
||
}
|
||
CStringA Data_a;
|
||
Data_a = Data;
|
||
LPBYTE lpBuffer = new BYTE[1 + Data_a.GetLength()];
|
||
lpBuffer[0] = COMMAND_HOSTS_SET;
|
||
memcpy(lpBuffer + 1, Data_a.GetBuffer(0), Data_a.GetLength());
|
||
m_ContextObject->Send2Client(lpBuffer, Data_a.GetLength() + 1);
|
||
SAFE_DELETE_AR(lpBuffer);
|
||
}
|
||
break;
|
||
case 300: {
|
||
HANDLE hFile = INVALID_HANDLE_VALUE;
|
||
DWORD dwSize = 0, dwRead;
|
||
LPBYTE lpBuffer = NULL;
|
||
CFileDialog dlg(TRUE, _T("*.txt"), NULL, OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST | OFN_HIDEREADONLY,
|
||
_T("TXT Files(*.txt;*.txt)|*.txt;*.txt| All Files (*.*) |*.*||"), NULL);
|
||
CString strTitle = _L(_T("选择文件"));
|
||
dlg.m_ofn.lpstrTitle = strTitle;
|
||
|
||
if (dlg.DoModal() != IDOK)
|
||
break;
|
||
CString FilePathName = dlg.GetPathName();
|
||
SetFileAttributes(FilePathName, FILE_ATTRIBUTE_NORMAL);
|
||
hFile = CreateFile(FilePathName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_ALWAYS, 0, NULL);
|
||
if (hFile == INVALID_HANDLE_VALUE)
|
||
return;
|
||
dwSize = GetFileSize(hFile, NULL);
|
||
lpBuffer = (LPBYTE)LocalAlloc(LPTR, dwSize + 2);
|
||
if (!ReadFile(hFile, lpBuffer, dwSize, &dwRead, NULL)) {
|
||
LocalFree(lpBuffer);
|
||
SAFE_CLOSE_HANDLE(hFile);
|
||
return;
|
||
}
|
||
SAFE_CLOSE_HANDLE(hFile);
|
||
|
||
DeleteList();
|
||
int i = 0;
|
||
char* buf=nullptr;
|
||
char* lpString = (char*)lpBuffer;
|
||
const char* d = "\n";
|
||
char* p = strtok_s(lpString, d, &buf);
|
||
while (p) {
|
||
CString item = p;
|
||
m_list.InsertItem(i, item);
|
||
p = strtok_s(NULL, d, &buf);
|
||
i++;
|
||
}
|
||
}
|
||
break;
|
||
default:
|
||
break;
|
||
}
|
||
|
||
menu.DestroyMenu();
|
||
}
|
||
|
||
CString CMachineDlg::oleTime2Str(double time)
|
||
{
|
||
CString str;
|
||
if (time == 0) {
|
||
str = _T("");
|
||
} else {
|
||
time_t t = (time_t)(time * 24 * 3600 - 2209190400);
|
||
struct tm tm1;
|
||
localtime_s(&tm1, &t);
|
||
str.FormatL(_T("%04d-%02d-%02d %02d:%02d:%02d"), tm1.tm_year + 1900, tm1.tm_mon + 1,
|
||
tm1.tm_mday, tm1.tm_hour, tm1.tm_min, tm1.tm_sec);
|
||
}
|
||
return str;
|
||
}
|