|
|
// wiadbgcfgDlg.cpp : implementation file
//
#include "stdafx.h"
#include "wiadbgcfg.h"
#include "wiadbgcfgDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__; #endif
#define DEBUG_REGKEY_ROOT TEXT("System\\CurrentControlSet\\Control\\StillImage\\Debug")
#define DWORD_REGVALUE_DEBUGFLAGS TEXT("DebugFlags")
#define WIADBGCFG_DATAFILE TEXT("wiadbgcfg.txt")
/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About
class CAboutDlg : public CDialog { public: CAboutDlg();
// Dialog Data
//{{AFX_DATA(CAboutDlg)
enum { IDD = IDD_ABOUTBOX }; //}}AFX_DATA
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CAboutDlg)
protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected: //{{AFX_MSG(CAboutDlg)
//}}AFX_MSG
DECLARE_MESSAGE_MAP() };
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) { //{{AFX_DATA_INIT(CAboutDlg)
//}}AFX_DATA_INIT
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CAboutDlg)
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) //{{AFX_MSG_MAP(CAboutDlg)
// No message handlers
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CWiadbgcfgDlg dialog
CWiadbgcfgDlg::CWiadbgcfgDlg(CWnd* pParent /*=NULL*/) : CDialog(CWiadbgcfgDlg::IDD, pParent) { //{{AFX_DATA_INIT(CWiadbgcfgDlg)
m_szDebugFlags = _T(""); //}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); m_dwNumEntrysInDataBase = 0; m_pFlagDataBase = NULL; }
void CWiadbgcfgDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CWiadbgcfgDlg)
DDX_Control(pDX, IDC_FLAGS_LIST, m_DefinedDebugFlagsListBox); DDX_Control(pDX, IDC_MODULES_COMBOBOX, m_ModuleSelectionComboBox); DDX_Text(pDX, IDC_DEBUG_FLAGS_EDITBOX, m_szDebugFlags); //}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CWiadbgcfgDlg, CDialog) //{{AFX_MSG_MAP(CWiadbgcfgDlg)
ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_CBN_SELCHANGE(IDC_MODULES_COMBOBOX, OnSelchangeModulesCombobox) ON_WM_CLOSE() ON_EN_CHANGE(IDC_DEBUG_FLAGS_EDITBOX, OnChangeDebugFlagsEditbox) ON_LBN_SELCHANGE(IDC_FLAGS_LIST, OnSelchangeFlagsList) //}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CWiadbgcfgDlg message handlers
BOOL CWiadbgcfgDlg::OnInitDialog() { CDialog::OnInitDialog();
// Add "About..." menu item to system menu.
// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != NULL) { CString strAboutMenu; strAboutMenu.LoadString(IDS_ABOUTBOX); if (!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); } }
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
m_lDebugFlags = 0;
BuildFlagDataBaseFromFile();
return AddModulesToComboBox(); }
void CWiadbgcfgDlg::OnSysCommand(UINT nID, LPARAM lParam) { if ((nID & 0xFFF0) == IDM_ABOUTBOX) { CAboutDlg dlgAbout; dlgAbout.DoModal(); } else { CDialog::OnSysCommand(nID, lParam); } }
// 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 CWiadbgcfgDlg::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_hIcon); } else { CDialog::OnPaint(); } }
// The system calls this to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CWiadbgcfgDlg::OnQueryDragIcon() { return(HCURSOR) m_hIcon; }
BOOL CWiadbgcfgDlg::AddModulesToComboBox() { BOOL bSuccess = FALSE; HKEY hTargetKey = NULL; DWORD dwNumKeys = 0; LONG lResult = ERROR_NO_MORE_ITEMS; TCHAR szKeyName[MAX_PATH];
//
// open root Debug registry key
//
if (ERROR_SUCCESS == RegOpenKey(HKEY_LOCAL_MACHINE,DEBUG_REGKEY_ROOT,&hTargetKey)) {
//
// enumerate sub keys
//
memset(szKeyName,0,sizeof(szKeyName)); lResult = RegEnumKey(hTargetKey,dwNumKeys,szKeyName,sizeof(szKeyName));
//
// while there are no more keys...
//
while (lResult != ERROR_NO_MORE_ITEMS) { memset(szKeyName,0,sizeof(szKeyName)); lResult = RegEnumKey(hTargetKey,dwNumKeys,szKeyName,sizeof(szKeyName));
//
// if the key name is longer than 0 characters...
// add it to the combobox.
//
if (lstrlen(szKeyName) > 0) { m_ModuleSelectionComboBox.AddString(szKeyName); }
//
// increment the key index/counter
//
dwNumKeys++; }
//
// check to see if we recieved any valid keys...
//
if (dwNumKeys > 0) { bSuccess = TRUE; }
//
// close root Debug registry key
//
if (NULL != hTargetKey) { RegCloseKey(hTargetKey); hTargetKey = NULL; } }
//
// if the enumertation was a success...
// populate the other controls..
//
if (bSuccess) { m_ModuleSelectionComboBox.SetCurSel(0); UpdateCurrentValueFromRegistry(); OnChangeDebugFlagsEditbox(); }
//
// return success value
//
return bSuccess; }
VOID CWiadbgcfgDlg::UpdateCurrentValueFromRegistry() { HKEY hDebugKey = NULL; TCHAR szDebugKey[MAX_PATH]; if (ConstructDebugRegKey(szDebugKey,sizeof(szDebugKey))) {
//
// open registry key
//
if (ERROR_SUCCESS == RegOpenKey(HKEY_LOCAL_MACHINE,szDebugKey,&hDebugKey)) {
//
// initialize DWORD reading values
//
DWORD dwSize = sizeof(DWORD); DWORD dwType = REG_DWORD;
//
// read current registry value
//
RegQueryValueEx(hDebugKey,DWORD_REGVALUE_DEBUGFLAGS,0,&dwType,(LPBYTE)&m_lDebugFlags,&dwSize);
//
// update UI
//
UpdateEditBox();
//
// close registry key
//
RegCloseKey(hDebugKey);
//
// add flags for that module to list box
//
TCHAR szModuleName[MAX_PATH]; memset(szModuleName,0,sizeof(szModuleName)); GetSelectedModuleName(szModuleName,sizeof(szModuleName));
AddFlagsToListBox(szModuleName); } } }
VOID CWiadbgcfgDlg::UpdateCurrentValueToRegistry() { HKEY hDebugKey = NULL; TCHAR szDebugKey[MAX_PATH]; if (ConstructDebugRegKey(szDebugKey,sizeof(szDebugKey))) {
//
// open registry key
//
if (ERROR_SUCCESS == RegOpenKey(HKEY_LOCAL_MACHINE,szDebugKey,&hDebugKey)) {
//
// initialize DWORD reading values
//
DWORD dwSize = sizeof(DWORD); DWORD dwType = REG_DWORD;
//
// write current registry value
//
RegSetValueEx(hDebugKey,DWORD_REGVALUE_DEBUGFLAGS,0,dwType,(LPBYTE)&m_lDebugFlags,dwSize);
//
// close registry key
//
RegCloseKey(hDebugKey); } } }
void CWiadbgcfgDlg::UpdateEditBox() { //
// format display string, from saved current value
//
m_szDebugFlags.Format(TEXT("0x%08X"),m_lDebugFlags);
//
// update dialog control, with formatted current value
//
UpdateData(FALSE);
UpdateListBoxSelectionFromEditBox(); }
BOOL CWiadbgcfgDlg::GetSelectedModuleName(TCHAR *szModuleName, DWORD dwSize) { memset(szModuleName,0,dwSize);
//
// get current selection index from combo box
//
INT iCurSel = m_ModuleSelectionComboBox.GetCurSel();
//
// check that we have a selection
//
if (iCurSel > -1) {
//
// get module name from combo box
//
m_ModuleSelectionComboBox.GetLBText(iCurSel, szModuleName); return TRUE; } return FALSE; }
BOOL CWiadbgcfgDlg::ConstructDebugRegKey(TCHAR *pszDebugRegKey, DWORD dwSize) { memset(pszDebugRegKey,0,dwSize);
//
// copy root registry string, adding on "\"
//
lstrcpy(pszDebugRegKey,DEBUG_REGKEY_ROOT); lstrcat(pszDebugRegKey,TEXT("\\"));
TCHAR szRegKey[MAX_PATH]; if (GetSelectedModuleName(szRegKey,sizeof(szRegKey))) {
//
// concat module name to end of root registry key, to
// form new debug key to open
//
lstrcat(pszDebugRegKey,szRegKey);
return TRUE;
} return FALSE; }
void CWiadbgcfgDlg::OnSelchangeModulesCombobox() {
//
// update the dialog, when the user changes the selected module
//
UpdateCurrentValueFromRegistry(); OnChangeDebugFlagsEditbox(); }
BOOL CWiadbgcfgDlg::BuildFlagDataBaseFromFile() { CFileIO DATA_FILE; HRESULT hr = S_OK; hr = DATA_FILE.Open(WIADBGCFG_DATAFILE); if (FAILED(hr)) {
//
// display warning to user..and attempt to generate the default data file
// with wia service entries
//
TCHAR szWarningString[MAX_PATH]; memset(szWarningString,0,sizeof(szWarningString)); lstrcpy(szWarningString,WIADBGCFG_DATAFILE); lstrcat(szWarningString, TEXT(" could not be found..This Program will generate one for you.\nYou can add custom flags by editing this file.")); MessageBox(szWarningString,TEXT("Configuration File Warning"),MB_ICONWARNING);
CreateDefaultDataFile();
//
// attempt to reopen data file
//
hr = DATA_FILE.Open(WIADBGCFG_DATAFILE); } if (SUCCEEDED(hr)) {
//
// data file is open... count valid entries
//
TCHAR szString[MAX_PATH]; memset(szString,0,sizeof(szString)); LONG lNumCharactersRead = 0; while (DATA_FILE.ReadLine(szString,sizeof(szString),&lNumCharactersRead)) { if ((szString[0] == '/') && (szString[1] == '/')) {
//
// skip the comment lines
//
} else if ((szString[0] == 13)) {
//
// skip the empty carriage returns..and line feeds
//
} else { DWORD dwError = ValidateEntry(szString); m_dwNumEntrysInDataBase++; } } DATA_FILE.Close(); } else { MessageBox(TEXT("flags data file could not be opened.."),TEXT("Configuration File Error"),MB_ICONERROR); return FALSE; }
//
// allocate flag data base
//
LONG lEntryNumber = 0; m_pFlagDataBase = new PREDEFINED_FLAGS[m_dwNumEntrysInDataBase]; if (m_pFlagDataBase) { hr = DATA_FILE.Open(WIADBGCFG_DATAFILE); } else { hr = E_OUTOFMEMORY; }
if (SUCCEEDED(hr)) { TCHAR szString[MAX_PATH]; memset(szString,0,sizeof(szString)); LONG lNumCharactersRead = 0; while (DATA_FILE.ReadLine(szString,sizeof(szString),&lNumCharactersRead)) { if ((szString[0] == '/') && (szString[1] == '/')) {
//
// skip the comment lines
//
} else if ((szString[0] == 13)) {
//
// skip the empty carriage returns..and line feeds
//
} else { DWORD dwError = ValidateEntry(szString); ParseEntry(szString,&m_pFlagDataBase[lEntryNumber]); lEntryNumber++; } } DATA_FILE.Close(); } else { MessageBox(TEXT("flags data file could not be opened.."),TEXT("Configuration File Error"),MB_ICONERROR); return FALSE; } return TRUE; }
void CWiadbgcfgDlg::OnClose() { CDialog::OnClose(); }
VOID CWiadbgcfgDlg::AddFlagsToListBox(TCHAR *szModuleName) { m_DefinedDebugFlagsListBox.ResetContent(); for (DWORD dwindex = 0; dwindex < m_dwNumEntrysInDataBase; dwindex++) { if ((lstrcmpi(TEXT("global"),m_pFlagDataBase[dwindex].szModule) == 0) || (lstrcmpi(szModuleName, m_pFlagDataBase[dwindex].szModule) == 0)) { TCHAR szListBoxString[MAX_PATH]; memset(szListBoxString,0,sizeof(szListBoxString)); lstrcpy(szListBoxString,m_pFlagDataBase[dwindex].szName); m_DefinedDebugFlagsListBox.AddString(szListBoxString); } } }
VOID CWiadbgcfgDlg::FreeDataBaseMemory() { if (m_pFlagDataBase) { delete [] m_pFlagDataBase; m_pFlagDataBase = NULL; } }
DWORD CWiadbgcfgDlg::ValidateEntry(TCHAR *szEntry) { DWORD dwError = VALID_ENTRY;
// VALID_ENTRY
// MISSING_QUOTE
// MISSING_FIELD
// INVALID_FLAG
// INVALID_NAME
// INVALID_DESCRIPTION
return dwError; }
VOID CWiadbgcfgDlg::CreateDefaultDataFile() { CFileIO DATA_FILE; /*
const DWORD WIAUDBG_ERRORS = 0x00000001; const DWORD WIAUDBG_WARNINGS = 0x00000002; const DWORD WIAUDBG_TRACES = 0x00000004; const DWORD WIAUDBG_FNS = 0x00000008; // Function entry and exit
const DWORD WIAUDBG_DUMP = 0x00000010; // Dump data
const DWORD WIAUDBG_PRINT_TIME = 0x08000000; // Prints time for each message
const DWORD WIAUDBG_PRINT_INFO = 0x10000000; // Turns on thread, file, line info
const DWORD WIAUDBG_DONT_LOG_TO_DEBUGGER = 0x20000000; const DWORD WIAUDBG_DONT_LOG_TO_FILE = 0x40000000; const DWORD WIAUDBG_BREAK_ON_ERRORS = 0x80000000; // Do DebugBreak on errors
*/ if (SUCCEEDED(DATA_FILE.Open(WIADBGCFG_DATAFILE,TRUE))) { DATA_FILE.WriteLine(TEXT("//")); DATA_FILE.WriteLine(TEXT("// Module Name Flag Description Flag Value")); DATA_FILE.WriteLine(TEXT("//")); DATA_FILE.WriteLine(TEXT("")); DATA_FILE.WriteLine(TEXT("\"global\", \"Log Errors\", \"0x00000001\"")); DATA_FILE.WriteLine(TEXT("\"global\", \"Log Warnings\", \"0x00000002\"")); DATA_FILE.WriteLine(TEXT("\"global\", \"Log Traces\", \"0x00000004\"")); DATA_FILE.WriteLine(TEXT("\"global\", \"Log Function Entry/Exits\", \"0x00000008\"")); DATA_FILE.WriteLine(TEXT("\"global\", \"Don't Log to Debugger\", \"0x20000000\"")); DATA_FILE.WriteLine(TEXT("\"global\", \"Don't Log To File\", \"0x40000000\"")); DATA_FILE.WriteLine(TEXT("\"global\", \"Break on Errors\", \"0x80000000\"")); DATA_FILE.WriteLine(TEXT("")); DATA_FILE.WriteLine(TEXT("")); DATA_FILE.WriteLine(TEXT("")); DATA_FILE.WriteLine(TEXT("//")); DATA_FILE.WriteLine(TEXT("// Add your custom flags here, follow same format as above.")); DATA_FILE.WriteLine(TEXT("//")); DATA_FILE.WriteLine(TEXT("\"module.dll\", \"Text String Description\", \" flag value\"")); DATA_FILE.Close(); } else { MessageBox(TEXT("Default data file could not be created."),TEXT("Configuration File Error"),MB_ICONERROR); } }
VOID CWiadbgcfgDlg::ParseEntry(TCHAR *pszString, PPREDEFINED_FLAGS pFlagInfo) { TCHAR *pch = pszString; LONG lLen = lstrlen(pszString); BOOL bModuleName = FALSE; BOOL bFlagName = FALSE; BOOL bFlagValue = FALSE; BOOL bFirstQuote = FALSE; BOOL bLastQuote = FALSE; LONG lCopyIndex = 0; TCHAR szFlagValue[MAX_PATH];
memset(szFlagValue,0,sizeof(szFlagValue)); memset(pFlagInfo,0,sizeof(PREDEFINED_FLAGS));
for (LONG i = 0; i < lLen; i++) {
if (!bModuleName) {
//
// strip off module name
//
if (!bFirstQuote) { if (pch[i] == '"') { bFirstQuote = TRUE; lCopyIndex = 0; } } else { if (pch[i] != '"') { pFlagInfo->szModule[lCopyIndex] = pch[i]; lCopyIndex++; } else { bModuleName = TRUE; bFirstQuote = FALSE; } } } else if (!bFlagName) {
//
// strip off flag name
//
if (!bFirstQuote) { if (pch[i] == '"') { bFirstQuote = TRUE; lCopyIndex = 0; } } else { if (pch[i] != '"') { pFlagInfo->szName[lCopyIndex] = pch[i]; lCopyIndex++; } else { bFlagName = TRUE; bFirstQuote = FALSE; } }
} else if (!bFlagValue) {
//
// strip off flag value
//
if (!bFirstQuote) { if (pch[i] == '"') { bFirstQuote = TRUE; lCopyIndex = 0; } } else { if (pch[i] != '"') { szFlagValue[lCopyIndex] = pch[i]; lCopyIndex++; } else { bFlagValue = TRUE; bFirstQuote = FALSE; #ifdef UNICODE
swscanf(szFlagValue,TEXT("0x%08X"),&pFlagInfo->dwFlagValue); #else
sscanf(szFlagValue,TEXT("0x%08X"),&pFlagInfo->dwFlagValue); #endif
} } } } }
void CWiadbgcfgDlg::OnChangeDebugFlagsEditbox() { UpdateData(TRUE);
#ifdef UNICODE
swscanf(m_szDebugFlags,TEXT("0x%08X"),&m_lDebugFlags); #else
sscanf(m_szDebugFlags,TEXT("0x%08X"),&m_lDebugFlags); #endif
INT iNumItems = 0; iNumItems = m_DefinedDebugFlagsListBox.GetCount(); for(INT i = 0; i < iNumItems; i++){ m_DefinedDebugFlagsListBox.SetSel(i,FALSE); } UpdateListBoxSelectionFromEditBox(); UpdateCurrentValueToRegistry(); }
BOOL CWiadbgcfgDlg::GetDebugFlagFromDataBase(TCHAR *szModuleName, TCHAR *szFlagName, LONG *pFlagValue) { BOOL bFound = FALSE; for (DWORD dwindex = 0; dwindex < m_dwNumEntrysInDataBase; dwindex++) { if ((lstrcmpi(TEXT("global"),m_pFlagDataBase[dwindex].szModule) == 0) || lstrcmpi(szModuleName, m_pFlagDataBase[dwindex].szModule) == 0) { TCHAR szListBoxString[MAX_PATH]; memset(szListBoxString,0,sizeof(szListBoxString)); if (lstrcmpi(szFlagName, m_pFlagDataBase[dwindex].szName) == 0) { *pFlagValue = m_pFlagDataBase[dwindex].dwFlagValue; bFound = TRUE; dwindex = m_dwNumEntrysInDataBase; } } } return bFound; }
void CWiadbgcfgDlg::OnSelchangeFlagsList() { TCHAR szModuleName[MAX_PATH]; if(GetSelectedModuleName(szModuleName,sizeof(szModuleName))){ TCHAR szListBoxValue[MAX_PATH]; m_lDebugFlags = 0; LONG lListBoxValue = 0; int indexArray[100];
memset(indexArray,0,sizeof(indexArray)); int iNumItemsSelected = m_DefinedDebugFlagsListBox.GetSelItems(100,indexArray); for (int i = 0; i < iNumItemsSelected; i++) { memset(szListBoxValue,0,sizeof(szListBoxValue)); m_DefinedDebugFlagsListBox.GetText(indexArray[i],szListBoxValue); if (GetDebugFlagFromDataBase(szModuleName,szListBoxValue,&lListBoxValue)) { m_lDebugFlags |= lListBoxValue; } else {
} }
m_szDebugFlags.Format(TEXT("0x%08X"),m_lDebugFlags);
//
// update dialog control, with formatted current value
//
UpdateData(FALSE);
UpdateCurrentValueToRegistry(); } }
void CWiadbgcfgDlg::UpdateListBoxSelectionFromEditBox() { INT iNumItems = 0; iNumItems = m_DefinedDebugFlagsListBox.GetCount(); if(iNumItems > 0){ TCHAR szModuleName[MAX_PATH]; GetSelectedModuleName(szModuleName,sizeof(szModuleName)); for(INT i = 0; i < iNumItems; i++){ TCHAR szListBoxString[MAX_PATH]; memset(szListBoxString,0,sizeof(szListBoxString)); m_DefinedDebugFlagsListBox.GetText(i,szListBoxString); LONG lFlagValue = 0; if(GetDebugFlagFromDataBase(szModuleName,szListBoxString,&lFlagValue)){ if(m_lDebugFlags & lFlagValue){ m_DefinedDebugFlagsListBox.SetSel(i); } } } } }
|