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