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

📄 tcpservicespage.cpp

📁 能够通过输入IP地址扫描端口
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/*
	TcpServicesPage.cpp
	Luca Piergentili, 14/07/99
	lpiergentili@yahoo.com
	http://www.geocities.com/lpiergentili/
*/
#include "env.h"
#include "pragma.h"
#include "TcpServicesPage.h"

IMPLEMENT_DYNCREATE(CServicesPage,CPropertyPageDialog)

BEGIN_MESSAGE_MAP(CServicesPage,CPropertyPageDialog)
	// bottoni
	ON_BN_CLICKED(IDC_BUTTON_SERVICES,OnButtonServices)

	// menu popup
	ON_COMMAND(IDM_SERVICES_ADDPORT,OnServicesPopupMenuAddPort)
	ON_COMMAND(IDM_SERVICES_LOADALLPORTS,OnServicesPopupMenuLoadAllPorts)
	ON_COMMAND(IDM_SERVICES_SETSTARTPORT,OnServicesPopupMenuSetStartPort)
	ON_COMMAND(IDM_SERVICES_SETENDPORT,OnServicesPopupMenuSetEndPort)
	ON_COMMAND(IDM_SERVICES_CLEARPORTS,OnServicesPopupMenuClearPorts)
	ON_COMMAND(IDM_SERVICES_ADDSERVICE,OnServicesPopupMenuAddService)
	ON_COMMAND(IDM_SERVICES_REMOVESERVICE,OnServicesPopupMenuRemoveService)
	ON_COMMAND(IDM_SERVICES_SAVETOREGISTRY,OnServicesPopupMenuSaveToRegistry)
	ON_COMMAND(IDM_SERVICES_LOADFROMREGISTRY,OnServicesPopupMenuLoadFromRegistry)
	ON_COMMAND(IDM_SERVICES_SAVETODATABASE,OnServicesPopupMenuSaveToDatabase)
	ON_COMMAND(IDM_SERVICES_LOADFROMDATABASE,OnServicesPopupMenuLoadFromDatabase)
END_MESSAGE_MAP()

/*
	DoDataExchange()
*/
void CServicesPage::DoDataExchange(CDataExchange* pDX)
{
	CPropertyPage::DoDataExchange(pDX);

	DDX_Control(pDX,IDC_LIST_SERVICES,m_wndServicesList);
}

/*
	CServicesPage()
*/
CServicesPage::CServicesPage() : CPropertyPageDialog(IDD_PAGE_SERVICES)
{
	m_nMaxDatabaseEntry = 0;
	m_pServiceList = NULL;
	m_pConfig = NULL;
	m_strServicesDatabase = "";

	SetPropertyPageOkButton("&Reload");
}

/*
	~CServicesPage()
*/
CServicesPage::~CServicesPage()
{
	if(m_pServiceList)
		delete m_pServiceList,m_pServiceList = NULL;
}

