Files
SimpleRemoter/server/2015Remote/sys/MachineDlg.cpp
T
yuanyuanxianganddeepseek-v4-pro d2149851b2 Fix: Decode host-management and clipboard text as GBK/UTF-8 on non-Chinese systems
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
2026-10-12 15:41:24 +02:00

1754 lines
61 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);
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;
}