windows-nt/Source/XPSP1/NT/admin/pchealth/sysinfo/msconfig/exe/bootadv.h
2020-09-26 16:20:57 +08:00

534 lines
16 KiB
C++

// bootadv.h : Declaration of the CBootIniAdvancedDlg
#ifndef __BOOTINIADVANCEDDLG_H_
#define __BOOTINIADVANCEDDLG_H_
#include "resource.h" // main symbols
#include <atlhost.h>
#include <math.h>
#define MINBOOTMB 64 // from SkIn (from MSDN, 8MB is the minimum for /MAXMEM)
#define MIN_1394_CHANNEL 1
#define MAX_1394_CHANNEL 62
/////////////////////////////////////////////////////////////////////////////
// CBootIniAdvancedDlg
class CBootIniAdvancedDlg :
public CAxDialogImpl<CBootIniAdvancedDlg>
{
public:
CBootIniAdvancedDlg()
{
}
~CBootIniAdvancedDlg()
{
}
enum { IDD = IDD_BOOTINIADVANCEDDLG };
BEGIN_MSG_MAP(CBootIniAdvancedDlg)
MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog)
COMMAND_ID_HANDLER(IDOK, OnOK)
COMMAND_ID_HANDLER(IDCANCEL, OnCancel)
COMMAND_HANDLER(IDC_BIABAUDRATE, BN_CLICKED, OnClickedBaudRateCheck)
COMMAND_HANDLER(IDC_BIADEBUG, BN_CLICKED, OnClickedDebugCheck)
COMMAND_HANDLER(IDC_BIADEBUGPORT, BN_CLICKED, OnClickedDebugPortCheck)
COMMAND_HANDLER(IDC_BIAMAXMEM, BN_CLICKED, OnClickedMaxMemCheck)
COMMAND_HANDLER(IDC_BIANUMPROC, BN_CLICKED, OnClickedNumProcCheck)
NOTIFY_HANDLER(IDC_SPINMAXMEM, UDN_DELTAPOS, OnDeltaSpinMaxMem)
COMMAND_HANDLER(IDC_EDITMAXMEM, EN_KILLFOCUS, OnKillFocusEditMaxMem)
COMMAND_HANDLER(IDC_COMBOCOMPORT, CBN_SELCHANGE, OnSelChangeComboComPort)
COMMAND_HANDLER(IDC_BIACHANNEL, BN_CLICKED, OnClickedBIAChannel)
NOTIFY_HANDLER(IDC_SPINCHANNEL, UDN_DELTAPOS, OnDeltaSpinChannel)
COMMAND_HANDLER(IDC_EDITCHANNEL, EN_KILLFOCUS, OnKillFocusChannel)
END_MSG_MAP()
// Handler prototypes:
// LRESULT MessageHandler(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
// LRESULT CommandHandler(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled);
// LRESULT NotifyHandler(int idCtrl, LPNMHDR pnmh, BOOL& bHandled);
//-------------------------------------------------------------------------
// Launch the advanced option dialog for the specified boot.ini line.
// Modifies the string passed in if appropriate, returns TRUE if the user
// made modifications, FALSE otherwise.
//-------------------------------------------------------------------------
BOOL ShowAdvancedOptions(CString & strIniLine)
{
m_strWorkingLine = strIniLine;
BOOL fReturn = (DoModal() == IDOK);
if (fReturn)
strIniLine = m_strWorkingLine;
return fReturn;
}
LRESULT OnInitDialog(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
// Initialize the drop down list for the number of processors available.
SYSTEM_INFO si;
::GetSystemInfo(&si);
CString strItem;
for (DWORD dwProc = 1; dwProc <= si.dwNumberOfProcessors; dwProc++)
{
strItem.Format(_T("%d"), dwProc);
::SendMessage(GetDlgItem(IDC_COMBOPROCS), CB_ADDSTRING, 0, (LPARAM)(LPCTSTR)strItem);
}
// Initialize the drop down list for the number of COM ports available.
::SendMessage(GetDlgItem(IDC_COMBOCOMPORT), CB_ADDSTRING, 0, (LPARAM)_T("COM1:"));
::SendMessage(GetDlgItem(IDC_COMBOCOMPORT), CB_ADDSTRING, 0, (LPARAM)_T("COM2:"));
::SendMessage(GetDlgItem(IDC_COMBOCOMPORT), CB_ADDSTRING, 0, (LPARAM)_T("COM3:"));
::SendMessage(GetDlgItem(IDC_COMBOCOMPORT), CB_ADDSTRING, 0, (LPARAM)_T("COM4:"));
::SendMessage(GetDlgItem(IDC_COMBOCOMPORT), CB_ADDSTRING, 0, (LPARAM)_T("1394"));
// Initialize the drop down list for the available baud rates.
::SendMessage(GetDlgItem(IDC_COMBOBAUD), CB_ADDSTRING, 0, (LPARAM)_T("300"));
::SendMessage(GetDlgItem(IDC_COMBOBAUD), CB_ADDSTRING, 0, (LPARAM)_T("1200"));
::SendMessage(GetDlgItem(IDC_COMBOBAUD), CB_ADDSTRING, 0, (LPARAM)_T("2400"));
::SendMessage(GetDlgItem(IDC_COMBOBAUD), CB_ADDSTRING, 0, (LPARAM)_T("4800"));
::SendMessage(GetDlgItem(IDC_COMBOBAUD), CB_ADDSTRING, 0, (LPARAM)_T("9600"));
::SendMessage(GetDlgItem(IDC_COMBOBAUD), CB_ADDSTRING, 0, (LPARAM)_T("19200"));
::SendMessage(GetDlgItem(IDC_COMBOBAUD), CB_ADDSTRING, 0, (LPARAM)_T("38400"));
::SendMessage(GetDlgItem(IDC_COMBOBAUD), CB_ADDSTRING, 0, (LPARAM)_T("57600"));
::SendMessage(GetDlgItem(IDC_COMBOBAUD), CB_ADDSTRING, 0, (LPARAM)_T("115200"));
// Get the maximum value for the /MAXMEM spinner.
MEMORYSTATUS ms;
GlobalMemoryStatus(&ms);
m_iMaxMB = (int)ceil((double)ms.dwTotalPhys / (1024.0 * 1024.0));
// Set the controls of the dialog based on the line we're editing.
SetDlgControlsToString();
SetDlgControlState();
return 1; // Let the system set the focus
}
LRESULT OnOK(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
{
SetStringToDlgControls();
#ifdef DEBUG
::AfxMessageBox(m_strWorkingLine);
#endif
EndDialog(wID);
return 0;
}
LRESULT OnCancel(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
{
EndDialog(wID);
return 0;
}
//-------------------------------------------------------------------------
// Set the states of the controls in the dialog (based on the values in
// the other controls).
//-------------------------------------------------------------------------
void SetDlgControlState()
{
BOOL fMaxMem = (BST_CHECKED == IsDlgButtonChecked(IDC_BIAMAXMEM));
::EnableWindow(GetDlgItem(IDC_EDITMAXMEM), fMaxMem);
::EnableWindow(GetDlgItem(IDC_SPINMAXMEM), fMaxMem);
BOOL fNumProc = (BST_CHECKED == IsDlgButtonChecked(IDC_BIANUMPROC));
::EnableWindow(GetDlgItem(IDC_COMBOPROCS), fNumProc);
BOOL fDebug = (BST_CHECKED == IsDlgButtonChecked(IDC_BIADEBUG));
::EnableWindow(GetDlgItem(IDC_BIADEBUGPORT), fDebug);
BOOL fDebugPort = (BST_CHECKED == IsDlgButtonChecked(IDC_BIADEBUGPORT));
::EnableWindow(GetDlgItem(IDC_COMBOCOMPORT), fDebug && fDebugPort);
TCHAR szTemp[MAX_PATH];
BOOL fFirewire = FALSE;
BOOL fCOMPort = FALSE;
if (GetDlgItemText(IDC_COMBOCOMPORT, szTemp, MAX_PATH))
{
if (_tcscmp(szTemp, _T("1394")) == 0)
fFirewire = TRUE;
else if (szTemp[0] == _T('C'))
fCOMPort = TRUE;
}
::EnableWindow(GetDlgItem(IDC_BIABAUDRATE), fDebug && fDebugPort && fCOMPort);
::EnableWindow(GetDlgItem(IDC_BIACHANNEL), fDebug && fDebugPort && fFirewire);
BOOL fDebugRate = (BST_CHECKED == IsDlgButtonChecked(IDC_BIABAUDRATE));
::EnableWindow(GetDlgItem(IDC_COMBOBAUD), fDebug && fDebugRate && !fFirewire);
BOOL fDebugChannel = (BST_CHECKED == IsDlgButtonChecked(IDC_BIACHANNEL));
::EnableWindow(GetDlgItem(IDC_EDITCHANNEL), fDebug && fDebugChannel && fFirewire);
::EnableWindow(GetDlgItem(IDC_SPINCHANNEL), fDebug && fDebugChannel && fFirewire);
}
//-------------------------------------------------------------------------
// Sets the value of a combo box to the value in a string.
//-------------------------------------------------------------------------
void SetComboBox(LPCTSTR szLine, LPCTSTR szFlag, LPCTSTR szValidChars, UINT uiCB)
{
CString strLine(szLine);
int i = strLine.Find(szFlag);
if (i != -1)
{
CString strWorking(strLine.Mid(i));
strWorking.TrimLeft(szFlag);
strWorking.TrimLeft(_T(" ="));
strWorking = strWorking.SpanIncluding(szValidChars);
if (CB_ERR == ::SendMessage(GetDlgItem(uiCB), CB_SELECTSTRING, -1, (LPARAM)(LPCTSTR)strWorking))
{
LRESULT lIndex = ::SendMessage(GetDlgItem(uiCB), CB_ADDSTRING, 0, (LPARAM)(LPCTSTR)strWorking);
if (lIndex != CB_ERR)
::SendMessage(GetDlgItem(uiCB), CB_SETCURSEL, (WPARAM)lIndex, 0);
}
}
}
//-------------------------------------------------------------------------
// Set contents of the controls to reflect the contents of
// m_strWorkingLine.
//-------------------------------------------------------------------------
void SetDlgControlsToString()
{
CString strLine(m_strWorkingLine);
strLine.MakeLower();
CheckDlgButton(IDC_BIAMAXMEM, (strLine.Find(_T("/maxmem")) != -1));
CheckDlgButton(IDC_BIANUMPROC, (strLine.Find(_T("/numproc")) != -1));
CheckDlgButton(IDC_BIAPCILOCK, (strLine.Find(_T("/pcilock")) != -1));
CheckDlgButton(IDC_BIADEBUG, (strLine.Find(_T("/debug")) != -1));
CheckDlgButton(IDC_BIADEBUGPORT, (strLine.Find(_T("/debugport")) != -1));
CheckDlgButton(IDC_BIABAUDRATE, (strLine.Find(_T("/baudrate")) != -1));
CheckDlgButton(IDC_BIACHANNEL, (strLine.Find(_T("/channel")) != -1));
CString strWorking;
int i = strLine.Find(_T("/maxmem"));
if (i != -1)
{
strWorking = strLine.Mid(i);
strWorking.TrimLeft(_T("/maxmem ="));
strWorking = strWorking.SpanIncluding(_T("0123456789"));
SetDlgItemText(IDC_EDITMAXMEM, strWorking);
}
i = strLine.Find(_T("/channel"));
if (i != -1)
{
strWorking = strLine.Mid(i);
strWorking.TrimLeft(_T("/channel ="));
strWorking = strWorking.SpanIncluding(_T("0123456789"));
SetDlgItemText(IDC_EDITCHANNEL, strWorking);
}
SetComboBox(strLine, _T("/numproc"), _T("0123456789"), IDC_COMBOPROCS);
SetComboBox(strLine, _T("/baudrate"), _T("0123456789"), IDC_COMBOBAUD);
SetComboBox(strLine, _T("/debugport"), _T("com1234:"), IDC_COMBOCOMPORT);
}
//-------------------------------------------------------------------------
// Funtions to add or remove a flag from the working string.
//-------------------------------------------------------------------------
void AddFlag(LPCTSTR szFlag)
{
CString strFlag(szFlag);
// TBD - might be a better way to do this.
CString strRemove = strFlag.SpanExcluding(_T("="));
RemoveFlag(strRemove);
if (m_strWorkingLine.IsEmpty())
m_strWorkingLine = strFlag;
else
{
m_strWorkingLine.TrimRight();
m_strWorkingLine += CString(_T(" ")) + strFlag;
}
}
void RemoveFlag(LPCTSTR szFlag)
{
CString strWorking(m_strWorkingLine);
strWorking.MakeLower();
int iTrimLeft = strWorking.Find(szFlag);
if (iTrimLeft == -1)
return;
CString strNewLine(_T(""));
if (iTrimLeft > 0)
strNewLine = m_strWorkingLine.Left(iTrimLeft);
int iTrimRight = strWorking.Find(_T("/"), iTrimLeft + 1);
if (iTrimRight != -1)
strNewLine += m_strWorkingLine.Mid(iTrimRight);
m_strWorkingLine = strNewLine;
}
//-------------------------------------------------------------------------
// Set contents of m_strWorkingLine to reflec the dialog controls.
//-------------------------------------------------------------------------
void SetStringToDlgControls()
{
CString strFlag;
TCHAR szTemp[MAX_PATH];
if (BST_CHECKED == IsDlgButtonChecked(IDC_BIAMAXMEM) && GetDlgItemText(IDC_EDITMAXMEM, szTemp, MAX_PATH))
{
long lRequestedValue = _ttol(szTemp);
long lAllowedValue = VerifyMaxMem(lRequestedValue);
if (lRequestedValue != lAllowedValue)
{
wsprintf(szTemp, _T("%d"), lAllowedValue);
SetDlgItemText(IDC_EDITMAXMEM, szTemp);
}
strFlag.Format(_T("/maxmem=%s"), szTemp);
AddFlag(strFlag);
}
else
RemoveFlag(_T("/maxmem"));
if (BST_CHECKED == IsDlgButtonChecked(IDC_BIANUMPROC) && GetDlgItemText(IDC_COMBOPROCS, szTemp, MAX_PATH))
{
strFlag.Format(_T("/numproc=%s"), szTemp);
AddFlag(strFlag);
}
else
RemoveFlag(_T("/numproc"));
if (BST_CHECKED == IsDlgButtonChecked(IDC_BIAPCILOCK))
AddFlag(_T("/pcilock"));
else
RemoveFlag(_T("/pcilock"));
if (BST_CHECKED == IsDlgButtonChecked(IDC_BIADEBUG))
{
AddFlag(_T("/debug"));
if (BST_CHECKED == IsDlgButtonChecked(IDC_BIADEBUGPORT) && GetDlgItemText(IDC_COMBOCOMPORT, szTemp, MAX_PATH))
{
strFlag.Format(_T("/debugport=%s"), szTemp);
AddFlag(strFlag);
}
else
RemoveFlag(_T("/debugport"));
if (::IsWindowEnabled(GetDlgItem(IDC_BIABAUDRATE)) && BST_CHECKED == IsDlgButtonChecked(IDC_BIABAUDRATE) && GetDlgItemText(IDC_COMBOBAUD, szTemp, MAX_PATH))
{
strFlag.Format(_T("/baudrate=%s"), szTemp);
AddFlag(strFlag);
}
else
RemoveFlag(_T("/baudrate"));
if (::IsWindowEnabled(GetDlgItem(IDC_BIACHANNEL)) && BST_CHECKED == IsDlgButtonChecked(IDC_BIACHANNEL) && GetDlgItemText(IDC_EDITCHANNEL, szTemp, MAX_PATH))
{
long lRequestedValue = _ttol(szTemp);
long lAllowedValue = VerifyChannel(lRequestedValue);
if (lRequestedValue != lAllowedValue)
{
wsprintf(szTemp, _T("%d"), lAllowedValue);
SetDlgItemText(IDC_EDITCHANNEL, szTemp);
}
strFlag.Format(_T("/channel=%s"), szTemp);
AddFlag(strFlag);
}
else
RemoveFlag(_T("/channel"));
}
else
{
RemoveFlag(_T("/debug"));
RemoveFlag(_T("/debugport"));
RemoveFlag(_T("/baudrate"));
RemoveFlag(_T("/channel"));
}
}
private:
CString m_strWorkingLine; // the line from the INI file we are modifying
int m_iMaxMB; // max value for /MAXMEM
LRESULT OnClickedBaudRateCheck(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
{
if (BST_CHECKED == IsDlgButtonChecked(IDC_BIABAUDRATE))
if (CB_ERR == ::SendMessage(GetDlgItem(IDC_COMBOBAUD), CB_GETCURSEL, 0, 0))
::SendMessage(GetDlgItem(IDC_COMBOBAUD), CB_SETCURSEL, 0, 0);
SetDlgControlState();
return 0;
}
LRESULT OnClickedDebugCheck(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
{
SetDlgControlState();
return 0;
}
LRESULT OnClickedDebugPortCheck(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
{
if (BST_CHECKED == IsDlgButtonChecked(IDC_BIADEBUGPORT))
if (CB_ERR == ::SendMessage(GetDlgItem(IDC_COMBOCOMPORT), CB_GETCURSEL, 0, 0))
::SendMessage(GetDlgItem(IDC_COMBOCOMPORT), CB_SETCURSEL, 0, 0);
SetDlgControlState();
return 0;
}
LRESULT OnClickedMaxMemCheck(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
{
if (BST_CHECKED == IsDlgButtonChecked(IDC_BIAMAXMEM))
{
TCHAR szTemp[MAX_PATH];
if (!GetDlgItemText(IDC_EDITMAXMEM, szTemp, MAX_PATH) || szTemp[0] == _T('\0'))
{
CString strMinValue;
strMinValue.Format(_T("%d"), m_iMaxMB);
SetDlgItemText(IDC_EDITMAXMEM, strMinValue);
}
}
SetDlgControlState();
return 0;
}
LRESULT OnClickedNumProcCheck(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
{
if (BST_CHECKED == IsDlgButtonChecked(IDC_BIANUMPROC))
if (CB_ERR == ::SendMessage(GetDlgItem(IDC_COMBOPROCS), CB_GETCURSEL, 0, 0))
::SendMessage(GetDlgItem(IDC_COMBOPROCS), CB_SETCURSEL, 0, 0);
SetDlgControlState();
return 0;
}
long VerifyMaxMem(long lMem)
{
if (lMem < MINBOOTMB)
lMem = MINBOOTMB;
if (lMem > m_iMaxMB)
lMem = m_iMaxMB;
return lMem;
}
LRESULT OnDeltaSpinMaxMem(int idCtrl, LPNMHDR pnmh, BOOL& bHandled)
{
LPNMUPDOWN pnmud = (LPNMUPDOWN)pnmh;
TCHAR szTemp[MAX_PATH];
long lNewVal = m_iMaxMB;
if (GetDlgItemText(IDC_EDITMAXMEM, szTemp, MAX_PATH))
lNewVal = VerifyMaxMem(_ttol(szTemp) - pnmud->iDelta);
wsprintf(szTemp, _T("%d"), lNewVal);
SetDlgItemText(IDC_EDITMAXMEM, szTemp);
return 0;
}
LRESULT OnKillFocusEditMaxMem(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
{
TCHAR szTemp[MAX_PATH];
if (GetDlgItemText(IDC_EDITMAXMEM, szTemp, MAX_PATH))
{
long lCurrentVal = _ttol(szTemp);
long lAllowedVal = VerifyMaxMem(lCurrentVal);
if (lCurrentVal != lAllowedVal)
{
wsprintf(szTemp, _T("%d"), lAllowedVal);
SetDlgItemText(IDC_EDITMAXMEM, szTemp);
}
}
return 0;
}
LRESULT OnSelChangeComboComPort(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
{
SetDlgControlState();
return 0;
}
LRESULT OnClickedBIAChannel(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
{
if (BST_CHECKED == IsDlgButtonChecked(IDC_BIACHANNEL))
{
TCHAR szTemp[MAX_PATH];
if (!GetDlgItemText(IDC_EDITCHANNEL, szTemp, MAX_PATH) || szTemp[0] == _T('\0'))
SetDlgItemText(IDC_EDITCHANNEL, _T("1"));
}
SetDlgControlState();
return 0;
}
long VerifyChannel(long lChannel)
{
if (lChannel < MIN_1394_CHANNEL)
lChannel = MIN_1394_CHANNEL;
if (lChannel > MAX_1394_CHANNEL)
lChannel = MAX_1394_CHANNEL;
return lChannel;
}
LRESULT OnDeltaSpinChannel(int idCtrl, LPNMHDR pnmh, BOOL& bHandled)
{
LPNMUPDOWN pnmud = (LPNMUPDOWN)pnmh;
TCHAR szTemp[MAX_PATH];
long lNewVal = m_iMaxMB;
if (GetDlgItemText(IDC_EDITCHANNEL, szTemp, MAX_PATH))
lNewVal = VerifyChannel(_ttol(szTemp) - pnmud->iDelta);
wsprintf(szTemp, _T("%d"), lNewVal);
SetDlgItemText(IDC_EDITCHANNEL, szTemp);
return 0;
}
LRESULT OnKillFocusChannel(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
{
TCHAR szTemp[MAX_PATH];
if (GetDlgItemText(IDC_EDITCHANNEL, szTemp, MAX_PATH))
{
long lCurrentVal = _ttol(szTemp);
long lAllowedVal = VerifyChannel(lCurrentVal);
if (lCurrentVal != lAllowedVal)
{
wsprintf(szTemp, _T("%d"), lAllowedVal);
SetDlgItemText(IDC_EDITCHANNEL, szTemp);
}
}
return 0;
}
};
#endif //__BOOTINIADVANCEDDLG_H_