/*
	OnInitDialog()

	Inizializzazione del dialogo.
	Rimappa la funzione base per ricavare la lista dei servizi dal database.
*/
BOOL CServicesPage::OnInitDialog(void)
{
	// deve chiamare il gestore originale
	CPropertyPageDialog::OnInitDialog();

	// numero max di nomi database per il combo
	m_nMaxDatabaseEntry = m_pConfig->GetNumber(TCPSCAN_OPTIONS_KEY,TCPSCAN_MAX_DATABASEENTRY_KEY);
	
	// carica il nome del database presente nella configurazione (se non e' stato specificato nessun nome ricava imposta su quello di default)
	char* database = (char*)m_pConfig->GetString(TCPSCAN_SERVICES_KEY,TCPSCAN_DATABASE_KEY);
	if(strcmp(database,"")==0)
	{
		DWORD dwVersion = ::GetVersion();
		DWORD dwWindowsMajorVersion = (DWORD)(LOBYTE(LOWORD(dwVersion)));
		char szWindowsDir[_MAX_PATH+1];

		::GetWindowsDirectory(szWindowsDir,sizeof(szWindowsDir));

		// Windows NT
		if(dwVersion < 0x80000000)
			m_strServicesDatabase.Format("%s\\system32\\drivers\\etc\\services",szWindowsDir);
		// Win32s
		else if(dwWindowsMajorVersion < 4)
			m_strServicesDatabase = "";
		// Windows 95
		else
			m_strServicesDatabase.Format("%s\\services",szWindowsDir);
	}
	else
		m_strServicesDatabase.Format("%s",database);

	// imposta il testo del combo col nome del database, aggiungendolo come primo elemento
	CComboBox* pComboBox = (CComboBox*)GetDlgItem(IDC_COMBO_SERVICES);
	pComboBox->SetWindowText(m_strServicesDatabase);
	UpdateData(FALSE);
	pComboBox->AddString(m_strServicesDatabase);

	// inserisce nel combo gli eventuali nomi files presenti
	char* p;
	char szKey[REGKEY_MAX_KEY_NAME+1];
	
	for(int i = 0; i < m_nMaxDatabaseEntry; i++)
	{
		wsprintf(szKey,"%s%d",TCPSCAN_DATABASEFILE_KEY,i);
		if(strcmp((p = (char*)m_pConfig->GetString(TCPSCAN_SERVICES_KEY,szKey)),"")!=0)
		{
			if(pComboBox->FindStringExact(-1,p)==CB_ERR)
				pComboBox->AddString(p);
		}
		else
			break;
	}
	
	pComboBox->SetCurSel(0);

	// carica la lista dei servizi
	LoadServices(SERVICES_FROM_DATABASE);

	return(FALSE);
}

/*
	OnSetActive()

	Attivazione della pagina.
	Rimappa la funzione base per cambiare il testo del bottone IDOK dello sheet ed impostare i valore
	del combo.
*/
BOOL CServicesPage::OnSetActive(void)
{
	// deve chiamare il gestore originale
	CPropertyPageDialog::OnSetActive();
	
	// modifica il testo del bottone IDOK dello sheet
	SetPropertySheetOkButton(GetPropertyPageOkButton());

	if(LookForBusyPages(IDD_PAGE_SERVICES))
		DisablePropertySheetOkButton();

	// imposta il testo del combo col nome del database
	CComboBox* pComboBox = (CComboBox*)GetDlgItem(IDC_COMBO_SERVICES);
	pComboBox->SetWindowText(m_strServicesDatabase);
	UpdateData(FALSE);

	return(TRUE);
}

/*
	OnKillActive()

	Chiamata (da MFC) ogni volta che la pagina perde il focus (Ctrl+Tab o click sul Tab di una pagina
	differente dello sheet). Non viene chiamata alla chiusura del dialogo.
*/
BOOL CServicesPage::OnKillActive(void)
{
	// deve chiamare il gestore originale
	CPropertyPageDialog::OnKillActive();

	return(TRUE);
}

/*
	OnKillSheet()

	Chiusura del dialogo.
	Rimappa la funzione base per salvare la configurazione.
*/
void CServicesPage::OnKillSheet(void)
{
	if(IsWindow(this->m_hWnd))
	{
		// aggiorna la configurazione prima di uscire
		// UpdateData(TRUE) non serve perche' non fa riferimento a un campo ma alla lista
		m_pConfig->UpdateNumber(TCPSCAN_OPTIONS_KEY,TCPSCAN_SERVICES_SERVICE_COLSIZE_KEY,m_wndServicesList.GetColWidth(0));
		m_pConfig->UpdateNumber(TCPSCAN_OPTIONS_KEY,TCPSCAN_SERVICES_PORT_COLSIZE_KEY,m_wndServicesList.GetColWidth(1));
		m_pConfig->UpdateNumber(TCPSCAN_OPTIONS_KEY,TCPSCAN_SERVICES_PROTOCOL_COLSIZE_KEY,m_wndServicesList.GetColWidth(2));
		m_pConfig->UpdateNumber(TCPSCAN_OPTIONS_KEY,TCPSCAN_SERVICES_COMMENT_COLSIZE_KEY,m_wndServicesList.GetColWidth(3));
	}
}

