872 lines
24 KiB
C++
872 lines
24 KiB
C++
/*++
|
|
|
|
Copyright (c) 1993-2001 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
ui.cpp
|
|
|
|
Abstract:
|
|
|
|
This function implements the ui (dialog) that controls the
|
|
options maintenace for drwatson.
|
|
|
|
Author:
|
|
|
|
Wesley Witt (wesw) 1-May-1993
|
|
|
|
Environment:
|
|
|
|
User Mode
|
|
|
|
--*/
|
|
|
|
#include "pch.cpp"
|
|
|
|
|
|
void
|
|
InitializeDialog(
|
|
HWND hwnd
|
|
);
|
|
|
|
void
|
|
InitializeCrashList(
|
|
HWND hwnd
|
|
);
|
|
|
|
BOOL
|
|
GetDialogValues(
|
|
HWND hwnd
|
|
);
|
|
|
|
INT_PTR
|
|
CALLBACK
|
|
LogFileViewerDialogProc(
|
|
HWND hwnd,
|
|
UINT message,
|
|
WPARAM wParam,
|
|
LPARAM lParam
|
|
);
|
|
|
|
INT_PTR
|
|
CALLBACK
|
|
DrWatsonDialogProc (
|
|
HWND hwnd,
|
|
UINT message,
|
|
WPARAM wParam,
|
|
LPARAM lParam
|
|
);
|
|
|
|
PTSTR
|
|
ExpandPath(
|
|
PTSTR lpPath
|
|
);
|
|
|
|
const
|
|
DWORD
|
|
DrWatsonHelpIds[] = {
|
|
ID_LOGPATH_TEXT, IDH_LOG_FILE_PATH,
|
|
ID_LOGPATH, IDH_LOG_FILE_PATH,
|
|
ID_BROWSE_LOGPATH, IDH_BROWSE,
|
|
ID_CRASH_DUMP_TEXT, IDH_CRASH_DUMP,
|
|
ID_CRASH_DUMP, IDH_CRASH_DUMP,
|
|
ID_BROWSE_CRASH, IDH_BROWSE,
|
|
ID_WAVEFILE_TEXT, IDH_WAVE_FILE,
|
|
ID_WAVE_FILE, IDH_WAVE_FILE,
|
|
ID_BROWSE_WAVEFILE, IDH_BROWSE,
|
|
|
|
ID_INSTRUCTIONS, IDH_NUMBER_OF_INSTRUCTIONS,
|
|
ID_NUM_CRASHES, IDH_NUMBER_OF_ERRORS_TO_SAVE,
|
|
|
|
ID_DUMPSYMBOLS, IDH_DUMP_SYMBOL_TABLE,
|
|
ID_DUMPALLTHREADS, IDH_DUMP_ALL_THREAD_CONTEXTS,
|
|
ID_APPENDTOLOGFILE, IDH_APPEND_TO_EXISTING_LOGFILE,
|
|
ID_VISUAL, IDH_VISUAL_NOTIFICATION,
|
|
ID_SOUND, IDH_SOUND_NOTIFICATION,
|
|
ID_CRASH, IDH_CREATE_CRASH_DUMP_FILE,
|
|
|
|
ID_LOGFILE_VIEW, IDH_VIEW,
|
|
ID_CLEAR, IDH_CLEAR,
|
|
ID_CRASHES, IDH_APPLICATION_ERRORS,
|
|
|
|
ID_TEST_WAVE, IDH_WAVE_FILE,
|
|
psh15, IDH_INDEX,
|
|
0, 0
|
|
};
|
|
|
|
|
|
void
|
|
DrWatsonWinMain(
|
|
void
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
This is the entry point for DRWTSN32
|
|
|
|
Arguments:
|
|
|
|
None.
|
|
|
|
Return Value:
|
|
|
|
None.
|
|
|
|
--*/
|
|
|
|
{
|
|
HWND hwnd;
|
|
MSG msg;
|
|
HINSTANCE hInst;
|
|
WNDCLASS wndclass;
|
|
|
|
|
|
hInst = GetModuleHandle( NULL );
|
|
wndclass.style = CS_HREDRAW | CS_VREDRAW;
|
|
wndclass.lpfnWndProc = (WNDPROC)DrWatsonDialogProc;
|
|
wndclass.cbClsExtra = 0;
|
|
wndclass.cbWndExtra = DLGWINDOWEXTRA;
|
|
wndclass.hInstance = hInst;
|
|
wndclass.hIcon = LoadIcon( hInst, MAKEINTRESOURCE(APPICON) );
|
|
wndclass.hCursor = LoadCursor( NULL, IDC_ARROW );
|
|
wndclass.hbrBackground = (HBRUSH) (COLOR_3DFACE + 1);
|
|
wndclass.lpszMenuName = NULL;
|
|
wndclass.lpszClassName = _T("DrWatsonDialog");
|
|
RegisterClass( &wndclass );
|
|
|
|
hwnd = CreateDialog( hInst,
|
|
MAKEINTRESOURCE( DRWATSONDIALOG ),
|
|
0,
|
|
DrWatsonDialogProc
|
|
);
|
|
|
|
if (hwnd == NULL) {
|
|
return;
|
|
}
|
|
|
|
ShowWindow( hwnd, SW_SHOWNORMAL );
|
|
|
|
while (GetMessage (&msg, NULL, 0, 0)) {
|
|
if (!IsDialogMessage( hwnd, &msg )) {
|
|
TranslateMessage (&msg) ;
|
|
DispatchMessage (&msg) ;
|
|
}
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
|
|
INT_PTR
|
|
CALLBACK
|
|
DrWatsonDialogProc (
|
|
HWND hwnd,
|
|
UINT message,
|
|
WPARAM wParam,
|
|
LPARAM lParam
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Window procedure for the DRWTSN32.EXE main user interface.
|
|
|
|
Arguments:
|
|
|
|
hwnd - window handle to the dialog box
|
|
|
|
message - message number
|
|
|
|
wParam - first message parameter
|
|
|
|
lParam - second message parameter
|
|
|
|
Return Value:
|
|
|
|
TRUE - did not process the message
|
|
FALSE - did process the message
|
|
|
|
--*/
|
|
|
|
{
|
|
DWORD helpId;
|
|
DWORD ctlId;
|
|
UINT Checked;
|
|
_TCHAR szCurrDir[MAX_PATH];
|
|
_TCHAR szWave[MAX_PATH];
|
|
_TCHAR szDump[MAX_PATH];
|
|
_TCHAR szHelpFileName[MAX_PATH];
|
|
PTSTR p;
|
|
PDWORD pdw;
|
|
|
|
|
|
switch (message) {
|
|
case WM_CREATE:
|
|
return 0;
|
|
|
|
case WM_INITDIALOG:
|
|
SubclassControls( hwnd );
|
|
InitializeDialog( hwnd );
|
|
return 1;
|
|
|
|
case WM_HELP: // F1 key and ?
|
|
|
|
ctlId = ((LPHELPINFO)lParam)->iCtrlId;
|
|
helpId = IDH_INDEX;
|
|
for (pdw = (PDWORD)DrWatsonHelpIds; *pdw; pdw+=2) {
|
|
if (*pdw == ctlId) {
|
|
helpId = pdw[1];
|
|
break;
|
|
}
|
|
}
|
|
if ( helpId == IDH_BROWSE ) {
|
|
_tcscpy( szHelpFileName, _T("windows.hlp") );
|
|
}
|
|
else {
|
|
GetWinHelpFileName( szHelpFileName,
|
|
sizeof(szHelpFileName) / sizeof(_TCHAR) );
|
|
}
|
|
|
|
WinHelp( (HWND)((LPHELPINFO) lParam)->hItemHandle,
|
|
szHelpFileName,
|
|
HELP_WM_HELP,
|
|
(DWORD_PTR)(LPVOID)DrWatsonHelpIds );
|
|
return TRUE;
|
|
|
|
case WM_CONTEXTMENU: // right mouse click
|
|
if( hwnd == (HWND) wParam ) {
|
|
POINT pt;
|
|
GetCursorPos(&pt);
|
|
ScreenToClient(hwnd, &pt);
|
|
wParam = (WPARAM) ChildWindowFromPoint(hwnd, pt);
|
|
}
|
|
|
|
ctlId = GetDlgCtrlID((HWND)wParam);
|
|
helpId = IDH_INDEX;
|
|
for (pdw = (PDWORD)DrWatsonHelpIds; *pdw; pdw+=2) {
|
|
if (*pdw == ctlId) {
|
|
helpId = pdw[1];
|
|
break;
|
|
}
|
|
}
|
|
if ( helpId == IDH_BROWSE ) {
|
|
_tcscpy( szHelpFileName, _T("windows.hlp") );
|
|
}
|
|
else {
|
|
GetWinHelpFileName( szHelpFileName,
|
|
sizeof(szHelpFileName) / sizeof(_TCHAR) );
|
|
}
|
|
WinHelp((HWND)wParam,
|
|
szHelpFileName,
|
|
HELP_CONTEXTMENU,
|
|
(DWORD_PTR)DrWatsonHelpIds
|
|
);
|
|
return TRUE;
|
|
|
|
case WM_ACTIVATEAPP:
|
|
case WM_SETFOCUS:
|
|
SetFocusToCurrentControl();
|
|
return 0;
|
|
|
|
case WM_SYSCOMMAND:
|
|
if (wParam == ID_ABOUT) {
|
|
_TCHAR title[256];
|
|
_TCHAR extra[256];
|
|
|
|
_tcscpy( title, LoadRcString( IDS_ABOUT_TITLE ) );
|
|
_tcscpy( extra, LoadRcString( IDS_ABOUT_EXTRA ) );
|
|
|
|
ShellAbout( hwnd,
|
|
title,
|
|
extra,
|
|
LoadIcon( GetModuleHandle(NULL), MAKEINTRESOURCE(APPICON) )
|
|
);
|
|
|
|
return 0;
|
|
}
|
|
break;
|
|
|
|
case WM_COMMAND:
|
|
switch (wParam) {
|
|
case IDOK:
|
|
if (GetDialogValues( hwnd )) {
|
|
HtmlHelp( NULL, NULL, HH_CLOSE_ALL, 0);
|
|
PostQuitMessage( 0 );
|
|
}
|
|
break;
|
|
|
|
case IDCANCEL:
|
|
HtmlHelp( NULL, NULL, HH_CLOSE_ALL, 0);
|
|
PostQuitMessage( 0 );
|
|
break;
|
|
|
|
case ID_BROWSE_LOGPATH:
|
|
GetDlgItemText( hwnd, ID_LOGPATH, szCurrDir, MAX_PATH );
|
|
p = ExpandPath( szCurrDir );
|
|
if (p) {
|
|
_tcscpy( szCurrDir, p );
|
|
free( p );
|
|
}
|
|
EnableWindow( GetDlgItem( hwnd, ID_BROWSE_LOGPATH ), FALSE );
|
|
if (BrowseForDirectory(hwnd, szCurrDir )) {
|
|
SetDlgItemText( hwnd, ID_LOGPATH, szCurrDir );
|
|
}
|
|
EnableWindow( GetDlgItem( hwnd, ID_BROWSE_LOGPATH ), TRUE );
|
|
SetFocus( GetDlgItem(hwnd, ID_BROWSE_LOGPATH) );
|
|
return FALSE;
|
|
break;
|
|
|
|
case ID_BROWSE_WAVEFILE:
|
|
szWave[0] = _T('\0');
|
|
GetDlgItemText( hwnd, ID_WAVE_FILE, szWave, MAX_PATH );
|
|
EnableWindow( GetDlgItem( hwnd, ID_BROWSE_WAVEFILE ), FALSE );
|
|
if (GetWaveFileName(hwnd, szWave )) {
|
|
SetDlgItemText( hwnd, ID_WAVE_FILE, szWave );
|
|
}
|
|
EnableWindow( GetDlgItem( hwnd, ID_BROWSE_WAVEFILE ), TRUE );
|
|
SetFocus( GetDlgItem(hwnd, ID_BROWSE_WAVEFILE) );
|
|
return FALSE;
|
|
break;
|
|
|
|
case ID_BROWSE_CRASH:
|
|
szDump[0] = _T('\0');
|
|
GetDlgItemText( hwnd, ID_CRASH_DUMP, szDump, MAX_PATH );
|
|
EnableWindow( GetDlgItem( hwnd, ID_BROWSE_CRASH ), FALSE );
|
|
if (GetDumpFileName(hwnd, szDump )) {
|
|
SetDlgItemText( hwnd, ID_CRASH_DUMP, szDump );
|
|
}
|
|
EnableWindow( GetDlgItem( hwnd, ID_BROWSE_CRASH ), TRUE );
|
|
SetFocus( GetDlgItem(hwnd, ID_BROWSE_CRASH) );
|
|
return FALSE;
|
|
break;
|
|
|
|
case ID_CLEAR:
|
|
ElClearAllEvents();
|
|
InitializeCrashList( hwnd );
|
|
break;
|
|
|
|
case ID_TEST_WAVE:
|
|
GetDlgItemText( hwnd, ID_WAVE_FILE, szWave, sizeof(szWave) / sizeof(_TCHAR) );
|
|
PlaySound( szWave, NULL, SND_FILENAME );
|
|
break;
|
|
|
|
case ID_LOGFILE_VIEW:
|
|
DialogBoxParam( GetModuleHandle( NULL ),
|
|
MAKEINTRESOURCE( LOGFILEVIEWERDIALOG ),
|
|
hwnd,
|
|
LogFileViewerDialogProc,
|
|
SendMessage((HWND)GetDlgItem(hwnd,ID_CRASHES),
|
|
LB_GETCURSEL,0,0)
|
|
);
|
|
break;
|
|
|
|
case IDHELP:
|
|
//
|
|
// call HtmlHelp
|
|
//
|
|
GetHtmlHelpFileName( szHelpFileName, sizeof(szHelpFileName) / sizeof(_TCHAR) );
|
|
HtmlHelp( hwnd,
|
|
szHelpFileName,
|
|
HH_DISPLAY_TOPIC,
|
|
(DWORD_PTR)(IDHH_INDEX)
|
|
);
|
|
SetFocus( GetDlgItem(hwnd, IDHELP) );
|
|
break;
|
|
|
|
default:
|
|
if (((HWND)lParam == GetDlgItem( hwnd, ID_CRASHES )) &&
|
|
(HIWORD( wParam ) == LBN_DBLCLK)) {
|
|
DialogBoxParam( GetModuleHandle( NULL ),
|
|
MAKEINTRESOURCE( LOGFILEVIEWERDIALOG ),
|
|
hwnd,
|
|
LogFileViewerDialogProc,
|
|
SendMessage((HWND)lParam,LB_GETCURSEL,0,0)
|
|
);
|
|
}
|
|
if (((HWND)lParam == GetDlgItem( hwnd, ID_CRASH )) &&
|
|
(HIWORD( wParam ) == BN_CLICKED)) {
|
|
Checked = IsDlgButtonChecked( hwnd, ID_CRASH );
|
|
EnableWindow( GetDlgItem( hwnd, ID_CRASH_DUMP_TEXT ), Checked == 1 );
|
|
EnableWindow( GetDlgItem( hwnd, ID_CRASH_DUMP ), Checked == 1 );
|
|
EnableWindow( GetDlgItem( hwnd, ID_BROWSE_CRASH ), Checked == 1 );
|
|
EnableWindow( GetDlgItem( hwnd, ID_DUMP_TYPE_TEXT ), Checked == 1 );
|
|
EnableWindow( GetDlgItem( hwnd, ID_DUMP_TYPE_FULL_OLD ), Checked == 1 );
|
|
EnableWindow( GetDlgItem( hwnd, ID_DUMP_TYPE_MINI ), Checked == 1 );
|
|
EnableWindow( GetDlgItem( hwnd, ID_DUMP_TYPE_FULLMINI ), Checked == 1 );
|
|
}
|
|
if (((HWND)lParam == GetDlgItem( hwnd, ID_SOUND )) &&
|
|
(HIWORD( wParam ) == BN_CLICKED)) {
|
|
Checked = IsDlgButtonChecked( hwnd, ID_SOUND );
|
|
EnableWindow( GetDlgItem( hwnd, ID_WAVEFILE_TEXT ), Checked == 1 );
|
|
EnableWindow( GetDlgItem( hwnd, ID_WAVE_FILE ), Checked == 1 );
|
|
EnableWindow( GetDlgItem( hwnd, ID_BROWSE_WAVEFILE ), Checked == 1 );
|
|
}
|
|
break;
|
|
}
|
|
break;
|
|
|
|
case IDH_WAVE_FILE:
|
|
//
|
|
// call HtmlHelp
|
|
//
|
|
GetHtmlHelpFileName( szHelpFileName, sizeof(szHelpFileName) / sizeof(_TCHAR) );
|
|
HtmlHelp(hwnd,
|
|
szHelpFileName,
|
|
HH_DISPLAY_TOPIC,
|
|
(DWORD_PTR)(IDHH_WAVEFILE)
|
|
);
|
|
break;
|
|
case IDH_CRASH_DUMP:
|
|
//
|
|
// call HtmlHelp
|
|
//
|
|
GetHtmlHelpFileName( szHelpFileName, sizeof(szHelpFileName) / sizeof(_TCHAR) );
|
|
HtmlHelp( hwnd,
|
|
szHelpFileName,
|
|
HH_DISPLAY_TOPIC,
|
|
(DWORD_PTR)(IDHH_LOGFILELOCATION)
|
|
);
|
|
break;
|
|
|
|
|
|
case WM_DESTROY:
|
|
HtmlHelp( NULL, NULL, HH_CLOSE_ALL, 0);
|
|
PostQuitMessage( 0 );
|
|
return 0;
|
|
}
|
|
|
|
return DefWindowProc( hwnd, message, wParam, lParam );
|
|
}
|
|
|
|
BOOL
|
|
CALLBACK
|
|
EnumCrashes(
|
|
PCRASHINFO crashInfo
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Enumeration function for crash records. This function is called
|
|
once for each crash record. This function places the formatted
|
|
crash data in a listbox.
|
|
|
|
Arguments:
|
|
|
|
crashInfo - pointer to a CRASHINFO structure
|
|
|
|
Return Value:
|
|
|
|
TRUE - caller should continue calling the enum procedure
|
|
FALSE - caller should stop calling the enum procedure
|
|
|
|
--*/
|
|
|
|
{
|
|
SIZE size;
|
|
_TCHAR buf[1024];
|
|
|
|
_stprintf( buf, _T("%s %08x %s(%08p)"),
|
|
crashInfo->crash.szAppName,
|
|
crashInfo->crash.dwExceptionCode,
|
|
crashInfo->crash.szFunction,
|
|
crashInfo->crash.dwAddress
|
|
);
|
|
SendMessage( crashInfo->hList, LB_ADDSTRING, 0, (LPARAM)buf );
|
|
|
|
|
|
GetTextExtentPoint( crashInfo->hdc, buf, _tcslen(buf), &size );
|
|
if (size.cx > (LONG)crashInfo->cxExtent) {
|
|
crashInfo->cxExtent = size.cx;
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
void
|
|
InitializeCrashList(
|
|
HWND hwnd
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Initializes the listbox that contains the crash information.
|
|
|
|
Arguments:
|
|
|
|
None.
|
|
|
|
Return Value:
|
|
|
|
None.
|
|
|
|
--*/
|
|
|
|
{
|
|
CRASHINFO crashInfo;
|
|
TEXTMETRIC tm;
|
|
HFONT hFont;
|
|
|
|
crashInfo.hList = GetDlgItem( hwnd, ID_CRASHES );
|
|
SendMessage( crashInfo.hList, LB_RESETCONTENT, FALSE, 0L );
|
|
SendMessage( crashInfo.hList, WM_SETREDRAW, FALSE, 0L );
|
|
crashInfo.hdc = GetDC( crashInfo.hList );
|
|
crashInfo.cxExtent = 0;
|
|
|
|
ElEnumCrashes( &crashInfo, EnumCrashes );
|
|
|
|
hFont = (HFONT)SendMessage( crashInfo.hList, WM_GETFONT, 0, 0L );
|
|
if (hFont != NULL) {
|
|
SelectObject( crashInfo.hdc, hFont );
|
|
}
|
|
if (crashInfo.hdc != NULL) {
|
|
GetTextMetrics( crashInfo.hdc, &tm );
|
|
ReleaseDC( crashInfo.hList, crashInfo.hdc );
|
|
}
|
|
SendMessage( crashInfo.hList, LB_SETHORIZONTALEXTENT, crashInfo.cxExtent, 0L );
|
|
SendMessage( crashInfo.hList, WM_SETREDRAW, TRUE, 0L );
|
|
|
|
return;
|
|
}
|
|
|
|
void
|
|
InitializeDialog(
|
|
HWND hwnd
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Initializes the DRWTSN32 user interface dialog with the values
|
|
stored in the registry.
|
|
|
|
Arguments:
|
|
|
|
hwnd - window handle to the dialog
|
|
|
|
Return Value:
|
|
|
|
None.
|
|
|
|
--*/
|
|
|
|
{
|
|
OPTIONS o;
|
|
_TCHAR buf[256];
|
|
HMENU hMenu;
|
|
|
|
|
|
RegInitialize( &o );
|
|
SetDlgItemText( hwnd, ID_LOGPATH, o.szLogPath );
|
|
SetDlgItemText( hwnd, ID_WAVE_FILE, o.szWaveFile );
|
|
SetDlgItemText( hwnd, ID_CRASH_DUMP, o.szCrashDump );
|
|
_stprintf( buf, _T("%d"), o.dwMaxCrashes );
|
|
SetDlgItemText( hwnd, ID_NUM_CRASHES, buf );
|
|
_stprintf( buf, _T("%d"), o.dwInstructions );
|
|
SetDlgItemText( hwnd, ID_INSTRUCTIONS, buf );
|
|
SendMessage( GetDlgItem( hwnd, ID_DUMPSYMBOLS ), BM_SETCHECK, o.fDumpSymbols, 0 );
|
|
SendMessage( GetDlgItem( hwnd, ID_DUMPALLTHREADS ), BM_SETCHECK, o.fDumpAllThreads, 0 );
|
|
SendMessage( GetDlgItem( hwnd, ID_APPENDTOLOGFILE ), BM_SETCHECK, o.fAppendToLogFile, 0 );
|
|
SendMessage( GetDlgItem( hwnd, ID_VISUAL ), BM_SETCHECK, o.fVisual, 0 );
|
|
SendMessage( GetDlgItem( hwnd, ID_SOUND ), BM_SETCHECK, o.fSound, 0 );
|
|
SendMessage( GetDlgItem( hwnd, ID_CRASH ), BM_SETCHECK, o.fCrash, 0 );
|
|
SendMessage( GetDlgItem( hwnd, ID_DUMP_TYPE_FULL_OLD ), BM_SETCHECK, o.dwType == FullDump, 0 );
|
|
SendMessage( GetDlgItem( hwnd, ID_DUMP_TYPE_MINI ), BM_SETCHECK, o.dwType == MiniDump, 0 );
|
|
SendMessage( GetDlgItem( hwnd, ID_DUMP_TYPE_FULLMINI ), BM_SETCHECK, o.dwType == FullMiniDump, 0 );
|
|
|
|
if (waveOutGetNumDevs() == 0) {
|
|
EnableWindow( GetDlgItem( hwnd, ID_WAVEFILE_TEXT ), FALSE );
|
|
EnableWindow( GetDlgItem( hwnd, ID_WAVE_FILE ), FALSE );
|
|
EnableWindow( GetDlgItem( hwnd, ID_BROWSE_WAVEFILE ), FALSE );
|
|
}
|
|
else {
|
|
EnableWindow( GetDlgItem( hwnd, ID_WAVEFILE_TEXT ), o.fSound );
|
|
EnableWindow( GetDlgItem( hwnd, ID_WAVE_FILE ), o.fSound );
|
|
EnableWindow( GetDlgItem( hwnd, ID_BROWSE_WAVEFILE ), o.fSound );
|
|
}
|
|
|
|
EnableWindow( GetDlgItem( hwnd, ID_CRASH_DUMP_TEXT ), o.fCrash );
|
|
EnableWindow( GetDlgItem( hwnd, ID_CRASH_DUMP ), o.fCrash );
|
|
EnableWindow( GetDlgItem( hwnd, ID_BROWSE_CRASH ), o.fCrash );
|
|
EnableWindow( GetDlgItem( hwnd, ID_DUMP_TYPE_TEXT ), o.fCrash );
|
|
EnableWindow( GetDlgItem( hwnd, ID_DUMP_TYPE_FULL_OLD ), o.fCrash );
|
|
EnableWindow( GetDlgItem( hwnd, ID_DUMP_TYPE_MINI ), o.fCrash );
|
|
EnableWindow( GetDlgItem( hwnd, ID_DUMP_TYPE_FULLMINI ), o.fCrash );
|
|
|
|
InitializeCrashList( hwnd );
|
|
|
|
if (SendMessage( GetDlgItem( hwnd, ID_CRASHES ), LB_GETCOUNT, 0 ,0 ) == 0) {
|
|
EnableWindow( GetDlgItem( hwnd, ID_CLEAR ), FALSE );
|
|
EnableWindow( GetDlgItem( hwnd, ID_LOGFILE_VIEW ), FALSE );
|
|
}
|
|
|
|
hMenu = GetSystemMenu( hwnd, FALSE );
|
|
if (hMenu != NULL) {
|
|
AppendMenu( hMenu, MF_SEPARATOR, 0, NULL );
|
|
AppendMenu( hMenu, MF_STRING, ID_ABOUT, LoadRcString( IDS_ABOUT ) );
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
BOOL
|
|
GetDialogValues(
|
|
HWND hwnd
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Retrieves the values in the DRWTSN32 dialog controls and saves
|
|
them in the registry.
|
|
|
|
Arguments:
|
|
|
|
hwnd - window handle to the dialog
|
|
|
|
Return Value:
|
|
|
|
TRUE - all values were retrieved and saved
|
|
FALSE - an error occurred
|
|
|
|
--*/
|
|
|
|
{
|
|
OPTIONS o;
|
|
_TCHAR buf[256];
|
|
DWORD dwFa;
|
|
PTSTR p,p1;
|
|
_TCHAR szDrive [_MAX_DRIVE];
|
|
_TCHAR szDir [_MAX_DIR];
|
|
_TCHAR szPath [MAX_PATH];
|
|
|
|
|
|
RegInitialize( &o );
|
|
|
|
GetDlgItemText( hwnd, ID_LOGPATH, buf, sizeof(buf) / sizeof(_TCHAR) );
|
|
p = ExpandPath( buf );
|
|
if (p) {
|
|
dwFa = GetFileAttributes( p );
|
|
free( p );
|
|
} else {
|
|
dwFa = GetFileAttributes( buf );
|
|
}
|
|
if ((dwFa == 0xffffffff) || (!(dwFa&FILE_ATTRIBUTE_DIRECTORY))) {
|
|
NonFatalError( LoadRcString(IDS_INVALID_PATH) );
|
|
return FALSE;
|
|
}
|
|
if (_tcslen(buf) > 0) {
|
|
_tcscpy( o.szLogPath, buf );
|
|
}
|
|
|
|
o.fCrash = SendMessage( GetDlgItem( hwnd, ID_CRASH ), BM_GETCHECK, 0, 0 ) ? TRUE : FALSE;
|
|
|
|
GetDlgItemText( hwnd, ID_CRASH_DUMP, buf, sizeof(buf) / sizeof(_TCHAR) );
|
|
if (o.fCrash) {
|
|
p = ExpandPath( buf );
|
|
if (p) {
|
|
dwFa = GetFileAttributes( p );
|
|
free( p );
|
|
} else {
|
|
dwFa = GetFileAttributes( buf );
|
|
}
|
|
if (dwFa == 0xffffffff) {
|
|
//
|
|
// file does not exist, check to see if the dir is ok
|
|
//
|
|
p = ExpandPath( buf );
|
|
if (p) {
|
|
p1 = p;
|
|
} else {
|
|
p1 = buf;
|
|
}
|
|
_tsplitpath( p1, szDrive, szDir, NULL, NULL );
|
|
_tmakepath( szPath, szDrive, szDir, NULL, NULL );
|
|
if (p) {
|
|
free( p );
|
|
}
|
|
dwFa = GetFileAttributes( szPath );
|
|
if (dwFa == 0xffffffff) {
|
|
NonFatalError( LoadRcString(IDS_INVALID_CRASH_PATH) );
|
|
return FALSE;
|
|
}
|
|
} else if (dwFa & FILE_ATTRIBUTE_DIRECTORY) {
|
|
NonFatalError( LoadRcString(IDS_INVALID_CRASH_PATH) );
|
|
return FALSE;
|
|
}
|
|
if (_tcslen(buf) > 0) {
|
|
_tcscpy( o.szCrashDump, buf );
|
|
}
|
|
if (SendMessage( GetDlgItem( hwnd, ID_DUMP_TYPE_FULL_OLD ), BM_GETCHECK, 0, 0 )) {
|
|
o.dwType = FullDump;
|
|
} else if (SendMessage( GetDlgItem( hwnd, ID_DUMP_TYPE_MINI ), BM_GETCHECK, 0, 0 )) {
|
|
o.dwType = MiniDump;
|
|
} else if (SendMessage( GetDlgItem( hwnd, ID_DUMP_TYPE_FULLMINI ), BM_GETCHECK, 0, 0 )) {
|
|
o.dwType = FullMiniDump;
|
|
}
|
|
}
|
|
|
|
GetDlgItemText( hwnd, ID_WAVE_FILE, buf, sizeof(buf) / sizeof(_TCHAR) );
|
|
if (_tcslen(buf) > 0) {
|
|
dwFa = GetFileAttributes( buf );
|
|
if ((dwFa == 0xffffffff) || (dwFa&FILE_ATTRIBUTE_DIRECTORY)) {
|
|
NonFatalError( LoadRcString(IDS_INVALID_WAVE) );
|
|
return FALSE;
|
|
}
|
|
}
|
|
|
|
_tcscpy( o.szWaveFile, buf );
|
|
|
|
GetDlgItemText( hwnd, ID_NUM_CRASHES, buf, sizeof(buf) / sizeof(_TCHAR) );
|
|
o.dwMaxCrashes = (DWORD) _ttol( buf );
|
|
|
|
GetDlgItemText( hwnd, ID_INSTRUCTIONS, buf, sizeof(buf) / sizeof(_TCHAR) );
|
|
o.dwInstructions = (DWORD) _ttol( buf );
|
|
|
|
o.fDumpSymbols = SendMessage( GetDlgItem( hwnd, ID_DUMPSYMBOLS ), BM_GETCHECK, 0, 0 ) ? TRUE : FALSE;
|
|
o.fDumpAllThreads = SendMessage( GetDlgItem( hwnd, ID_DUMPALLTHREADS ), BM_GETCHECK, 0, 0 ) ? TRUE : FALSE;
|
|
o.fAppendToLogFile = SendMessage( GetDlgItem( hwnd, ID_APPENDTOLOGFILE ), BM_GETCHECK, 0, 0 ) ? TRUE : FALSE;
|
|
o.fVisual = SendMessage( GetDlgItem( hwnd, ID_VISUAL ), BM_GETCHECK, 0, 0 ) ? TRUE : FALSE;
|
|
o.fSound = SendMessage( GetDlgItem( hwnd, ID_SOUND ), BM_GETCHECK, 0, 0 ) ? TRUE : FALSE;
|
|
|
|
RegSave( &o );
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL
|
|
CALLBACK
|
|
EnumCrashesForViewer(
|
|
PCRASHINFO crashInfo
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Enumeration function for crash records. This function is called
|
|
once for each crash record. This function looks for s specific crash
|
|
that is identified by the crashIndex.
|
|
|
|
Arguments:
|
|
|
|
crashInfo - pointer to a CRASHINFO structure
|
|
|
|
Return Value:
|
|
|
|
TRUE - caller should continue calling the enum procedure
|
|
FALSE - caller should stop calling the enum procedure
|
|
|
|
--*/
|
|
|
|
{
|
|
PWSTR p;
|
|
|
|
if ((crashInfo->dwIndex == crashInfo->dwIndexDesired) &&
|
|
(crashInfo->dwCrashDataSize > 0) ) {
|
|
p = (PWSTR)crashInfo->pCrashData;
|
|
crashInfo->pCrashData = (PBYTE)
|
|
calloc( crashInfo->dwCrashDataSize+10, sizeof(BYTE) );
|
|
if (crashInfo->pCrashData != NULL) {
|
|
if (IsTextUnicode(p, crashInfo->dwCrashDataSize, NULL)) {
|
|
WideCharToMultiByte(CP_ACP, WC_SEPCHARS | WC_COMPOSITECHECK,
|
|
p, crashInfo->dwCrashDataSize,
|
|
(LPSTR)crashInfo->pCrashData, crashInfo->dwCrashDataSize + 10, NULL, NULL);
|
|
} else {
|
|
memcpy( crashInfo->pCrashData, p, crashInfo->dwCrashDataSize+10 );
|
|
}
|
|
crashInfo->pCrashData[crashInfo->dwCrashDataSize] = 0;
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
crashInfo->dwIndex++;
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
INT_PTR
|
|
CALLBACK
|
|
LogFileViewerDialogProc(
|
|
HWND hwnd,
|
|
UINT message,
|
|
WPARAM wParam,
|
|
LPARAM lParam
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Window procedure for the log file viewer dialog box.
|
|
|
|
Arguments:
|
|
|
|
hwnd - window handle to the dialog box
|
|
|
|
message - message number
|
|
|
|
wParam - first message parameter
|
|
|
|
lParam - second message parameter
|
|
|
|
Return Value:
|
|
|
|
TRUE - did not process the message
|
|
FALSE - did process the message
|
|
|
|
--*/
|
|
|
|
{
|
|
static CRASHINFO crashInfo;
|
|
HFONT hFont;
|
|
|
|
switch (message) {
|
|
case WM_INITDIALOG:
|
|
hFont = (HFONT)GetStockObject( SYSTEM_FIXED_FONT );
|
|
Assert( hFont != NULL );
|
|
|
|
SendDlgItemMessage( hwnd,
|
|
ID_LOGFILE_VIEW,
|
|
WM_SETFONT,
|
|
(WPARAM) hFont,
|
|
(LPARAM) FALSE
|
|
);
|
|
|
|
crashInfo.dwIndex = 0;
|
|
crashInfo.dwIndexDesired = (DWORD)lParam;
|
|
ElEnumCrashes( &crashInfo, EnumCrashesForViewer );
|
|
if (crashInfo.dwIndex != crashInfo.dwIndexDesired) {
|
|
MessageBeep( 0 );
|
|
EndDialog( hwnd, 0 );
|
|
return FALSE;
|
|
}
|
|
SetDlgItemTextA( hwnd, ID_LOGFILE_VIEW,
|
|
(LPSTR)crashInfo.pCrashData );
|
|
|
|
return TRUE;
|
|
|
|
case WM_COMMAND:
|
|
if (wParam == IDOK) {
|
|
free( crashInfo.pCrashData );
|
|
EndDialog( hwnd, 0 );
|
|
}
|
|
break;
|
|
case WM_CLOSE:
|
|
free( crashInfo.pCrashData );
|
|
EndDialog( hwnd, 0 );
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|