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; 
}