/*
	OnOk()

	Carica la lista dei servizi.
	Chiamata dallo sheet per il click sul bottone (IDOK).
*/
void CServicesPage::OnOk(void)
{
	EnterPageBusyState(IDD_PAGE_SERVICES);

	LoadServices(SERVICES_FROM_DATABASE);

	LeavePageBusyState(IDD_PAGE_SERVICES);
}

/*
	OnCancel()

	Carica la lista dei servizi.
	Chiamata dallo sheet per il click sul bottone (IDCANCEL).
*/
void CServicesPage::OnCancel(void)
{
	LeavePageBusyState(IDD_PAGE_SERVICES);
}

/*
	OnButtonServices()

	Seleziona il database dei servizi.
*/
void CServicesPage::OnButtonServices(void)
{
	CFileDialog dlg(TRUE,
				NULL,
				NULL,
				OFN_FILEMUSTEXIST|OFN_HIDEREADONLY,
				"All Files (*.*)|*.*|TXT Files (*.txt)|*.txt||",
				AfxGetMainWnd()
				);

	// selezione del database
	if(dlg.DoModal()==IDOK)
	{
		m_strServicesDatabase.Format("%s",dlg.m_ofn.lpstrFile);

		// imposta il testo del combo col nome del database
		CComboBox* pComboBox = (CComboBox*)GetDlgItem(IDC_COMBO_SERVICES);
		pComboBox->SetWindowText(m_strServicesDatabase);
		UpdateData(FALSE);
		
		// carica la lista dei servizi
		LoadServices(SERVICES_FROM_DATABASE);
	}
}
/*
	OnServicesPopupMenuAddPort()

	Aggiunge il numero della porta selezionata alla lista per lo scanning.
*/
void CServicesPage::OnServicesPopupMenuAddPort(void)
{
	int nTot = m_wndServicesList.GetItemCount();
	
	// controlla che la lista non sia vuota
	if(nTot > 0)
	{
		// ricava i puntatori (classe) per accedere alla pagina dello scanning
		CScanPage* pScanPage = NULL;
		PROPERTYPAGE* p;
		if((p = FindPage(IDD_PAGE_SCAN))!=(PROPERTYPAGE*)NULL)
			pScanPage = (CScanPage*)p->page;

		// e' riuscito ad ottenere il puntatore alla pagina dello scanning
		if(pScanPage)
		{
			char szPort[16];

			// ricava gli elementi selezionati
			for(int i = 0; i < nTot; i++)
			{
				// se l'elemento e' stato selezionato
				if(m_wndServicesList.GetItemSelection(i))
				{
					// azzera la selezione
					m_wndServicesList.SetItemSelection(i,FALSE);

					// ricava il numero della porta relativo all'elemento
					m_wndServicesList.GetItemText(i,1,szPort,sizeof(szPort)-1);
					
					// aggiunge il numero della porta alla lista
					if(pScanPage->m_strPortList.GetLength()+strlen(szPort)+2 < MAX_PORTLIST_STRING)
					{
						if(pScanPage->m_strPortList=="0")
							pScanPage->m_strPortList.Empty();

						if(!pScanPage->m_strPortList.IsEmpty())
							pScanPage->m_strPortList += ", ";

						pScanPage->m_strPortList += szPort;

						// aggiorna i campi della pagina
						pScanPage->m_nPortFlag = pScanPage->m_nPortList = 0;

						// fa in modo che venga chiamato il codice di inizializzazione della pagina se 
						// questa non e' stata ancora visualizzata
						if(!pScanPage->Dirty())
							ActivatePage(IDD_PAGE_SCAN);

						pScanPage->UpdateData(FALSE);
						pScanPage->OnRadioButtonPortList();
					}
					else
					{
						AfxMessageBox("Unable to add the port number to the list (maximum length reached).",MB_ICONWARNING);
						break;
					}
				}
			}
		}
	}
}

/*
	OnServicesPopupMenuLoadAllPorts()
	
	Aggiunge tutti i numeri delle porte alla lista per lo scanning.
*/
void CServicesPage::OnServicesPopupMenuLoadAllPorts(void)
{
	int nTot = m_wndServicesList.GetItemCount();

	// controlla che la lista non sia vuota
	if(nTot > 0)
	{
		// ricava i puntatori (classe) per accedere alla pagina dello scanning
		CScanPage* pScanPage = NULL;
		PROPERTYPAGE* p;
		if((p = FindPage(IDD_PAGE_SCAN))!=(PROPERTYPAGE*)NULL)
			pScanPage = (CScanPage*)p->page;

		// e' riuscito ad ottenere il puntatore alla pagina dello scanning
		if(pScanPage)
		{
			int* nPortArray = new int[nTot];

			if(nPortArray)
			{
				char szPort[16];

				// per ogni elemento della lista
				for(int i = 0; i < nTot; i++)
				{
					// ricava il numero della porta
					m_wndServicesList.GetItemText(i,1,szPort,sizeof(szPort)-1);

					// aggiunge il numero della porta all'array
					nPortArray[i] = (unsigned int)atol(szPort);
				}
				
				if(i > 0)
				{
					CString strPort;
					pScanPage->m_strPortList.Empty();
					pScanPage->m_strPortList.Format("%d",nPortArray[0]);
					
					// aggiunge il numero della porta alla lista
					for(i = 1; i < nTot; i++)
					{
						if(pScanPage->m_strPortList.GetLength()+7 < MAX_PORTLIST_STRING)
						{
							strPort.Format(", %d",nPortArray[i]);
							pScanPage->m_strPortList += strPort;
						}
						else
						{
							AfxMessageBox("Unable to add the port number to the list (maximum length reached).",MB_ICONWARNING);
							break;
						}
					}

					// aggiorna i campi della pagina
					pScanPage->m_nPortFlag = pScanPage->m_nPortList = 0;

					// fa in modo che venga chiamato il codice di inizializzazione della pagina se 
					// questa non e' stata ancora visualizzata
					if(!pScanPage->Dirty())
						ActivatePage(IDD_PAGE_SCAN);

					pScanPage->UpdateData(FALSE);
					pScanPage->OnRadioButtonPortList();
				}

				delete [] nPortArray;
			}
		}
	}
}

/*
	OnServicesPopupMenuSetStartPort()

	Imposta la lista per lo scanning con il numero della porta selezionata come iniziale.
*/
void CServicesPage::OnServicesPopupMenuSetStartPort(void)
{
	int nItem = m_wndServicesList.GetCurrentItem();

	// ricava l'elemento corrente della lista
	if(nItem >= 0)
	{
		// ricava i puntatori (classe) per accedere alla pagina dello scanning
		CScanPage* pScanPage = NULL;
		PROPERTYPAGE* p;
		if((p = FindPage(IDD_PAGE_SCAN))!=(PROPERTYPAGE*)NULL)
			pScanPage = (CScanPage*)p->page;

		// e' riuscito ad ottenere il puntatore alla pagina dello scanning
		if(pScanPage)
		{
			char szPort[16];

			// ricava il numero della porta relativo
			m_wndServicesList.GetItemText(nItem,1,szPort,sizeof(szPort)-1);
			
			// imposta la porta iniziale
			if((unsigned int)atol(szPort) <= pScanPage->m_nEndPort)
			{
				// aggiorna i campi della pagina
				pScanPage->m_nStartPort = (unsigned int)atol(szPort);
				pScanPage->m_nPortFlag = pScanPage->m_nPortList = 1;

				// fa in modo che venga chiamato il codice di inizializzazione della pagina se 
				// questa non e' stata ancora visualizzata
				if(!pScanPage->Dirty())
					ActivatePage(IDD_PAGE_SCAN);

				pScanPage->UpdateData(FALSE);
				pScanPage->OnRadioButtonPortRange();
			}
			else
				AfxMessageBox("The start port must be smaller than the end port.",MB_ICONWARNING);
		}
	}
}

