Files
SimpleRemoter/server/2015Remote/sys/MachineDlg.cpp
T
yuanyuanxianganddeepseek-flash 6c8336b497 Fix: Repair task actions and harden machine management
Scheduled task actions never worked end to end: the server built task
packets with Unicode-style lengths in a MultiByte build, the client had
no dispatch for the run/stop/delete/create commands, and the directory
column was derived by replacing every occurrence of the task name, which
misplaced tasks whose name also appeared in a parent folder. Packets are
now assembled with narrow strings, the four commands are routed to
RunOrStopTask/DelTask/CreateTask, and the folder is taken from the task
path suffix only. The task list reply is trimmed to its real length
instead of sending the whole 32 KB scratch buffer.

On the client side, thawing a process resumed a single thread, the
inject output path was copied from a narrow string using a wide-character
length, and an empty window list dereferenced a NULL buffer. The service
list leaked its enumeration block and one service handle per skipped
entry, and the description was copied without a bound. Service start and
stop now validate every handle, initialize the status structure, and stop
synchronously before the start that follows a restart request, which
previously always failed because the service was still in STOP_PENDING.
Deleting a process used to test only the low byte of the PID and leaked
the process handle on early exits, and a failed path conversion kept the
previous process image name. The IE history timestamp wrote minutes and
seconds in the wrong order, the favorites reader queried and closed an
uninitialized registry key, software enumeration never closed its subkeys,
and the task scheduler objects were not released after use.

The network state list now frees the module, snapshot, and extended
tables on every exit path, uses HeapFree for tables allocated on the
process heap, and no longer calls an export that may be missing. Growth
failures everywhere keep the original buffer instead of overwriting the
pointer, the hosts reader rejects an invalid file size, and the COM task
walk releases definitions and folders.

Co-Authored-By: deepseek-flash
2026-10-20 21:48:13 +02:00

1772 lines
62 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// 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);
// 目录列:只去掉末尾“\任务名”。不能用 Replace 全量替换——任务名也可能出现在父目录里,
// 那样算出的目录是错的,执行/停止/删除任务会定位到错误的文件夹。
str = taskpath;
{
CString tail = _T("\\");
tail += taskname;
if (str.GetLength() >= tail.GetLength() &&
str.Right(tail.GetLength()).CompareNoCase(tail) == 0) {
str = str.Left(str.GetLength() - tail.GetLength());
if (str.IsEmpty())
str = _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;
// Str_remote 是窄字符串、strpath 是 char[1024]:按字符数+1 拷贝;超长时截断,避免堆溢出
strncpy_s(p_InjectData->strpath, sizeof(p_InjectData->strpath), dlg.Str_remote, _TRUNCATE);
//读取文件
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);
// 服务端是 MultiByte 工程:按窄字符拼接,包长 = 1(令牌) + (目录+1) + (任务名+1)
int nPacketLength = lstrlen(taskpath.GetBuffer()) + lstrlen(taskname.GetBuffer()) + 3;
LPBYTE lpBuffer = (LPBYTE)LocalAlloc(LPTR, nPacketLength);
if (!lpBuffer) return;
lpBuffer[0] = COMMAND_TASKSTART;
offset++;
memcpy(lpBuffer + offset, taskpath.GetBuffer(), lstrlen(taskpath.GetBuffer()) + 1);
offset += lstrlen(taskpath.GetBuffer()) + 1;
memcpy(lpBuffer + offset, taskname.GetBuffer(), lstrlen(taskname.GetBuffer()) + 1);
offset += lstrlen(taskname.GetBuffer()) + 1;
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);
// 服务端是 MultiByte 工程:按窄字符拼接,包长 = 1(令牌) + (目录+1) + (任务名+1)
int nPacketLength = lstrlen(taskpath.GetBuffer()) + lstrlen(taskname.GetBuffer()) + 3;
LPBYTE lpBuffer = (LPBYTE)LocalAlloc(LPTR, nPacketLength);
if (!lpBuffer) return;
lpBuffer[0] = COMMAND_TASKSTOP;
offset++;
memcpy(lpBuffer + offset, taskpath.GetBuffer(), lstrlen(taskpath.GetBuffer()) + 1);
offset += lstrlen(taskpath.GetBuffer()) + 1;
memcpy(lpBuffer + offset, taskname.GetBuffer(), lstrlen(taskname.GetBuffer()) + 1);
offset += lstrlen(taskname.GetBuffer()) + 1;
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);
// 服务端是 MultiByte 工程:按窄字符拼接,包长 = 1(令牌) + (目录+1) + (任务名+1)
int nPacketLength = lstrlen(taskpath.GetBuffer()) + lstrlen(taskname.GetBuffer()) + 3;
LPBYTE lpBuffer = (LPBYTE)LocalAlloc(LPTR, nPacketLength);
if (!lpBuffer) return;
lpBuffer[0] = COMMAND_TASKDEL;
offset++;
memcpy(lpBuffer + offset, taskpath.GetBuffer(), lstrlen(taskpath.GetBuffer()) + 1);
offset += lstrlen(taskpath.GetBuffer()) + 1;
memcpy(lpBuffer + offset, taskname.GetBuffer(), lstrlen(taskname.GetBuffer()) + 1);
offset += lstrlen(taskname.GetBuffer()) + 1;
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()) {
// 服务端是 MultiByte 工程:5 个窄字符串各带 1 字节结束符,再加 1 字节令牌
len = lstrlen(dlg->m_TaskPath.GetBuffer()) + lstrlen(dlg->m_TaskNames.GetBuffer()) + lstrlen(dlg->m_ExePath.GetBuffer()) +
lstrlen(dlg->m_Author.GetBuffer()) + lstrlen(dlg->m_Description.GetBuffer()) + 6;
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()) + 1);
offset += lstrlen(dlg->m_TaskPath.GetBuffer()) + 1;
memcpy(lpBuffer + offset, dlg->m_TaskNames.GetBuffer(), lstrlen(dlg->m_TaskNames.GetBuffer()) + 1);
offset += lstrlen(dlg->m_TaskNames.GetBuffer()) + 1;
memcpy(lpBuffer + offset, dlg->m_ExePath.GetBuffer(), lstrlen(dlg->m_ExePath.GetBuffer()) + 1);
offset += lstrlen(dlg->m_ExePath.GetBuffer()) + 1;
memcpy(lpBuffer + offset, dlg->m_Author.GetBuffer(), lstrlen(dlg->m_Author.GetBuffer()) + 1);
offset += lstrlen(dlg->m_Author.GetBuffer()) + 1;
memcpy(lpBuffer + offset, dlg->m_Description.GetBuffer(), lstrlen(dlg->m_Description.GetBuffer()) + 1);
offset += lstrlen(dlg->m_Description.GetBuffer()) + 1;
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;
}