📄 procmgr.cpp
字号:
// procmgr.cpp: implementation of the CProcMgr class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "resource.h"
#include "common.h"
#include "ntshell.h"
#include "sockmgr1.h"
#include "inputdlg.h"
#include "procmgr.h"
LRESULT CProcMgr::OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& /*bHandled*/)
{
slave_sock = INVALID_SOCKET;
processlist = NULL;
SortColumn = 0;
SizeSortOrder[0] = 0;
SizeSortOrder[1] = 1;
SizeSortOrder[2] = 2;
SizeSortOrder[3] = 3;
SizeSortOrder[4] = 4;
SizeSortOrder[5] = 5;
m_hList.Attach(GetDlgItem(IDC_LIST));
m_hList.InsertColumn(0, "进程名", LVCFMT_LEFT, 150, 0);
m_hList.InsertColumn(1, "PID", LVCFMT_RIGHT, 50, 0);
m_hList.InsertColumn(2, "CPU", LVCFMT_RIGHT, 50, 0);
m_hList.InsertColumn(3, "用户名", LVCFMT_LEFT, 130, 0);
m_hList.InsertColumn(4, "内存使用", LVCFMT_RIGHT, 70, 0);
m_hList.InsertColumn(5, "映像路径", LVCFMT_LEFT, 300, 0);
DWORD dwStyle = m_hList.GetExtendedListViewStyle();
dwStyle |= LVS_EX_FULLROWSELECT | LVS_EX_HEADERDRAGDROP;
m_hList.SetExtendedListViewStyle(dwStyle);
return TRUE;
}
LRESULT CProcMgr::OnDestroy(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& /*bHandled*/)
{
if (slave_sock != INVALID_SOCKET)
{
closesocket(slave_sock);
slave_sock = INVALID_SOCKET;
}
while (processlist != NULL)
{
PPROCESS_LIST p = processlist;
processlist = processlist->next;
delete [] p;
}
return TRUE;
}
LRESULT CProcMgr::OnSize(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& /*bHandled*/)
{
::MoveWindow(GetDlgItem(IDC_LIST), 7, 7, LOWORD(lParam) - 14, HIWORD(lParam) - 14, TRUE);
return TRUE;
}
LRESULT CProcMgr::OnTimer(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
{
NTSHELL_REQUEST req;
req.ClientVersion = 1;
req.Reserved = 0;
req.RequestClass = PROCMGR_LISTPROCESS;
req.Reserved2 = 0;
WriteBuffer((char *)&req, sizeof(NTSHELL_REQUEST));
FlushBuffer();
SendPack();
//CleanupFileList();
return TRUE;
}
LRESULT CProcMgr::OnRun(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{
NTSHELL_REQUEST req;
req.ClientVersion = 1;
req.Reserved = 0;
req.RequestClass = PROCMGR_RUN;
req.Reserved2 = 0;
PROCMGR_PROCESSRUN pr;
pr.ShowWindow = TRUE;
pr.Reserved = 0;
CInputDlg<IDD_CREATEPROCESS> dlg;
char szImagePath[INPUT_BUFFER_SIZE] = "";
if (dlg.DoModal(m_hWnd, (LPARAM)szImagePath) == FALSE)
return 0;
WriteBuffer((char *)&req, sizeof(NTSHELL_REQUEST));
WriteBuffer((char *)&pr, sizeof(PROCMGR_PROCESSRUN));
WriteBuffer(szImagePath, strlen(szImagePath) + 1);
FlushBuffer();
if (SendPack() == SOCKMGR_SOCK_FAILED)
MessageBox("连接不可用", "错误", MB_ICONERROR);
return 0;
}
LRESULT CProcMgr::OnKillProcess(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{
int nItem = m_hList.GetSelectedIndex();
PPROCMGR_PROCESSINFO p = &((PPROCESS_LIST)m_hList.GetItemData(nItem))->processinfo;
CString str;
str.Format("确定要结束进程 %s ?", (char *)p + p->OffsetOfProcessName);
if (MessageBox(str, "警告", MB_ICONWARNING | MB_YESNO) == IDNO)
return 0;
NTSHELL_REQUEST req;
req.ClientVersion = 1;
req.Reserved = 0;
req.RequestClass = PROCMGR_KILLPROCESS;
req.Reserved2 = 0;
PROCMGR_PROCESSKILL pkp;
pkp.ProcessId = p->ProcessId;
WriteBuffer((char *)&req, sizeof(NTSHELL_REQUEST));
WriteBuffer((char *)&pkp, sizeof(PROCMGR_PROCESSKILL));
FlushBuffer();
if (SendPack() == SOCKMGR_SOCK_FAILED)
MessageBox("连接不可用", "错误", MB_ICONERROR);
return 0;
}
LRESULT CProcMgr::OnForceKillProcess(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{
int nItem = m_hList.GetSelectedIndex();
PPROCMGR_PROCESSINFO p = &((PPROCESS_LIST)m_hList.GetItemData(nItem))->processinfo;
CString str;
str.Format("强制结束功能并不稳定,可能导致远程操作系统崩溃,请慎重使用。\r\n确定要结束进程 %s ?", (char *)p + p->OffsetOfProcessName);
if (MessageBox(str, "警告", MB_ICONWARNING | MB_YESNO) == IDNO)
return 0;
NTSHELL_REQUEST req;
req.ClientVersion = 1;
req.Reserved = 0;
req.RequestClass = PROCMGR_FORCEKILLPROCESS;
req.Reserved2 = 0;
PROCMGR_PROCESSKILL pkp;
pkp.ProcessId = p->ProcessId;
WriteBuffer((char *)&req, sizeof(NTSHELL_REQUEST));
WriteBuffer((char *)&pkp, sizeof(PROCMGR_PROCESSKILL));
FlushBuffer();
if (SendPack() == SOCKMGR_SOCK_FAILED)
MessageBox("连接不可用", "错误", MB_ICONERROR);
return 0;
}
LRESULT CProcMgr::OnListEvent(int wParam, LPNMHDR pNMHDR, BOOL& /*bHandled*/)
{
NMLISTVIEW *pNMListView = (NMLISTVIEW *)pNMHDR;
int nItem = pNMListView->iItem;
HMENU hMenu, hPopupMenu;
POINT point;
nItem = m_hList.GetSelectedIndex();
switch (pNMHDR->code)
{
case NM_RCLICK:
hMenu = LoadMenu(GetModuleHandle(NULL), (LPCTSTR)IDR_SUBMENU);
hPopupMenu = GetSubMenu(hMenu, 1);
if (nItem == -1)
{
EnableMenuItem(hPopupMenu, IDM_PROCESS_KILL, MF_GRAYED);
EnableMenuItem(hPopupMenu, IDM_PROCESS_FORCEKILL, MF_GRAYED);
}
else
{
EnableMenuItem(hPopupMenu, IDM_PROCESS_KILL, MF_ENABLED);
EnableMenuItem(hPopupMenu, IDM_PROCESS_FORCEKILL, MF_ENABLED);
}
GetCursorPos(&point);
TrackPopupMenu(hPopupMenu, TPM_LEFTALIGN, point.x, point.y, 0, m_hWnd, NULL);
DestroyMenu(hMenu);
break;
}
return 0;
}
LRESULT CProcMgr::OnSocketRead(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/)
{
int ret = RecvPack();
if (ret == SOCKMGR_PENDING)
return 0;
if (ret == SOCKMGR_SOCK_FAILED)
{
char *p = GetErrorString();
MessageBox(p, "", MB_ICONERROR);
LocalFree(p);
}
if (ret == SOCKMGR_SUCCESS)
{
ULONG nDataSize = GetBufferDataSize();
PBYTE pData = (PBYTE)HeapAlloc(GetProcessHeap(), 0, nDataSize);
if (pData != NULL)
{
ReadBuffer((char *)pData, nDataSize);
ParseDataPack(pData, nDataSize);
HeapFree(GetProcessHeap(), 0, pData);
}
}
return 0;
}
LRESULT CProcMgr::OnSocketWrite(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/)
{
int ret = SendPack();
if (ret == SOCKMGR_SOCK_FAILED)
{
char *p = GetErrorString();
MessageBox(p, "", MB_ICONERROR);
LocalFree(p);
}
return 0;
}
int CALLBACK CProcMgr::CompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{
return 0;
}
LRESULT CProcMgr::OnConnectCreated(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled)
{
SetSocket((SOCKET)wParam);
NTSHELL_REQUEST req;
req.ClientVersion = 1;
req.Reserved = 0;
req.RequestClass = PROCMGR_LISTPROCESS;
req.Reserved2 = 0;
WriteBuffer((char *)&req, sizeof(NTSHELL_REQUEST));
FlushBuffer();
CleanupFileList();
SetTimer(WM_TIMER, 1000);
return 0;
}
LRESULT CProcMgr::OnConnectClosed(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)
{
SetSocket(INVALID_SOCKET);
KillTimer(WM_TIMER);
return 0;
}
void CProcMgr::CleanupFileList()
{
m_hList.DeleteAllItems();
while (processlist != NULL)
{
PPROCESS_LIST p = processlist;
processlist = processlist->next;
delete []p;
}
}
void CProcMgr::ParseDataPack(LPBYTE pData, ULONG nDataSize)
{
PNTSHELL_RESULTSET rs = (PNTSHELL_RESULTSET)pData;
CString str;
PBYTE p = pData + sizeof(NTSHELL_RESULTSET);
ULONG l = nDataSize - sizeof(NTSHELL_RESULTSET);
if (rs->ErrorCode != ERROR_SUCCESS)
{
LPVOID lpMsgBuf;
FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
rs->ErrorCode,
0,
(LPTSTR)&lpMsgBuf,
0,
NULL
);
MessageBox((LPTSTR)lpMsgBuf, "", MB_ICONERROR);
LocalFree(lpMsgBuf);
return;
}
if (rs->ResultClass == PROCMGR_LISTPROCESS)
{
int i, count;
CString str;
PPROCESS_LIST pList, *ppList = &processlist;
PPROCMGR_PROCESSINFO ppi;
while (*ppList != NULL)
{
for (i = 0, count = 0; ; count++)
{
if (i >= (int)l || count >= (int)rs->NumberOfResults)
{
LV_FINDINFO lvfi;
lvfi.flags = LVFI_PARAM;
lvfi.lParam = (LPARAM)*ppList;
int nItem = m_hList.FindItem(&lvfi, -1);
m_hList.DeleteItem(nItem); //移除不存在的进程
pList = *ppList;
*ppList = (*ppList)->next; //从链表中移除
delete [] pList;
goto Loop1;
}
ppi = (PPROCMGR_PROCESSINFO)(p + i);
if ((*ppList)->processinfo.ProcessId == ppi->ProcessId)
{
LV_FINDINFO lvfi;
lvfi.flags = LVFI_PARAM;
lvfi.lParam = (LPARAM)*ppList;
int nItem = m_hList.FindItem(&lvfi, -1);
(*ppList)->processinfo.TotalPrivateBytes = ppi->TotalPrivateBytes;
(*ppList)->processinfo.TotalVirtualSizeBytes = ppi->TotalVirtualSizeBytes;
(*ppList)->processinfo.ProcessCpuTime = ppi->ProcessCpuTime;
str.Format("%dk", ppi->TotalPrivateBytes / 1024);
m_hList.SetItemText(nItem, 4, str); //更新进程信息
break;
}
i += ppi->OffsetOfNextEntry;
}
ppList = &(*ppList)->next;
Loop1:
continue;
}
for (i = 0, count = 0; i < (int)l && count < (int)rs->NumberOfResults; count++)
{
ppi = (PPROCMGR_PROCESSINFO)(p + i);
pList = processlist;
while (pList != NULL)
{
if (pList->processinfo.ProcessId == ppi->ProcessId)
break;
pList = pList->next;
}
if (pList == NULL)
{
pList = (PPROCESS_LIST)new BYTE[sizeof(PROCESS_LIST) + ppi->OffsetOfNextEntry - sizeof(PROCMGR_PROCESSINFO)];
memcpy(&(pList->processinfo), ppi, ppi->OffsetOfNextEntry);
pList->next = processlist;
processlist = pList;
char *pName = (char *)ppi + ppi->OffsetOfProcessName;
m_hList.InsertItem(LVIF_TEXT | LVIF_PARAM, count, pName, 0, 0, 0, (LPARAM)pList);
str.Format("%d", ppi->ProcessId);
m_hList.SetItemText(count, 1, str);
pName = (char *)ppi + ppi->OffsetOfUserName;
m_hList.SetItemText(count, 3, pName);
str.Format("%dk", ppi->TotalPrivateBytes / 1024);
m_hList.SetItemText(count, 4, str);
pName = (char *)ppi + ppi->OffsetOfImagePath;
m_hList.SetItemText(count, 5, pName);
if (ppi->ProcessId == 0)
{
m_hList.SetItemText(count, 0, "System Idle Process");
m_hList.SetItemText(count, 3, "SYSTEM");
}
}
i += ppi->OffsetOfNextEntry;
}
m_hList.SortItems(CompareFunc, (LPARAM)SizeSortOrder[SortColumn]);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -