📄 maindlg.cpp
字号:
// 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 + -