/******************************************************************************* * * (C) COPYRIGHT MICROSOFT CORPORATION, 1998 * * TITLE: DBGMASK.H * * VERSION: 1.0 * * AUTHOR: ShaunIv * * DATE: 9/13/1999 * * DESCRIPTION: Debug mask dialog * *******************************************************************************/ #ifndef __DGBMASK_H_INCLUDED #define __DGBMASK_H_INCLUDED #include #include #include #include #include #include class CAddModuleDialog { public: struct CData { CSimpleString strTitle; CSimpleString strName; }; private: HWND m_hWnd; CData *m_pData; private: // Not implemented CAddModuleDialog(void); CAddModuleDialog( const CAddModuleDialog & ); CAddModuleDialog &operator=( const CAddModuleDialog & ); private: explicit CAddModuleDialog( HWND hWnd ) : m_hWnd(hWnd), m_pData(NULL) { } ~CAddModuleDialog(void) { } void OnOK( WPARAM, LPARAM ) { m_pData->strName.GetWindowText( GetDlgItem( m_hWnd, IDC_MODULE_NAME ) ); EndDialog( m_hWnd, IDOK ); } void OnCancel( WPARAM, LPARAM ) { EndDialog( m_hWnd, IDCANCEL ); } LRESULT OnInitDialog( WPARAM wParam, LPARAM lParam ) { m_pData = reinterpret_cast(lParam); if (!m_pData) { EndDialog( m_hWnd, -1 ); return -1; } m_pData->strName.SetWindowText( GetDlgItem( m_hWnd, IDC_MODULE_NAME ) ); if (m_pData->strTitle.Length()) m_pData->strTitle.SetWindowText( m_hWnd ); WiaUiUtil::CenterWindow( m_hWnd, GetParent(m_hWnd) ); return 0; } LRESULT OnCommand( WPARAM wParam, LPARAM lParam ) { SC_BEGIN_COMMAND_HANDLERS() { SC_HANDLE_COMMAND(IDOK,OnOK); SC_HANDLE_COMMAND(IDCANCEL,OnCancel); } SC_END_COMMAND_HANDLERS(); } public: static INT_PTR WINAPI DialogProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) { SC_BEGIN_DIALOG_MESSAGE_HANDLERS(CAddModuleDialog) { SC_HANDLE_DIALOG_MESSAGE( WM_INITDIALOG, OnInitDialog ); SC_HANDLE_DIALOG_MESSAGE( WM_COMMAND, OnCommand ); } SC_END_DIALOG_MESSAGE_HANDLERS(); } }; template static HRESULT DigitToNumber( WCHAR cDigit, int nRadix, T_NUMBERTYPE *pnValue ) { if (!pnValue) return E_POINTER; if (nRadix > 36) return E_INVALIDARG; static const WCHAR *pszUpperDigits = L"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; static const WCHAR *pszLowerDigits = L"0123456789abcdefghijklmnopqrstuvwxyz"; for (int i=0;i(i); return S_OK; } else if (cDigit == pszLowerDigits[i]) { *pnValue = static_cast(i); return S_OK; } } return E_FAIL; } template static HRESULT StringToNumber( LPCWSTR strwNumber, int nRadix, T_NUMBERTYPE *pnNumber ) { // Assume this is not a base 10 negative number bool bNegate = false; // Check all of the arguments if (!strwNumber) return E_INVALIDARG; if (!pnNumber) return E_POINTER; if (nRadix > 36) return E_INVALIDARG; LPCWSTR pszCurr = strwNumber; // If this is a negative number, store it if (nRadix == 10 && lstrlenW(pszCurr) >= 1 && pszCurr[0] == TEXT('-')) { pszCurr++; bNegate = true; } // Skip the optional 0x or 0X that can prefix hex numbers if (nRadix == 16 && lstrlenW(pszCurr) >= 2 && pszCurr[0] == L'0' && (pszCurr[1] == L'x' || pszCurr[1] == L'X')) { pszCurr += 2; } *pnNumber = 0; while (*pszCurr) { T_NUMBERTYPE nCurrDigit; if (!SUCCEEDED(DigitToNumber( *pszCurr, nRadix, &nCurrDigit ))) { return E_FAIL; } *pnNumber *= nRadix; *pnNumber += nCurrDigit; pszCurr++; } if (bNegate) *pnNumber = static_cast(-static_cast<__int64>(*pnNumber)); return S_OK; } template static HRESULT StringToNumber( LPCSTR strNumber, int nRadix, T_NUMBERTYPE *pnNumber ) { return StringToNumber( CSimpleStringConvert::WideString(CSimpleStringAnsi(strNumber)), nRadix, pnNumber ); } class CDebugMaskDialog { private: class CDebugModule { private: CSimpleString m_strName; DWORD m_dwMask; public: CDebugModule( LPCTSTR pszName = TEXT(""), DWORD dwMask = 0) : m_strName(pszName), m_dwMask(dwMask) { } CDebugModule( const CDebugModule &other ) : m_strName(other.Name()), m_dwMask(other.Mask()) { } CDebugModule &operator=( const CDebugModule &other ) { if (&other != this) { m_strName = other.Name(); m_dwMask = other.Mask(); } return *this; } CSimpleString Name(void) const { return m_strName; } DWORD Mask(void) const { return m_dwMask; } void Mask( DWORD dwMask ) { m_dwMask = dwMask; } }; private: HWND m_hWnd; private: // Not implemented CDebugMaskDialog(void); CDebugMaskDialog( const CDebugMaskDialog & ); CDebugMaskDialog &operator=( const CDebugMaskDialog & ); private: explicit CDebugMaskDialog( HWND hWnd ) : m_hWnd(hWnd) { } ~CDebugMaskDialog(void) { } CDebugModule *GetDebugModule( int nItem ) { LVITEM LvItem; ZeroMemory( &LvItem, sizeof(LvItem) ); LvItem.mask = LVIF_PARAM; LvItem.iItem = nItem; if (ListView_GetItem( GetDlgItem( m_hWnd, IDC_MODULE_LIST ), &LvItem )) { return reinterpret_cast(LvItem.lParam); } return NULL; } int GetCurrentSelectionIndex(void) { int nResult = -1; int nSelectedCount = ListView_GetSelectedCount(GetDlgItem( m_hWnd, IDC_MODULE_LIST )); if (nSelectedCount == 1) { nResult = ListView_GetNextItem( GetDlgItem( m_hWnd, IDC_MODULE_LIST ), -1, LVNI_SELECTED ); } return nResult; } void SelectItem( int nIndex ) { for (int i=0;i= 0) { CDebugModule *pCurrSel = GetDebugModule(nItem); if (pCurrSel) { UpdateCurrentFlagsFromEdit( *pCurrSel, nItem ); } } // Delete all of the old values CSimpleReg reg( HKEY_LOCAL_MACHINE, DEBUG_REGISTRY_PATH_FLAGS, true, KEY_WRITE ); reg.EnumValues( DeleteValuesEnumProc, reinterpret_cast(this) ); // Save all the new ones for (int i=0;iName(), pDebugModule->Mask() ); } } EndDialog( m_hWnd, IDOK ); } void OnCancel( WPARAM, LPARAM ) { EndDialog( m_hWnd, IDCANCEL ); } static bool ReadValuesEnumProc( CSimpleReg::CValueEnumInfo &enumInfo ) { if (enumInfo.nType == REG_DWORD) { CDebugMaskDialog *This = reinterpret_cast(enumInfo.lParam); if (This) { This->AddNewEntry( enumInfo.strName, enumInfo.reg.Query( enumInfo.strName, 0 ) ); } } return true; } static bool DeleteValuesEnumProc( CSimpleReg::CValueEnumInfo &enumInfo ) { bool bRes = enumInfo.reg.Delete( enumInfo.strName ); return true; } int AddNewEntry( LPCTSTR pszName, DWORD dwMask ) { int nIndex = -1; CDebugModule *pDebugModule = new CDebugModule( pszName, dwMask ); if (pDebugModule) { LVITEM LvItem; ZeroMemory( &LvItem, sizeof(LvItem) ); LvItem.mask = LVIF_TEXT | LVIF_PARAM; LvItem.pszText = const_cast(pszName); LvItem.lParam = reinterpret_cast(pDebugModule); LvItem.iItem = 0; LvItem.iSubItem = 0; nIndex = ListView_InsertItem( GetDlgItem( m_hWnd, IDC_MODULE_LIST ), &LvItem ); CSimpleString strMask; strMask.Format( TEXT("0x%08X"), dwMask ); LvItem.mask = LVIF_TEXT; LvItem.pszText = const_cast(strMask.String()); LvItem.iItem = nIndex; LvItem.iSubItem = 1; ListView_SetItem( GetDlgItem( m_hWnd, IDC_MODULE_LIST ), &LvItem ); } return nIndex; } LRESULT OnInitDialog( WPARAM wParam, LPARAM lParam ) { LVCOLUMN LvColumn; ZeroMemory( &LvColumn, sizeof(LvColumn) ); LvColumn.mask = LVCF_FMT | LVCF_SUBITEM | LVCF_WIDTH | LVCF_TEXT; LvColumn.fmt = LVCFMT_LEFT; LvColumn.pszText = TEXT("Module"); LvColumn.iSubItem = 0; LvColumn.iOrder = 0; LvColumn.cx = CSimpleRect( GetDlgItem( m_hWnd, IDC_MODULE_LIST ) ).Width() * 3 / 5; ListView_InsertColumn( GetDlgItem( m_hWnd, IDC_MODULE_LIST ), 0, &LvColumn ); ZeroMemory( &LvColumn, sizeof(LvColumn) ); LvColumn.mask = LVCF_FMT | LVCF_SUBITEM | LVCF_WIDTH | LVCF_TEXT; LvColumn.fmt = LVCFMT_LEFT; LvColumn.pszText = TEXT("Mask"); LvColumn.iSubItem = 1; LvColumn.iOrder = 1; LvColumn.cx = CSimpleRect( GetDlgItem( m_hWnd, IDC_MODULE_LIST ) ).Width() * 2 / 5; ListView_InsertColumn( GetDlgItem( m_hWnd, IDC_MODULE_LIST ), 1, &LvColumn ); CSimpleReg reg( HKEY_LOCAL_MACHINE, DEBUG_REGISTRY_PATH_FLAGS, false, KEY_READ ); reg.EnumValues( ReadValuesEnumProc, reinterpret_cast(this) ); SelectItem(0); WiaUiUtil::CenterWindow( m_hWnd, GetParent(m_hWnd) ); return 0; } LRESULT OnListDeleteItem( WPARAM, LPARAM lParam ) { NMLISTVIEW *pNmListView = reinterpret_cast(lParam); if (pNmListView) { if (pNmListView->iItem >= 0 && pNmListView->iSubItem == 0) { CDebugModule *pDebugModule = reinterpret_cast(pNmListView->lParam); if (pDebugModule) { delete pDebugModule; } } } return 0; } void UpdateCurrentFlagsFromEdit( CDebugModule &DebugModule, int nItem ) { CSimpleString strMask; strMask.GetWindowText( GetDlgItem( m_hWnd, IDC_MASK ) ); DWORD dwMask; if (SUCCEEDED(StringToNumber( strMask, 16, &dwMask ))) { DebugModule.Mask(dwMask); } strMask.Format( TEXT("0x%08X"), DebugModule.Mask() ); ListView_SetItemText( GetDlgItem( m_hWnd, IDC_MODULE_LIST ), nItem, 1, const_cast(strMask.String()) ); } LRESULT OnListItemChanged( WPARAM, LPARAM lParam ) { NMLISTVIEW *pNmListView = reinterpret_cast(lParam); if (pNmListView) { if (pNmListView->iItem >= 0 && (LVIF_STATE & pNmListView->uChanged) && ((pNmListView->uOldState & LVIS_SELECTED) ^ (pNmListView->uNewState & LVIS_SELECTED))) { CDebugModule *pDebugModule = reinterpret_cast(pNmListView->lParam); if (pDebugModule) { if (LVIS_SELECTED & pNmListView->uNewState) { CSimpleString strMask; strMask.Format( TEXT("0x%08X"), pDebugModule->Mask() ); SetDlgItemText( m_hWnd, IDC_MASK, strMask ); } else { UpdateCurrentFlagsFromEdit( *pDebugModule, pNmListView->iItem ); } } } } return 0; } void OnDeleteModule( WPARAM, LPARAM ) { int nCurSel = GetCurrentSelectionIndex(); if (nCurSel >= 0) { ListView_DeleteItem( GetDlgItem( m_hWnd, IDC_MODULE_LIST ), nCurSel ); int nCount = ListView_GetItemCount( GetDlgItem( m_hWnd, IDC_MODULE_LIST ) ); if (nCount) { SelectItem(nCurSel >= nCount ? nCount-1 : nCurSel ); } } } void OnAddModule( WPARAM, LPARAM ) { CAddModuleDialog::CData AddModuleData; AddModuleData.strName = TEXT(""); AddModuleData.strTitle = TEXT("Add New Module"); extern HINSTANCE g_hInstance; if (IDOK==DialogBoxParam( g_hInstance, MAKEINTRESOURCE(IDD_MODULENAME), m_hWnd, CAddModuleDialog::DialogProc, reinterpret_cast(&AddModuleData))) { if (AddModuleData.strName.Length()) { int nIndex = AddNewEntry( AddModuleData.strName, 0xFFFFFFFF ); if (nIndex >= 0) { SelectItem( nIndex ); SetFocus( GetDlgItem( m_hWnd, IDC_MASK ) ); SendDlgItemMessage( m_hWnd, IDC_MASK, EM_SETSEL, 0, static_cast(-1) ); } } } } LRESULT OnNotify( WPARAM wParam, LPARAM lParam ) { SC_BEGIN_NOTIFY_MESSAGE_HANDLERS() { SC_HANDLE_NOTIFY_MESSAGE_CONTROL(LVN_DELETEITEM,IDC_MODULE_LIST,OnListDeleteItem); SC_HANDLE_NOTIFY_MESSAGE_CONTROL(LVN_ITEMCHANGED,IDC_MODULE_LIST,OnListItemChanged); } SC_END_NOTIFY_MESSAGE_HANDLERS(); } LRESULT OnCommand( WPARAM wParam, LPARAM lParam ) { SC_BEGIN_COMMAND_HANDLERS() { SC_HANDLE_COMMAND(IDOK,OnOK); SC_HANDLE_COMMAND(IDCANCEL,OnCancel); SC_HANDLE_COMMAND(IDC_DELETE_MODULE,OnDeleteModule); SC_HANDLE_COMMAND(IDC_ADD_MODULE,OnAddModule); } SC_END_COMMAND_HANDLERS(); } public: static INT_PTR WINAPI DialogProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) { SC_BEGIN_DIALOG_MESSAGE_HANDLERS(CDebugMaskDialog) { SC_HANDLE_DIALOG_MESSAGE( WM_INITDIALOG, OnInitDialog ); SC_HANDLE_DIALOG_MESSAGE( WM_COMMAND, OnCommand ); SC_HANDLE_DIALOG_MESSAGE( WM_NOTIFY, OnNotify ); } SC_END_DIALOG_MESSAGE_HANDLERS(); } }; #endif