www.pudn.com > ntshell.rar > cmdshell.cpp, change:2007-12-20,size:6633b


// consoleView.cpp : implementation of the CCmdShell class 
// 
///////////////////////////////////////////////////////////////////////////// 
 
#include "stdafx.h" 
#include "resource.h" 
#include "common.h" 
 
#include "ntshell.h" 
#include "cmdshell.h" 
 
CCmdEditCtrl::CCmdEditCtrl() 
{ 
	nCmdRecord = 0; 
	nMaxCmdRecord = 100; 
	history = NULL; 
	slave_sock = INVALID_SOCKET; 
} 
 
CCmdEditCtrl::~CCmdEditCtrl() 
{ 
	PRECORD_LIST temp; 
 
	if (history != NULL) 
	{ 
		while (history->flink != NULL) 
		{ 
			history = history->flink; 
		} 
 
		while (history != NULL) 
		{ 
			temp = history; 
			history = history->blink; 
			HeapFree(GetProcessHeap(), 0, temp); 
		} 
 
		history = NULL; 
		nCmdRecord = 0; 
	} 
} 
 
void CCmdEditCtrl::AddCmdRecord(char *cmd) 
{ 
	PRECORD_LIST list, temp; 
	int cmdlen; 
 
	for (cmdlen = 0; cmd[cmdlen] && cmd[cmdlen] != 0x0a && cmd[cmdlen] != 0x0d; cmdlen++); 
 
	if (history != NULL) 
	{ 
		temp = history; 
 
		while (temp->flink != NULL)				//指向链表头部 
			temp = temp->flink; 
 
		while (temp != NULL) 
		{ 
			if (strncmp(temp->cmd, cmd, cmdlen) == 0 && temp->cmd[cmdlen] == '\0')	//查找重复记录 
			{ 
				if (temp->flink != NULL)				//移除节点 
				{ 
					history = temp->flink; 
					temp->flink->blink = temp->blink; 
				} 
 
				if (temp->blink != NULL) 
				{ 
					history = temp->blink; 
					temp->blink->flink = temp->flink; 
				} 
 
				while (history->blink != NULL) 
					history = history->blink; 
 
				if (temp != history) 
				{ 
					history->blink = temp; 
					temp->flink = history; 
					temp->blink = NULL; 
					history = temp; 
				} 
 
				return; 
			} 
 
			temp = temp->blink; 
		} 
	} 
 
	list = (PRECORD_LIST)HeapAlloc(GetProcessHeap(), 0, sizeof(RECORD_LIST) + cmdlen + 1); 
 
	if (list != NULL) 
	{ 
		strncpy(list->cmd, cmd, cmdlen); 
		list->cmd[cmdlen] = '\0'; 
 
		if (nCmdRecord > nMaxCmdRecord) 
		{ 
			temp = history; 
 
			while (temp->flink != NULL) 
				temp = temp->flink; 
 
			temp->blink->flink = NULL; 
			HeapFree(GetProcessHeap(), 0, temp); 
			nCmdRecord--; 
		} 
 
		if (history == NULL) 
		{ 
			list->flink = NULL; 
			list->blink = NULL; 
			history = list; 
		} 
		else 
		{ 
			while (history->blink != NULL) 
				history = history->blink; 
 
			list->flink = history; 
			list->blink = NULL; 
			history->blink = list; 
			history = list; 
		} 
 
		nCmdRecord++; 
	} 
} 
 
char *CCmdEditCtrl::GetNextCmdRecord() 
{ 
	if (history == NULL) 
		return ""; 
 
	if (history->blink != NULL) 
		history = history->blink; 
 
	return history->cmd; 
} 
 
char *CCmdEditCtrl::GetPrevCmdRecord() 
{ 
	if (history == NULL) 
		return ""; 
 
	if (history->flink != NULL) 
		history = history->flink; 
 
	return history->cmd; 
} 
 
BOOL CCmdEditCtrl::PreTranslateMessage(MSG* pMsg) 
{ 
	pMsg; 
	return FALSE; 
} 
 
LRESULT CCmdEditCtrl::OnRButtonDown(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) 
{ 
	int nStart, nEnd; 
 
	GetSel(nStart, nEnd); 
 
	if (nStart != nEnd) 
	{/* 
		if (OpenClipboard()) 
		{ 
			HANDLE hMem = GetClipboardData(CF_TEXT); 
 
			if (hMem == NULL) 
				return -1; 
 
			char *p = (char *)GlobalLock(hMem); 
 
			if (p == NULL) 
			{ 
				CloseClipboard(); 
				return -1; 
			} 
 
			GlobalUnlock(hMem); 
			CloseClipboard(); 
			return 0; 
		}//*/ 
		Copy(); 
		SetSel(GetWindowTextLength(), GetWindowTextLength()); 
	} 
	else 
	{/* 
		if (OpenClipboard()) 
		{ 
			HANDLE hMem = GetClipboardData(CF_TEXT); 
 
			if (hMem == NULL) 
				return -1; 
 
			char *p = (char *)GlobalLock(hMem); 
 
			if (p == NULL) 
			{ 
				CloseClipboard(); 
				return -1; 
			} 
 
			AppendText(p); 
			GlobalUnlock(hMem); 
			CloseClipboard(); 
		}//*/ 
 
		if (slave_sock == INVALID_SOCKET) 
		{ 
			MessageBox("连接不可用", "", MB_ICONERROR); 
			return 0; 
		} 
 
		SetSel(GetWindowTextLength(), GetWindowTextLength()); 
		Paste(); 
	} 
 
	return 0; 
} 
 
