521 lines
15 KiB
C++
521 lines
15 KiB
C++
/*******************************************************************************
|
|
*
|
|
* (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 <windows.h>
|
|
#include <uicommon.h>
|
|
#include <simstr.h>
|
|
#include <simreg.h>
|
|
#include <simrect.h>
|
|
#include <wiadebug.h>
|
|
|
|
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<CData*>(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 <class T_NUMBERTYPE>
|
|
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<nRadix;i++)
|
|
{
|
|
if (cDigit == pszUpperDigits[i])
|
|
{
|
|
*pnValue = static_cast<T_NUMBERTYPE>(i);
|
|
return S_OK;
|
|
}
|
|
else if (cDigit == pszLowerDigits[i])
|
|
{
|
|
*pnValue = static_cast<T_NUMBERTYPE>(i);
|
|
return S_OK;
|
|
}
|
|
}
|
|
return E_FAIL;
|
|
}
|
|
|
|
template <class T_NUMBERTYPE>
|
|
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<T_NUMBERTYPE>( *pszCurr, nRadix, &nCurrDigit )))
|
|
{
|
|
return E_FAIL;
|
|
}
|
|
*pnNumber *= nRadix;
|
|
*pnNumber += nCurrDigit;
|
|
pszCurr++;
|
|
}
|
|
if (bNegate)
|
|
*pnNumber = static_cast<T_NUMBERTYPE>(-static_cast<__int64>(*pnNumber));
|
|
return S_OK;
|
|
}
|
|
|
|
template <class T_NUMBERTYPE>
|
|
static HRESULT StringToNumber( LPCSTR strNumber, int nRadix, T_NUMBERTYPE *pnNumber )
|
|
{
|
|
return StringToNumber<T_NUMBERTYPE>( 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<CDebugModule*>(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<ListView_GetItemCount(GetDlgItem( m_hWnd, IDC_MODULE_LIST ));i++)
|
|
{
|
|
int nFlags = (i == nIndex) ? LVIS_SELECTED|LVIS_FOCUSED : 0;
|
|
ListView_SetItemState( GetDlgItem( m_hWnd, IDC_MODULE_LIST ), i, nFlags, LVIS_SELECTED|LVIS_FOCUSED );
|
|
}
|
|
}
|
|
|
|
void OnOK( WPARAM, LPARAM )
|
|
{
|
|
// Update the value for the currently selected item
|
|
int nItem = GetCurrentSelectionIndex();
|
|
if (nItem >= 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<LPARAM>(this) );
|
|
|
|
// Save all the new ones
|
|
for (int i=0;i<ListView_GetItemCount(GetDlgItem( m_hWnd, IDC_MODULE_LIST ));i++)
|
|
{
|
|
CDebugModule *pDebugModule = GetDebugModule(i);
|
|
if (pDebugModule)
|
|
{
|
|
reg.Set( pDebugModule->Name(), 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<CDebugMaskDialog*>(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<LPTSTR>(pszName);
|
|
LvItem.lParam = reinterpret_cast<LPARAM>(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<LPTSTR>(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<LPARAM>(this) );
|
|
SelectItem(0);
|
|
|
|
WiaUiUtil::CenterWindow( m_hWnd, GetParent(m_hWnd) );
|
|
|
|
return 0;
|
|
}
|
|
|
|
LRESULT OnListDeleteItem( WPARAM, LPARAM lParam )
|
|
{
|
|
NMLISTVIEW *pNmListView = reinterpret_cast<NMLISTVIEW *>(lParam);
|
|
if (pNmListView)
|
|
{
|
|
if (pNmListView->iItem >= 0 && pNmListView->iSubItem == 0)
|
|
{
|
|
CDebugModule *pDebugModule = reinterpret_cast<CDebugModule *>(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<LPTSTR>(strMask.String()) );
|
|
}
|
|
|
|
LRESULT OnListItemChanged( WPARAM, LPARAM lParam )
|
|
{
|
|
NMLISTVIEW *pNmListView = reinterpret_cast<NMLISTVIEW *>(lParam);
|
|
if (pNmListView)
|
|
{
|
|
if (pNmListView->iItem >= 0 && (LVIF_STATE & pNmListView->uChanged) && ((pNmListView->uOldState & LVIS_SELECTED) ^ (pNmListView->uNewState & LVIS_SELECTED)))
|
|
{
|
|
CDebugModule *pDebugModule = reinterpret_cast<CDebugModule *>(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<LPARAM>(&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<LPARAM>(-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
|
|
|