/*
	OnServicesPopupMenuSetEndPort()
	
	Imposta la lista per lo scanning con il numero della porta selezionata come finale.
*/
void CServicesPage::OnServicesPopupMenuSetEndPort(void)
{
	int nItem = m_wndServicesList.GetCurrentItem();

	// ricava l'elemento corrente della lista
	if(nItem >= 0)
	{
		// ricava i puntatori (classe) per accedere alla pagina dello scanning
		CScanPage* pScanPage = NULL;
		PROPERTYPAGE* p;
		if((p = FindPage(IDD_PAGE_SCAN))!=(PROPERTYPAGE*)NULL)
			pScanPage = (CScanPage*)p->page;

		// e' riuscito ad ottenere il puntatore alla pagina dello scanning
		if(pScanPage)
		{
			char szPort[16];
			
			// ricava il numero della porta relativo
			m_wndServicesList.GetItemText(nItem,1,szPort,sizeof(szPort)-1);
			
			// imposta la porta finale
			if((unsigned int)atol(szPort) >= pScanPage->m_nStartPort)
			{
				// aggiorna i campi della pagina
				pScanPage->m_nEndPort  = (unsigned int)atol(szPort);
				pScanPage->m_nPortFlag = pScanPage->m_nPortList = 1;

				// fa in modo che venga chiamato il codice di inizializzazione della pagina se 
				// questa non e' stata ancora visualizzata
				if(!pScanPage->Dirty())
					ActivatePage(IDD_PAGE_SCAN);

				pScanPage->UpdateData(FALSE);
				pScanPage->OnRadioButtonPortRange();
			}
			else
				AfxMessageBox("The end port must be greater than the start port.",MB_ICONWARNING);
		}
	}
}

/*
	OnServicesPopupMenuClearPorts()
	
	Azzera i numeri di porte (lista/range) correnti.
*/
void CServicesPage::OnServicesPopupMenuClearPorts(void)
{
	// ricava i puntatori (classe) per accedere alla pagina dello scanning
	CScanPage* pScanPage = NULL;
	PROPERTYPAGE* p;
	if((p = FindPage(IDD_PAGE_SCAN))!=(PROPERTYPAGE*)NULL)
		pScanPage = (CScanPage*)p->page;

	// e' riuscito ad ottenere il puntatore alla pagina dello scanning
	if(pScanPage)
	{
		// fa in modo che venga chiamato il codice di inizializzazione della pagina se 
		// questa non e' stata ancora visualizzata
		if(!pScanPage->Dirty())
			ActivatePage(IDD_PAGE_SCAN);

		pScanPage->OnScanPopupMenuClearPorts();
	}
}

/*
	OnServicesPopupMenuAddService()
	
	Aggiunge un servizio alla lista dei servizi.
*/
void CServicesPage::OnServicesPopupMenuAddService(void)
{
	AddService();
}

/*
	OnServicesPopupMenuRemoveService()
	
	Rimuove uno o piu' servizi dalla lista dei servizi.
*/
void CServicesPage::OnServicesPopupMenuRemoveService(void)
{
	RemoveService();
}

/*
	OnServicesPopupMenuSaveToRegistry()
	
	Salva la lista dei servizi nel registro.
*/
void CServicesPage::OnServicesPopupMenuSaveToRegistry(void)
{
	if(SaveServices(SERVICES_FROM_REGISTRY))
		AfxMessageBox("The services list has been saved into the registry.",MB_ICONINFORMATION);
	else
		AfxMessageBox("Unable to save the services list into the registry.",MB_ICONWARNING);
}

/*
	OnServicesPopupMenuLoadFromRegistry()
	
	Carica la lista dei servizi dal registro.
*/
void CServicesPage::OnServicesPopupMenuLoadFromRegistry(void)
{
	if(!LoadServices(SERVICES_FROM_REGISTRY))
		AfxMessageBox("Unable to load services from the registry.",MB_ICONWARNING);
}

/*
	OnServicesPopupMenuSaveToDatabase()
	
	Salva la lista dei servizi nel database.
*/
void CServicesPage::OnServicesPopupMenuSaveToDatabase(void)
{
	if(SaveServices(SERVICES_FROM_DATABASE))
		AfxMessageBox("The services list has been saved into the local database.",MB_ICONINFORMATION);
	else

⌨️ 快捷键说明

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