⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 maindlg.cpp

📁 远程控制系统,可以实现局域网内进行远程控制计算机,很方便,并且是学习用的非常好的资料.
💻 CPP
📖 第 1 页 / 共 3 页
字号:
// maindlg.cpp : implementation of the CMainDlg class
//
/////////////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "resource.h"
#include "common.h"

#include "ntshell.h"
#include "aboutdlg.h"
#include "config.h"
#include "inputdlg.h"
#include "md5.h"
#include "maindlg.h"

extern USHORT LocalListenPort;

BOOL CMainDlg::PreTranslateMessage(MSG* pMsg)
{
	return IsDialogMessage(pMsg);
}

BOOL CMainDlg::OnIdle()
{
	return FALSE;
}

LRESULT CMainDlg::OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
{
	// center the dialog on the screen
	CenterWindow();

	m_host = NULL;
	m_nWaiting = 0;
	m_nSessionTotal = 0;
	CLocalConfig::LoadConfig();		//读取配置文件

	// set icons
	HICON hIcon = (HICON)::LoadImage(_Module.GetResourceInstance(), MAKEINTRESOURCE(IDR_MAINFRAME), 
		IMAGE_ICON, ::GetSystemMetrics(SM_CXICON), ::GetSystemMetrics(SM_CYICON), LR_DEFAULTCOLOR);
	SetIcon(hIcon, TRUE);
	HICON hIconSmall = (HICON)::LoadImage(_Module.GetResourceInstance(), MAKEINTRESOURCE(IDR_MAINFRAME), 
		IMAGE_ICON, ::GetSystemMetrics(SM_CXSMICON), ::GetSystemMetrics(SM_CYSMICON), LR_DEFAULTCOLOR);
	SetIcon(hIconSmall, FALSE);

	m_hWndList.Attach(GetDlgItem(IDC_HOSTLIST));
	m_hWndList.InsertColumn(0, "主机IP", LVCFMT_LEFT, 100, 0);
	m_hWndList.InsertColumn(1, "主机名", LVCFMT_LEFT, 120, 0);
	m_hWndList.InsertColumn(2, "连上时间", LVCFMT_LEFT, 60, 0);
	m_hWndList.InsertColumn(3, "状态", LVCFMT_LEFT, 80, 0);

	m_hWndStatusBar.Attach(GetDlgItem(IDC_STATUSBAR));

	DWORD dwStyle = m_hWndList.GetExtendedListViewStyle();
	dwStyle |= LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES | LVS_EX_HEADERDRAGDROP;
	m_hWndList.SetExtendedListViewStyle(dwStyle);

	OpenListenSock();	//打开服务端口

	SetTimer(WM_TIMER, 500);			//设置定时器用于检测连接是否超时

	// register object for message filtering and idle updates
	CMessageLoop* pLoop = _Module.GetMessageLoop();
	ATLASSERT(pLoop != NULL);
	pLoop->AddMessageFilter(this);
	pLoop->AddIdleHandler(this);

	UIAddChildWindowContainer(m_hWnd);

	return TRUE;
}