LRESULT CCmdEditCtrl::OnKeyDown(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& bHandled) 
{ 
	int nStart, nEnd; 
	char *p; 
 
	GetSel(nStart, nEnd); 
 
	switch ((TCHAR)wParam) 
	{ 
	case VK_UP: 
		p = GetPrevCmdRecord(); 
		SetSel(nCmdStartPos, GetWindowTextLength()); 
		ReplaceSel(p); 
		break; 
 
	case VK_DOWN: 
		p = GetNextCmdRecord(); 
		SetSel(nCmdStartPos, GetWindowTextLength()); 
		ReplaceSel(p); 
		break; 
 
	case VK_LEFT: 
		if (nStart <= nCmdStartPos) 
			break; 
		bHandled = FALSE; 
		break; 
 
	case VK_RIGHT: 
		bHandled = FALSE; 
		break; 
 
	case VK_DELETE: 
		if (nStart < nCmdStartPos) 
			break; 
		bHandled = FALSE; 
		break; 
 
	default: 
		bHandled = FALSE; 
		break; 
	} 
 
	return 0; 
} 
 
LRESULT CCmdEditCtrl::OnChar(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& bHandled) 
{ 
	if (slave_sock == INVALID_SOCKET) 
	{ 
		MessageBox("连接不可用", "", MB_ICONERROR); 
		return 0; 
	} 
 
	int ret, nStart, nEnd; 
	char *pch; 
	HLOCAL hText; 
	GetSel(nStart, nEnd); 
 
	switch ((TCHAR)wParam) 
	{ 
	case VK_RETURN: 
		AppendText("\x0d\x0a"); 
		hText = GetHandle(); 
		pch = (char *)LocalLock(hText) + nCmdStartPos; 
		AddCmdRecord(pch); 
 
		if (stricmp(pch, "cls\x0d\x0a") == 0) 
		{ 
			nCmdStartPos = 0; 
			ret = send(slave_sock, "\x0d\x0a", strlen("\x0d\x0a"), 0); 
		} 
		else 
		{ 
			ret = send(slave_sock, pch, strlen(pch), 0); 
		} 
 
		LocalUnlock(hText); 
		break; 
 
	case VK_BACK: 
		if (nStart <= nCmdStartPos) 
			break; 
		bHandled = FALSE; 
		break; 
 
	default: 
		if (nStart <= nCmdStartPos) 
		{ 
			int nTextEnd = GetWindowTextLength(); 
			SetSel(nTextEnd, nTextEnd); 
		} 
		bHandled = FALSE; 
		break; 
	} 
 
	return 0; 
} 
 
LRESULT CCmdEditCtrl::OnPaste(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/) 
{ 
	if (slave_sock == INVALID_SOCKET) 
	{ 
		MessageBox("连接不可用", "", MB_ICONERROR); 
		return 0; 
	} 
 
	if (OpenClipboard()) 
	{ 
		HANDLE hMem = GetClipboardData(CF_TEXT); 
 
		if (hMem == NULL) 
			return -1; 
 
		char *p = (char *)GlobalLock(hMem); 
 
		if (p == NULL) 
			return -1; 
 
		send(slave_sock, p, strlen(p), 0); 
 
		GlobalUnlock(hMem); 
		CloseClipboard(); 
		return 0; 
	} 
 
	return -1; 
} 
 
LRESULT CCmdEditCtrl::OnSocketRead(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/) 
{ 
	SOCKET slave_sock = (SOCKET)wParam; 
	int ret; 
	char buffer[200]; 
 
	ret = recv(slave_sock, buffer, 199, 0); 
 
	if (ret != SOCKET_ERROR) 
	{ 
		buffer[ret] = '\0'; 
		SetSel(nCmdStartPos, GetWindowTextLength()); 
		ReplaceSel(buffer); 
		nCmdStartPos = GetWindowTextLength(); 
	} 
 
	return 0; 
} 
 
BOOL CCmdEditCtrl::StartCmdEditor(SOCKET sock) 
{ 
	nCmdStartPos = 0; 
	slave_sock = sock; 
	LimitText(1000000); 
 
	return TRUE; 
}