LRESULT CMainDlg::OnTimer(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
{
	for (int i = 0; i < m_nWaiting; i++)
	{
		if (GetTickCount() - connmgr[i].dwReqTime > 5000)	//连接超时检测
		{
			if (connmgr[i].funBack != NULL)
				connmgr[i].funBack(INVALID_SOCKET, connmgr[i].lpParam);
			else if (::IsWindow(connmgr[i].hAcceptWnd))
				::PostMessage(connmgr[i].hAcceptWnd, WM_CONNECT_TIMEOUT, INVALID_SOCKET, (LPARAM)connmgr[i].lpParam);
			connmgr[i] = connmgr[--m_nWaiting];
		}
	}

	return 0;
}

LRESULT CMainDlg::OnSockConnEvent(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/)
{
	SOCKET slave_sock = (SOCKET)wParam;
	struct sockaddr_in slave;
	int temp = 0, iAddrSize = sizeof(slave);
	CString message;

	if (WSAGETSELECTERROR(lParam))
	{
		closesocket(slave_sock);
		return 0;
	}

	switch (WSAGETSELECTEVENT(lParam))
	{
	case FD_ACCEPT:
		slave_sock = accept(m_ListenSock, (struct sockaddr *)&slave, &iAddrSize);
		WSAAsyncSelect(slave_sock, this->m_hWnd, WM_SOCKET_CONN, FD_READ | FD_WRITE | FD_CLOSE);
		message.Format("%s 连接到本机", inet_ntoa(slave.sin_addr));
		m_hWndStatusBar.SetWindowText(message);
		break;

	case FD_READ:
		recv(slave_sock, (char *)&temp, sizeof(temp), 0);

		switch (temp)
		{
		case CONN1_SLAVE_ASK:
			temp = CONN1_MASTER_ANSWER;
			send(slave_sock, (char *)&temp, sizeof(temp), 0);
			break;

		case CONN2_SLAVE_ASK:
			temp = CONN2_MASTER_ANSWER;
			send(slave_sock, (char *)&temp, sizeof(temp), 0);
			break;

		case CONN1_SLAVE_OK:
			AddHost(slave_sock, 0);		//添加到主机列表中
			break;

		case CONN2_SLAVE_OK:
			WSAAsyncSelect(slave_sock, m_hWnd, WM_SOCKET_CTRL, FD_READ | FD_CLOSE);
			SendRequest(slave_sock);
			break;

		case CONN3_SLAVE_OK:
			AddHost(slave_sock, 1);		//添加到主机列表中
			break;

		case CONN4_SLAVE_OK:
			WSAAsyncSelect(slave_sock, m_hWnd, WM_SOCKET_CTRL, FD_READ | FD_CLOSE);
			SendRequest(slave_sock);
			break;

		default:
			closesocket(slave_sock);
			break;
		}
		break;

	case FD_CLOSE:
		getpeername(slave_sock, (struct sockaddr *)&slave, &iAddrSize);
		message.Format("与 %s 的连接已关闭", inet_ntoa(slave.sin_addr));
		m_hWndStatusBar.SetWindowText(message);
		closesocket(slave_sock);
		break;
	}

	return 0;
}

LRESULT CMainDlg::OnSockCtrlEvent(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/)
{
	SOCKET slave_sock = (SOCKET)wParam;

	if (WSAGETSELECTERROR(lParam))
	{
		RemoveHost(slave_sock);
		return 0;
	}

	switch (WSAGETSELECTEVENT(lParam))
	{
	case FD_READ:
		TestCanRead(slave_sock);
		break;

	case FD_CLOSE:
		RemoveHost(slave_sock);
		break;
	}

	return 0;
}

void CMainDlg::TestCanRead(SOCKET s)
{
	PHOST_LIST_LINK p, p1;
	LV_FINDINFO FindInfo;
	struct sockaddr_in host;
	int iAddrSize = sizeof(host);
	CString msg;

	char *buf = SimplyRecvPack(s);

	if (buf == NULL)
		return;

	getpeername(s, (struct sockaddr *)&host, &iAddrSize);

	switch (*(ULONG *)buf)
	{
	case CONNECT_NEED_PWD:
		for (p = m_host; p != NULL; p = p->Next)
		{
			if (p->Sock == s)
				break;
		}

		if (p != NULL)
		{
			if (p->Password[0] != 0)
				p1 = p;
			else
			{
				for (p1 = m_host; p1 != NULL; p1 = p1->Next)
				{
					if (p1 != p && p->Address.S_un.S_addr == p1->Address.S_un.S_addr)
						break;
				}

				if (p1 == NULL)
					p1 = p;
			}

			SimplySendPack(s, (char *)p1->Password, sizeof(p1->Password));
			FindInfo.flags = LVFI_PARAM;
			FindInfo.lParam = (LPARAM)p;

			int nItem = m_hWndList.FindItem(&FindInfo, -1);

			if (nItem != -1)
			{
				m_hWndList.SetItemText(nItem, 3, "需要密码");	//记录控制连接状态
			}
		}
		else
		{
			for (p = m_host; p != NULL; p = p->Next)
			{
				if (p->Address.S_un.S_addr == host.sin_addr.S_un.S_addr && p->Password[0] != 0)
					break;
			}

			if (p != NULL)
				SimplySendPack(s, (char *)p->Password, sizeof(p->Password));
			else
				SimplySendPack(s, "", 1);		//无可用的密码
		}

		msg.Format("主机 %s 要求身份认证", inet_ntoa(host.sin_addr));
		m_hWndStatusBar.SetWindowText(msg);
		delete [] buf;
		return;

	case CONNECT_INVALID_PWD:
		for (p = m_host; p != NULL; p = p->Next)
		{
			if (p->Sock == s)
			{
				p->Lock = LOCKED_STATUS_NEEDPWD;
				break;
			}
		}

		msg.Format("用于连接 %s 的密码错误", inet_ntoa(host.sin_addr));
		m_hWndStatusBar.SetWindowText(msg);
		delete [] buf;
		return;

	case CONTROL_QUERYINFO:
		msg.Format("与 %s 建立通信", inet_ntoa(host.sin_addr));
		m_hWndStatusBar.SetWindowText(msg);
		break;

	default:
		msg.Format("与 %s 建立通信", inet_ntoa(host.sin_addr));
		m_hWndStatusBar.SetWindowText(msg);
		WSAAsyncSelect(s, m_hWnd, 0, 0);
		CompleteRequest(s, *(ULONG *)buf);
		delete [] buf;
		return;
	}

	for (p = m_host; p != NULL; p = p->Next)
	{
		if (p->Sock == s)
			break;
	}

	if (p == NULL)
		return;

	if (p->Lock == LOCKED_STATUS_NONE)				//判断是否该处理收到的数据
		return;

	if (p->Lock == LOCKED_STATUS_QUERY)
	{
		//PNTSHELL_RESULTSET rs1 = (PNTSHELL_RESULTSET)buf;
		//WriteHostInformation(&(p->Info), rs1->ResultSet);
		WriteHostInformation(&(p->Info), buf + sizeof(ULONG));
	}

	FindInfo.flags = LVFI_PARAM;
	FindInfo.lParam = (LPARAM)p;

	int nItem = m_hWndList.FindItem(&FindInfo, -1);

	if (nItem != -1)
	{
		char *pHostName = "";

		if (p->Info->OffsetOfComputerName != 0)
		{
			pHostName = (char *)(p->Info) + p->Info->OffsetOfComputerName;
		}

		m_hWndList.SetItemText(nItem, 1, pHostName);	//记录主机名

		if (p->Info->ServerVersion != NTSHELL_VERSION)
			m_hWndList.SetItemText(nItem, 3, "版本不支持");	//记录控制连接状态
		else
		{
			if (p->Type == 0)
				m_hWndList.SetItemText(nItem, 3, "就绪");	//记录控制连接状态
			else
				m_hWndList.SetItemText(nItem, 3, "静态主机");
		}

		if (p->Info->OffsetOfSystemName != 0)
			SetDlgItemText(IDC_SYSTEMNAME, (char *)(p->Info) + p->Info->OffsetOfSystemName);

		if (p->Info->OffsetOfMemorySize != 0)
			SetDlgItemText(IDC_PHYSMEMORYSIZE, (char *)(p->Info) + p->Info->OffsetOfMemorySize);

		if (p->Info->OffsetOfProcessorName != 0)
			SetDlgItemText(IDC_PROCESSORNAME, (char *)(p->Info) + p->Info->OffsetOfProcessorName);

		if (p->Info->OffsetOfCurrentUserName != 0)
			SetDlgItemText(IDC_CURRENTUSER, (char *)(p->Info) + p->Info->OffsetOfCurrentUserName);

		if (p->Info->OffsetOfRootDirectory != 0)
			SetDlgItemText(IDC_SYSTEMROOT, (char *)(p->Info) + p->Info->OffsetOfRootDirectory);
	}

	if (p->Info->ServerVersion != NTSHELL_VERSION)
		p->Lock = LOCKED_STATUS_NONSUPPORT;
	else
		p->Lock = LOCKED_STATUS_NONE;

	delete [] buf;
}

void CMainDlg::WriteHostInformation(PHOST_INFORMATION *info, PVOID infoArray)
{
	POSVERSIONINFOEX posvi;
	int buflen = 0x1000, pointer = sizeof(HOST_INFORMATION);
	char *buf = new char[buflen];
	PQUERY_RESULTSET rs = (PQUERY_RESULTSET)infoArray;

	if (buf == NULL)
		return;

	*info = (PHOST_INFORMATION)buf;
	ZeroMemory(*info, sizeof(HOST_INFORMATION));

	for (;;)
	{
		switch (rs->InformationClass)
		{
		case QUERY_PROCESSORNAME:
			(*info)->OffsetOfProcessorName = pointer;
			{
				char *p = (char *)(rs->Information);
				for (int i = 0; i < rs->InformationLength && *p == ' '; i++, p++);
				memcpy(buf + pointer, p, rs->InformationLength - i);
				pointer += rs->InformationLength - i;
			}
			break;
		case QUERY_PROCESSORMHZ:
			(*info)->OffsetOfProcessorMHZ = pointer;
			memcpy(buf + pointer, rs->Information, rs->InformationLength);
			pointer += rs->InformationLength;
			break;
		case QUERY_PHYSMEMORYSIZE:
			(*info)->OffsetOfMemorySize = pointer;
			wsprintf(buf + pointer, "%dK", *((DWORD *)(rs->Information)) / 1024);
			pointer += strlen(buf + pointer) + 1;
			break;
		case QUERY_SYSTEMVERSION:
			(*info)->OffsetOfSystemName = pointer;
			posvi = (POSVERSIONINFOEX)(rs->Information);
			switch (posvi->dwBuildNumber)
			{
			case 2195:
				strcpy(buf + pointer, "Windows 2000");
				break;
			case 2600:
				strcpy(buf + pointer, "Windows XP");
				break;
			case 3790:
				strcpy(buf + pointer, "Windows 2003");
				break;
			default:
				strcpy(buf + pointer, "Unknow");
				break;
			}
			pointer += strlen(buf + pointer) + 1;
			break;
		case QUERY_COMPUTERNAME:
			(*info)->OffsetOfComputerName = pointer;
			memcpy(buf + pointer, rs->Information, rs->InformationLength);
			pointer += rs->InformationLength;
			break;
		case QUERY_CURRENTUSERNAME:
			(*info)->OffsetOfCurrentUserName = pointer;
			memcpy(buf + pointer, rs->Information, rs->InformationLength);
			pointer += rs->InformationLength;
			break;
		case QUERY_SYSTEMROOT:
			(*info)->OffsetOfRootDirectory = pointer;
			memcpy(buf + pointer, rs->Information, rs->InformationLength);
			pointer += rs->InformationLength;
			break;
		case QUERY_NTSHELLVERSION:

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -