1688 lines
51 KiB
C
1688 lines
51 KiB
C
/*++
|
|
|
|
Copyright (c) 1992 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
Init.c
|
|
|
|
Abstract:
|
|
|
|
This module contains the initialization routines for Windbg.
|
|
|
|
Author:
|
|
|
|
David J. Gilman (davegi) 21-Apr-1992
|
|
Griffith Wm. Kadnier (v-griffk) 17-Sep-1992
|
|
|
|
Environment:
|
|
|
|
Win32, User Mode
|
|
|
|
--*/
|
|
|
|
#include "precomp.h"
|
|
#pragma hdrstop
|
|
|
|
#include <ntiodump.h>
|
|
#include <crash.h>
|
|
|
|
#include "include\cntxthlp.h"
|
|
|
|
|
|
DWORD GetComPorts(VOID);
|
|
|
|
void DisplayHelpContents(HWND hwnd, DWORD dwHelpContextId);
|
|
|
|
|
|
char DebuggerName[ MAX_PATH ];
|
|
|
|
extern HMENU hMainMenuSave;
|
|
extern CRITICAL_SECTION csLog;
|
|
|
|
/*** InitApplication - Initialize the Application specific information
|
|
|
|
** Synopsis:
|
|
** bool = InitApplication(hInstance)
|
|
|
|
** Entry:
|
|
** hInstance - Instance handle for Win16, Module handle for Win32
|
|
|
|
** Returns:
|
|
** TRUE if sucessful and FALSE otherwise
|
|
|
|
** Description:
|
|
** Initializes window data and registers window classes.
|
|
|
|
*/
|
|
|
|
BOOL
|
|
InitApplication(
|
|
HINSTANCE hInstance
|
|
)
|
|
{
|
|
WNDCLASS wc;
|
|
char szClassName[MAX_MSG_TXT];
|
|
|
|
|
|
// Load the richedit dll so that it can register the window class.
|
|
{
|
|
// Since we intentionally need this library the entire duration, we
|
|
// simply load it and lose the handle to it. We are in win32 and running
|
|
// separate address spaces, and don't have to worry about freeing the
|
|
// library. Besides KENTF said it was okay to do it this way. If you have
|
|
// any problems with this code, please ask him to explain the error of YOUR
|
|
// ways. :)>
|
|
if (NULL == LoadLibrary("RICHED32.DLL")) {
|
|
FatalErrorBox(ERR_Init_Application, NULL);
|
|
return FALSE;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
//We use tmp strings as edit buffers
|
|
Assert(MAX_LINE_SIZE < TMP_STRING_SIZE);
|
|
|
|
//Register the main window szClassName
|
|
//Associates QcQp Icon
|
|
//Associates Standard Arrow Cursor
|
|
//Associates QcQp Menu
|
|
|
|
wc.style = 0;
|
|
wc.lpfnWndProc = MainWndProc;
|
|
wc.cbClsExtra = 0;
|
|
wc.cbWndExtra = 0;
|
|
wc.hInstance = hInstance;
|
|
|
|
Dbg(wc.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(QCQPICON)));
|
|
wc.hbrBackground = (HBRUSH) (COLOR_APPWORKSPACE + 1);
|
|
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
|
|
wc.lpszMenuName = MAKEINTRESOURCE(MAIN_MENU);
|
|
Dbg(LoadString(hInstance, SYS_Main_wClass, szClassName, MAX_MSG_TXT));
|
|
wc.lpszClassName = szClassName;
|
|
if (!RegisterClass (&wc) ) {
|
|
return FALSE;
|
|
}
|
|
|
|
//Register the MDI child szClassName
|
|
//Associates Child Icon
|
|
|
|
wc.style = 0;
|
|
wc.lpfnWndProc = MDIChildWndProc;
|
|
wc.cbClsExtra = 0;
|
|
wc.cbWndExtra = CBWNDEXTRA;
|
|
wc.hInstance = hInstance;
|
|
|
|
Dbg(wc.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(DOCICON)));
|
|
wc.hbrBackground = (HBRUSH) (COLOR_APPWORKSPACE + 1);
|
|
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
|
|
wc.lpszMenuName = NULL;
|
|
Dbg(LoadString(hInstance, SYS_Child_wClass, szClassName, MAX_MSG_TXT));
|
|
wc.lpszClassName = szClassName;
|
|
if (!RegisterClass(&wc)) {
|
|
return FALSE;
|
|
}
|
|
|
|
#if !defined( NEW_WINDOWING_CODE )
|
|
//Register the Cpu child szClassName
|
|
//Associates Cpu Icon
|
|
|
|
wc.style = 0;
|
|
wc.lpfnWndProc = MDIPaneWndProc;
|
|
wc.cbClsExtra = 0;
|
|
wc.cbWndExtra = CBWNDEXTRA;
|
|
wc.hInstance = hInstance;
|
|
|
|
Dbg(wc.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(CPUICON)));
|
|
wc.hbrBackground = (HBRUSH) CreateSolidBrush(GRAYDARK);
|
|
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
|
|
wc.lpszMenuName = NULL;
|
|
Dbg(LoadString(hInstance, SYS_Cpu_wClass, szClassName, MAX_MSG_TXT));
|
|
wc.lpszClassName = szClassName;
|
|
if (!RegisterClass(&wc)) {
|
|
return FALSE;
|
|
}
|
|
|
|
//Register the Memory child szClassName
|
|
//Associates Memory Icon
|
|
|
|
wc.style = 0;
|
|
wc.lpfnWndProc = MDIChildWndProc;
|
|
wc.cbClsExtra = 0;
|
|
wc.cbWndExtra = CBWNDEXTRA;
|
|
wc.hInstance = hInstance;
|
|
|
|
Dbg(wc.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE( MEMORYICON )));
|
|
wc.hbrBackground = (HBRUSH) (COLOR_APPWORKSPACE + 1);
|
|
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
|
|
wc.lpszMenuName = NULL;
|
|
Dbg(LoadString(hInstance, SYS_Memory_wClass, szClassName, MAX_MSG_TXT));
|
|
wc.lpszClassName = szClassName;
|
|
if (!RegisterClass(&wc)) {
|
|
return FALSE;
|
|
}
|
|
|
|
//Register the Command child szClassName
|
|
//Associates Command Icon
|
|
|
|
wc.style = 0;
|
|
wc.lpfnWndProc = MDIChildWndProc;
|
|
wc.cbClsExtra = 0;
|
|
wc.cbWndExtra = CBWNDEXTRA;
|
|
wc.hInstance = hInstance;
|
|
|
|
Dbg(wc.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE( CMDICON )));
|
|
wc.hbrBackground = (HBRUSH) (COLOR_APPWORKSPACE + 1);
|
|
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
|
|
wc.lpszMenuName = NULL;
|
|
Dbg(LoadString(hInstance, SYS_Cmd_wClass, szClassName, MAX_MSG_TXT));
|
|
wc.lpszClassName = szClassName;
|
|
if (!RegisterClass(&wc)) {
|
|
return FALSE;
|
|
}
|
|
|
|
//Register the Floating Point child szClassName
|
|
//Associates Floating Point Icon
|
|
|
|
wc.style = 0;
|
|
wc.lpfnWndProc = MDIPaneWndProc;
|
|
wc.cbClsExtra = 0;
|
|
wc.cbWndExtra = CBWNDEXTRA;
|
|
wc.hInstance = hInstance;
|
|
|
|
Dbg(wc.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE( FLOATICON )));
|
|
wc.hbrBackground = (HBRUSH) CreateSolidBrush(GRAYDARK);
|
|
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
|
|
wc.lpszMenuName = NULL;
|
|
Dbg(LoadString(hInstance, SYS_Float_wClass, szClassName, MAX_MSG_TXT));
|
|
wc.lpszClassName = szClassName;
|
|
if (!RegisterClass(&wc)) {
|
|
return FALSE;
|
|
}
|
|
|
|
wc.hIcon = NULL;
|
|
strcpy(LpszCommandLine, wc.lpszClassName);
|
|
wc.lpszClassName = LpszCommandLine;
|
|
(*LpszCommandLine) += 1;
|
|
if (!RegisterClass(&wc)) {
|
|
return FALSE;
|
|
}
|
|
|
|
//Register the Locals child szClassName
|
|
//Associates Locals Icon
|
|
|
|
wc.style = 0;
|
|
wc.lpfnWndProc = MDIPaneWndProc;
|
|
wc.cbClsExtra = 0;
|
|
wc.cbWndExtra = CBWNDEXTRA;
|
|
wc.hInstance = hInstance;
|
|
|
|
Dbg(wc.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE( LOCALSICON )));
|
|
wc.hbrBackground = (HBRUSH) CreateSolidBrush(GRAYDARK);
|
|
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
|
|
wc.lpszMenuName = NULL;
|
|
Dbg(LoadString(hInstance, SYS_Locals_wClass, szClassName, MAX_MSG_TXT));
|
|
wc.lpszClassName = szClassName;
|
|
if (!RegisterClass(&wc)) {
|
|
return FALSE;
|
|
}
|
|
|
|
//Register the Watch child szClassName
|
|
//Associates Watch Icon
|
|
|
|
wc.style = 0;
|
|
wc.lpfnWndProc = MDIPaneWndProc;
|
|
wc.cbClsExtra = 0;
|
|
wc.cbWndExtra = CBWNDEXTRA;
|
|
wc.hInstance = hInstance;
|
|
|
|
Dbg(wc.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE( WATCHICON )));
|
|
wc.hbrBackground = (HBRUSH) CreateSolidBrush(GRAYDARK);
|
|
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
|
|
wc.lpszMenuName = NULL;
|
|
Dbg(LoadString(hInstance, SYS_Watch_wClass, szClassName, MAX_MSG_TXT));
|
|
wc.lpszClassName = szClassName;
|
|
if (!RegisterClass(&wc)) {
|
|
return FALSE;
|
|
}
|
|
#endif // ! NEW_WINDOWING_CODE
|
|
|
|
//Register the QuickWatch Watch child szClassName
|
|
//Associates Watch Icon
|
|
|
|
wc.style = 0;
|
|
wc.lpfnWndProc = DLGPaneWndProc;
|
|
wc.cbClsExtra = 0;
|
|
wc.cbWndExtra = CBWNDEXTRA;
|
|
wc.hInstance = hInstance;
|
|
wc.hbrBackground = (HBRUSH) CreateSolidBrush(GRAYDARK);
|
|
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
|
|
wc.lpszMenuName = NULL;
|
|
Dbg(LoadString(hInstance, SYS_Quick_wClass, szClassName, MAX_MSG_TXT));
|
|
wc.lpszClassName = szClassName;
|
|
wc.cbWndExtra = DLGWINDOWEXTRA; // Used by QuickW dialog
|
|
if (!RegisterClass(&wc)) {
|
|
return FALSE;
|
|
}
|
|
|
|
#if !defined( NEW_WINDOWING_CODE )
|
|
//Register the Editor child szClassName
|
|
//Associates Caret Cursor
|
|
|
|
wc.style = CS_DBLCLKS;
|
|
wc.lpfnWndProc = ChildWndProc;
|
|
wc.cbClsExtra = 0;
|
|
wc.cbWndExtra = CBWNDEXTRA; // Is this really necessary
|
|
wc.hInstance = hInstance;
|
|
|
|
wc.hIcon = NULL;
|
|
wc.hCursor = LoadCursor(NULL, IDC_IBEAM);
|
|
wc.hbrBackground = (HBRUSH) (COLOR_APPWORKSPACE + 1);
|
|
wc.lpszMenuName = NULL;
|
|
Dbg(LoadString(hInstance, SYS_Edit_wClass, szClassName, MAX_MSG_TXT));
|
|
wc.lpszClassName = szClassName;
|
|
if (!RegisterClass(&wc)) {
|
|
return FALSE;
|
|
}
|
|
|
|
//Register the Disassembler child szClassName
|
|
|
|
wc.style = 0;
|
|
wc.lpfnWndProc = MDIChildWndProc;
|
|
wc.cbClsExtra = 0;
|
|
wc.cbWndExtra = CBWNDEXTRA; // Is this really necessary
|
|
wc.hInstance = hInstance;
|
|
|
|
Dbg(wc.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE( DISASMICON )));
|
|
wc.hbrBackground = (HBRUSH) (COLOR_APPWORKSPACE + 1);
|
|
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
|
|
wc.lpszMenuName = NULL;
|
|
Dbg(LoadString(hInstance, SYS_Disasm_wClass, szClassName, MAX_MSG_TXT));
|
|
wc.lpszClassName = szClassName;
|
|
if (!RegisterClass(&wc)) {
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
//Register the Calls child szClassName
|
|
wc.style = 0;
|
|
wc.lpfnWndProc = CallsWndProc;
|
|
wc.cbClsExtra = 0;
|
|
wc.cbWndExtra = CBWNDEXTRA; // Is this really necessary
|
|
wc.hInstance = hInstance;
|
|
Dbg(wc.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(DOCICON)));
|
|
wc.hbrBackground = (HBRUSH) (COLOR_APPWORKSPACE + 1);
|
|
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
|
|
wc.lpszMenuName = NULL;
|
|
Dbg(LoadString(hInstance, SYS_Calls_wClass, szClassName, MAX_MSG_TXT));
|
|
wc.lpszClassName = szClassName;
|
|
if (!RegisterClass(&wc)) {
|
|
return FALSE;
|
|
}
|
|
#endif // ! NEW_WINDOWING_CODE
|
|
|
|
//Register the bitmap button
|
|
// We want double clicks for the error display
|
|
|
|
wc.style = 0;
|
|
wc.lpfnWndProc = QCQPCtrlWndProc;
|
|
wc.hInstance = hInstance;
|
|
wc.cbClsExtra = 0 ;
|
|
wc.cbWndExtra = CBWNDEXTRA_QCQPCTRL ;
|
|
wc.hIcon = NULL;
|
|
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
|
|
wc.hbrBackground = (HBRUSH) (COLOR_BTNFACE + 1);
|
|
wc.lpszMenuName = NULL;
|
|
Dbg(LoadString(hInstance, SYS_QCQPCtrl_wClass, szClassName, MAX_MSG_TXT));
|
|
wc.lpszClassName = szClassName;
|
|
if (!RegisterClass(&wc)) {
|
|
return FALSE ;
|
|
}
|
|
|
|
|
|
#if defined( NEW_WINDOWING_CODE )
|
|
// New Command window
|
|
{
|
|
WNDCLASSEX wcex;
|
|
|
|
|
|
// Cmd window
|
|
|
|
Dbg(LoadString(hInstance, SYS_NewCmd_wClass, szClassName, sizeof(szClassName)));
|
|
|
|
wcex.cbSize = sizeof(wcex);
|
|
wcex.style = 0;
|
|
wcex.lpfnWndProc = NewCmd_WindowProc;
|
|
wcex.cbClsExtra = 0;
|
|
wcex.cbWndExtra = 0;
|
|
wcex.hInstance = hInstance;
|
|
wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(CMDICON) );
|
|
wcex.hCursor = LoadCursor(NULL, IDC_SIZENS);
|
|
wcex.hbrBackground = (HBRUSH) (COLOR_ACTIVEBORDER + 1);
|
|
wcex.lpszMenuName = NULL;
|
|
wcex.lpszClassName = szClassName;
|
|
wcex.hIconSm = LoadIcon(hInstance, MAKEINTRESOURCE(CMDICON) );
|
|
|
|
if (!RegisterClassEx(&wcex)) {
|
|
return FALSE ;
|
|
}
|
|
|
|
|
|
// Calls window
|
|
|
|
Dbg(LoadString(hInstance, SYS_NewCalls_wClass, szClassName, sizeof(szClassName)));
|
|
|
|
//wcex.cbSize = sizeof(wcex);
|
|
//wcex.style = 0;
|
|
wcex.lpfnWndProc = NewCalls_WindowProc;
|
|
//wcex.cbClsExtra = 0;
|
|
//wcex.cbWndExtra = 0;
|
|
//wcex.hInstance = hInstance;
|
|
wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(DOCICON) );
|
|
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
|
|
//wcex.hbrBackground = (HBRUSH) (COLOR_ACTIVEBORDER + 1);
|
|
//wcex.lpszMenuName = NULL;
|
|
//wcex.lpszClassName = szClassName;
|
|
wcex.hIconSm = LoadIcon(hInstance, MAKEINTRESOURCE(DOCICON) );
|
|
|
|
if (!RegisterClassEx(&wcex)) {
|
|
return FALSE ;
|
|
}
|
|
|
|
|
|
// Doc window
|
|
|
|
Dbg(LoadString(hInstance, SYS_NewDocs_wClass, szClassName, sizeof(szClassName)));
|
|
|
|
//wcex.cbSize = sizeof(wcex);
|
|
//wcex.style = 0;
|
|
wcex.lpfnWndProc = NewDoc_WindowProc;
|
|
//wcex.cbClsExtra = 0;
|
|
//wcex.cbWndExtra = 0;
|
|
//wcex.hInstance = hInstance;
|
|
wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(DOCICON) );
|
|
//wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
|
|
//wcex.hbrBackground = (HBRUSH) (COLOR_ACTIVEBORDER + 1);
|
|
//wcex.lpszMenuName = NULL;
|
|
//wcex.lpszClassName = szClassName;
|
|
wcex.hIconSm = LoadIcon(hInstance, MAKEINTRESOURCE(DOCICON) );
|
|
|
|
if (!RegisterClassEx(&wcex)) {
|
|
return FALSE ;
|
|
}
|
|
|
|
|
|
// CPU window
|
|
|
|
Dbg(LoadString(hInstance, SYS_NewCpu_wClass, szClassName, sizeof(szClassName)));
|
|
|
|
//wcex.cbSize = sizeof(wcex);
|
|
//wcex.style = 0;
|
|
wcex.lpfnWndProc = NewCpu_WindowProc;
|
|
//wcex.cbClsExtra = 0;
|
|
//wcex.cbWndExtra = 0;
|
|
//wcex.hInstance = hInstance;
|
|
wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(CPUICON) );
|
|
//wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
|
|
//wcex.hbrBackground = (HBRUSH) (COLOR_ACTIVEBORDER + 1);
|
|
//wcex.lpszMenuName = NULL;
|
|
//wcex.lpszClassName = szClassName;
|
|
wcex.hIconSm = LoadIcon(hInstance, MAKEINTRESOURCE(CPUICON) );
|
|
|
|
if (!RegisterClassEx(&wcex)) {
|
|
return FALSE ;
|
|
}
|
|
|
|
|
|
// Memory window
|
|
|
|
Dbg(LoadString(hInstance, SYS_NewMemory_wClass, szClassName, sizeof(szClassName)));
|
|
|
|
//wcex.cbSize = sizeof(wcex);
|
|
//wcex.style = 0;
|
|
wcex.lpfnWndProc = NewMemory_WindowProc;
|
|
//wcex.cbClsExtra = 0;
|
|
//wcex.cbWndExtra = 0;
|
|
//wcex.hInstance = hInstance;
|
|
wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(MEMORYICON) );
|
|
//wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
|
|
//wcex.hbrBackground = (HBRUSH) (COLOR_ACTIVEBORDER + 1);
|
|
//wcex.lpszMenuName = NULL;
|
|
//wcex.lpszClassName = szClassName;
|
|
wcex.hIconSm = LoadIcon(hInstance, MAKEINTRESOURCE(MEMORYICON) );
|
|
|
|
if (!RegisterClassEx(&wcex)) {
|
|
return FALSE ;
|
|
}
|
|
|
|
|
|
// Float window
|
|
|
|
Dbg(LoadString(hInstance, SYS_NewFloat_wClass, szClassName, sizeof(szClassName)));
|
|
|
|
//wcex.cbSize = sizeof(wcex);
|
|
//wcex.style = 0;
|
|
wcex.lpfnWndProc = NewFloat_WindowProc;
|
|
//wcex.cbClsExtra = 0;
|
|
//wcex.cbWndExtra = 0;
|
|
//wcex.hInstance = hInstance;
|
|
wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(FLOATICON) );
|
|
//wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
|
|
//wcex.hbrBackground = (HBRUSH) (COLOR_ACTIVEBORDER + 1);
|
|
//wcex.lpszMenuName = NULL;
|
|
//wcex.lpszClassName = szClassName;
|
|
wcex.hIconSm = LoadIcon(hInstance, MAKEINTRESOURCE(FLOATICON) );
|
|
|
|
if (!RegisterClassEx(&wcex)) {
|
|
return FALSE ;
|
|
}
|
|
|
|
|
|
// Locals window
|
|
|
|
Dbg(LoadString(hInstance, SYS_NewLocals_wClass, szClassName, sizeof(szClassName)));
|
|
|
|
//wcex.cbSize = sizeof(wcex);
|
|
//wcex.style = 0;
|
|
wcex.lpfnWndProc = NewLocals_WindowProc;
|
|
//wcex.cbClsExtra = 0;
|
|
//wcex.cbWndExtra = 0;
|
|
//wcex.hInstance = hInstance;
|
|
wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(LOCALSICON) );
|
|
//wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
|
|
//wcex.hbrBackground = (HBRUSH) (COLOR_ACTIVEBORDER + 1);
|
|
//wcex.lpszMenuName = NULL;
|
|
//wcex.lpszClassName = szClassName;
|
|
wcex.hIconSm = LoadIcon(hInstance, MAKEINTRESOURCE(LOCALSICON) );
|
|
|
|
if (!RegisterClassEx(&wcex)) {
|
|
return FALSE ;
|
|
}
|
|
|
|
|
|
// Watch window
|
|
|
|
Dbg(LoadString(hInstance, SYS_NewWatch_wClass, szClassName, sizeof(szClassName)));
|
|
|
|
//wcex.cbSize = sizeof(wcex);
|
|
//wcex.style = 0;
|
|
wcex.lpfnWndProc = NewWatch_WindowProc;
|
|
//wcex.cbClsExtra = 0;
|
|
//wcex.cbWndExtra = 0;
|
|
//wcex.hInstance = hInstance;
|
|
wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(WATCHICON) );
|
|
//wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
|
|
//wcex.hbrBackground = (HBRUSH) (COLOR_ACTIVEBORDER + 1);
|
|
//wcex.lpszMenuName = NULL;
|
|
//wcex.lpszClassName = szClassName;
|
|
wcex.hIconSm = LoadIcon(hInstance, MAKEINTRESOURCE(WATCHICON) );
|
|
|
|
if (!RegisterClassEx(&wcex)) {
|
|
return FALSE ;
|
|
}
|
|
|
|
|
|
// Disasm window
|
|
|
|
Dbg(LoadString(hInstance, SYS_NewDisasm_wClass, szClassName, sizeof(szClassName)));
|
|
|
|
//wcex.cbSize = sizeof(wcex);
|
|
//wcex.style = 0;
|
|
wcex.lpfnWndProc = NewDisasm_WindowProc;
|
|
//wcex.cbClsExtra = 0;
|
|
//wcex.cbWndExtra = 0;
|
|
//wcex.hInstance = hInstance;
|
|
wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(DISASMICON) );
|
|
//wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
|
|
//wcex.hbrBackground = (HBRUSH) (COLOR_ACTIVEBORDER + 1);
|
|
//wcex.lpszMenuName = NULL;
|
|
//wcex.lpszClassName = szClassName;
|
|
wcex.hIconSm = LoadIcon(hInstance, MAKEINTRESOURCE(DISASMICON) );
|
|
|
|
if (!RegisterClassEx(&wcex)) {
|
|
return FALSE ;
|
|
}
|
|
}
|
|
#endif // NEW_WINDOWING_CODE
|
|
|
|
|
|
return TRUE;
|
|
} /* InitApplication() */
|
|
|
|
|
|
LPSTR
|
|
GetArg(
|
|
LPSTR *lpp
|
|
)
|
|
{
|
|
static PSTR pszBuffer = NULL;
|
|
int r;
|
|
LPSTR p1 = *lpp;
|
|
|
|
while (*p1 == ' ' || *p1 == '\t') {
|
|
p1++;
|
|
}
|
|
|
|
if (pszBuffer) {
|
|
free(pszBuffer);
|
|
}
|
|
pszBuffer = (PSTR) calloc(strlen(p1) +1, 1);
|
|
|
|
r = CPCopyString(&p1, pszBuffer, 0, (*p1 == '\'' || *p1 == '"'));
|
|
if (r >= 0) {
|
|
*lpp = p1;
|
|
}
|
|
return pszBuffer;
|
|
}
|
|
|
|
|
|
BOOL
|
|
InitCrashDump(
|
|
LPSTR CrashDump
|
|
)
|
|
{
|
|
PDUMP_HEADER DumpHeader = NULL;
|
|
DWORD cb = 0;
|
|
DWORD fsize = 0;
|
|
HANDLE File = NULL;
|
|
HANDLE MemMap = NULL;
|
|
PCHAR DmpDumpBase = NULL;
|
|
BOOL rval = FALSE;
|
|
|
|
|
|
File = CreateFile(CrashDump, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
|
|
if (File == INVALID_HANDLE_VALUE) {
|
|
goto exit;
|
|
}
|
|
|
|
MemMap = CreateFileMapping(File, NULL, PAGE_READONLY, 0, 0, NULL);
|
|
if (MemMap == 0) {
|
|
goto exit;
|
|
}
|
|
|
|
fsize = GetFileSize( File,NULL );
|
|
|
|
DmpDumpBase = (PSTR) MapViewOfFile(MemMap, FILE_MAP_READ, 0, 0, (fsize < 65536) ? fsize : 65536);
|
|
if (DmpDumpBase == NULL) {
|
|
goto exit;
|
|
}
|
|
|
|
DumpHeader = (PDUMP_HEADER)DmpDumpBase;
|
|
|
|
if ((DumpHeader->Signature == 'EGAP') && (DumpHeader->ValidDump == 'PMUD')) {
|
|
g_contGlobalPreferences_WkSp.m_bCommandRepeat = TRUE;
|
|
g_contWorkspace_WkSp.m_bKernelDebugger = TRUE;
|
|
g_contKernelDbgPreferences_WkSp.m_bUseCrashDump = TRUE;
|
|
FREE_STR(g_contKernelDbgPreferences_WkSp.m_pszCrashDump);
|
|
g_contKernelDbgPreferences_WkSp.m_pszCrashDump = _strdup(CrashDump);
|
|
|
|
switch( DumpHeader->MachineImageType ) {
|
|
case IMAGE_FILE_MACHINE_I386:
|
|
g_contKernelDbgPreferences_WkSp.m_mptPlatform = mptix86;
|
|
break;
|
|
case IMAGE_FILE_MACHINE_IA64:
|
|
g_contKernelDbgPreferences_WkSp.m_mptPlatform = mptia64;
|
|
break;
|
|
|
|
#if 0
|
|
case IMAGE_FILE_MACHINE_R4000:
|
|
case IMAGE_FILE_MACHINE_R10000:
|
|
g_contKernelDbgPreferences_WkSp.m_mptPlatform = mptmips;
|
|
break;
|
|
#endif
|
|
|
|
case IMAGE_FILE_MACHINE_ALPHA:
|
|
case IMAGE_FILE_MACHINE_ALPHA64:
|
|
g_contKernelDbgPreferences_WkSp.m_mptPlatform = mptdaxp;
|
|
break;
|
|
|
|
#if 0
|
|
case IMAGE_FILE_MACHINE_POWERPC:
|
|
g_contKernelDbgPreferences_WkSp.m_mptPlatform = mptntppc;
|
|
break;
|
|
#endif
|
|
|
|
default:
|
|
// This should not happen.
|
|
Dbg(0);
|
|
}
|
|
|
|
rval = TRUE;
|
|
}
|
|
|
|
if ((DumpHeader->Signature == 'RESU') &&
|
|
(DumpHeader->ValidDump == 'PMUD')) {
|
|
|
|
// usermode crash dump
|
|
|
|
|
|
g_contWorkspace_WkSp.m_bUserCrashDump = TRUE;
|
|
FREE_STR(g_contWorkspace_WkSp.m_pszUserCrashDump);
|
|
g_contWorkspace_WkSp.m_pszUserCrashDump = _strdup(CrashDump);
|
|
rval = TRUE;
|
|
}
|
|
|
|
exit:
|
|
if (DmpDumpBase) {
|
|
UnmapViewOfFile( DmpDumpBase );
|
|
}
|
|
if (MemMap) {
|
|
CloseHandle( MemMap );
|
|
}
|
|
if (File) {
|
|
CloseHandle( File );
|
|
}
|
|
|
|
return rval;
|
|
}
|
|
|
|
//BUGBUG - kcarlos. Place in a header
|
|
DWORD
|
|
GetProcessIdGivenName(
|
|
PCSTR pszProcessName
|
|
);
|
|
|
|
|
|
BOOL
|
|
InitInstance(
|
|
int argc,
|
|
char * argv[],
|
|
HINSTANCE hInstance,
|
|
int nCmdShow
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Finish initializing Windbg, parse and execute the command line.
|
|
|
|
Arguments:
|
|
|
|
argc - Supplies command line arg count
|
|
|
|
argv - Supplies command line args
|
|
|
|
hInstance - Supplies app instance handle (lpBaseOfImage)
|
|
|
|
nCmdShow - Supplies ShowWindow parameter
|
|
|
|
Return Value:
|
|
|
|
TRUE if everything is OK, FALSE if something fails
|
|
|
|
--*/
|
|
{
|
|
/*
|
|
extern BOOL AutoTest;
|
|
char ProgramName[ MAX_PATH *2] = {0};
|
|
char rgch[ MAX_PATH ] = {0};
|
|
char szTitle[ MAX_MSG_TXT ] = {0};
|
|
char szClass[ MAX_MSG_TXT ] = {0};
|
|
char WorkSpace[ MAX_PATH ] = {0};
|
|
BOOL bWorkSpaceSpecified = FALSE;
|
|
BOOL toRestore = FALSE;
|
|
BOOL workSpaceLoaded = FALSE;
|
|
BOOL frameHidden = TRUE;
|
|
BOOL LoadedDefaultWorkSpace = FALSE;
|
|
BOOL CreatedNewDefault = FALSE;
|
|
BOOL WorkSpaceMissed = FALSE;
|
|
BOOL bJustSource = FALSE;
|
|
BOOL fGoNow = FALSE;
|
|
BOOL SwitchK = FALSE;
|
|
BOOL SwitchH = FALSE;
|
|
LPSTR WorkSpaceToUse = NULL;
|
|
LONG lAttachProcess = -2;
|
|
HANDLE hEventGo = NULL;
|
|
LPSTR lp1 = NULL;
|
|
LPSTR lp2 = NULL;
|
|
RUNDEBUG_PARAMS rd = {0};
|
|
BOOL fRemoteServer = FALSE;
|
|
BOOL fMinimize = FALSE;
|
|
CHAR PipeName[MAX_PATH+1] = {0};
|
|
BOOL fSymPath = FALSE;
|
|
BOOL fCrashDump = FALSE;
|
|
// Several function expect either a path or an empty string
|
|
PSTR pszSymPath = (PSTR) calloc(1, 1); // Allocate an empty string: ""
|
|
CHAR CrashDump[MAX_PATH*2] = {0};
|
|
LPSTR pszWindowTitle = NULL;
|
|
BOOL fSetTitle = FALSE;
|
|
HDESK hDesk;
|
|
BOOL bDll_CmdLineTL = FALSE;
|
|
PSTR pszName_CmdLineTL = NULL;
|
|
*/
|
|
|
|
extern BOOL AutoTest;
|
|
char szProgramName[ MAX_PATH *2] = {0};
|
|
char rgch[ MAX_PATH ] = {0};
|
|
char szTitle[ MAX_MSG_TXT ] = {0};
|
|
char szClass[ MAX_MSG_TXT ] = {0};
|
|
char szWorkSpace[ MAX_PATH ] = {0};
|
|
char szWindowLayout[ MAX_PATH ] = {0};
|
|
BOOL bWindowLayoutSpecified = FALSE;
|
|
BOOL bWorkSpaceSpecified = FALSE;
|
|
BOOL bIgnoreDefault = FALSE;
|
|
BOOL bWorkSpaceMissed = FALSE;
|
|
BOOL bJustSource = FALSE;
|
|
BOOL fGoNow = FALSE;
|
|
BOOL bKernelDebugging = FALSE;
|
|
BOOL bInheritHandles = FALSE;
|
|
LPSTR pszWorkSpaceToUse = NULL;
|
|
LONG lAttachProcess = -2;
|
|
HANDLE hEventGo = NULL;
|
|
LPSTR lp1 = NULL;
|
|
LPSTR lp2 = NULL;
|
|
BOOL fRemoteServer = FALSE;
|
|
BOOL fMinimize = FALSE;
|
|
CHAR szPipeName[MAX_PATH+1] = {0};
|
|
BOOL fSymPath = FALSE;
|
|
BOOL fCrashDump = FALSE;
|
|
// Several function expect either a path or an empty string
|
|
PSTR pszSymPath = (PSTR) calloc(1, 1); // Allocate an empty string: ""
|
|
CHAR szCrashDump[MAX_PATH*2] = {0};
|
|
LPSTR pszWindowTitle = NULL;
|
|
BOOL fSetTitle = FALSE;
|
|
HDESK hDesk;
|
|
BOOL bDll_CmdLineTL = FALSE;
|
|
PSTR pszName_CmdLineTL = NULL;
|
|
BOOL bLoadedDefaultWorkSpace = FALSE;
|
|
MPT mptPlatform = 0;
|
|
DWORD dwKernelDebuggingCommPort = 0;
|
|
DWORD dwKernelDebuggingBaudRate = 0;
|
|
MPT mptPlatformCmdLine = 0;
|
|
|
|
PSTR rgpszCmds[200] = {0};
|
|
int nNumCmds = 0;
|
|
|
|
|
|
// First argument is debugger name
|
|
|
|
Assert( argc > 0 );
|
|
strcpy( DebuggerName, argv[0] );
|
|
|
|
|
|
// Initialize the debugger state. This state will very probably
|
|
// be overwritten later on by a workspace from the registry.
|
|
|
|
g_hInst = hInstance;
|
|
winVer = GetVersion();
|
|
|
|
InitFileExtensions();
|
|
InitializeDocument();
|
|
InitCodemgr();
|
|
|
|
Dbg(hMainAccTable = LoadAccelerators(g_hInst, MAKEINTRESOURCE(MAIN_ACC)));
|
|
hCurrAccTable = hMainAccTable;
|
|
Dbg(hCmdWinAccTable = LoadAccelerators(g_hInst, MAKEINTRESOURCE(CMD_WIN_ACC)));
|
|
|
|
|
|
Dbg(LoadString(g_hInst, SYS_Main_wTitle, szTitle, MAX_MSG_TXT));
|
|
Dbg(LoadString(g_hInst, SYS_Main_wClass, szClass, MAX_MSG_TXT));
|
|
|
|
hEventIoctl = CreateEvent( NULL, TRUE, FALSE, NULL );
|
|
|
|
InitializeCriticalSection( &csLog );
|
|
|
|
|
|
// Create the frame
|
|
|
|
hwndFrame = CreateWindow(szClass, szTitle,
|
|
WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN,
|
|
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0,
|
|
NULL, NULL, hInstance, NULL);
|
|
|
|
|
|
// Initialize the debugger
|
|
|
|
if ( !hwndFrame || !FDebInit() || !g_hwndMDIClient ) {
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
// Get Handle to main menu and to window submenu
|
|
|
|
Dbg( hMainMenu = GetMenu(hwndFrame));
|
|
hMainMenuSave = hMainMenu;
|
|
Dbg( hWindowSubMenu = GetSubMenu(hMainMenu, WINDOWMENU));
|
|
|
|
|
|
// Build Help file path
|
|
|
|
Dbg(LoadString( g_hInst, SYS_Help_FileExt, szTmp, _MAX_EXT) );
|
|
MakePathNameFromProg( (LPSTR)szTmp, szHelpFileName );
|
|
|
|
|
|
// Init Items Colors ,Environment and RunDebug params to their default
|
|
// values 'They will later be overrided by the values in .INI file
|
|
// but we ensure to have something coherent even if we can't load
|
|
// the .INI file
|
|
|
|
InitDefaults();
|
|
|
|
hKeyHook = SetWindowsHookEx(WH_KEYBOARD, (HOOKPROC) KeyboardHook, hInstance, GetCurrentThreadId());// Initialize Keyboard Hook
|
|
|
|
LpszCommandLine = NULL;// Parse arguments
|
|
|
|
// skip whitespace
|
|
lp1 = CPSkipWhitespace(GetCommandLine());
|
|
|
|
// skip over program name
|
|
if ('"' != *lp1) {
|
|
lp1 += _tcslen(argv[0]);
|
|
} else {
|
|
// The program name is enclosed in double quotes.
|
|
// +2 skip over the quotes at the beginning and end.
|
|
Assert('"' == *(lp1 + _tcslen(argv[0]) + 1) );
|
|
lp1 += _tcslen(argv[0]) + 2;
|
|
}
|
|
|
|
|
|
while (*lp1) {
|
|
|
|
// eat whitespace before arg
|
|
lp1 = CPSkipWhitespace(lp1);
|
|
|
|
if (*lp1 == '-' || *lp1 == '/') {
|
|
|
|
// pick up switches
|
|
BOOL fSwitch = TRUE;
|
|
|
|
++lp1;
|
|
|
|
while (*lp1 && fSwitch) {
|
|
|
|
switch (*lp1++) {
|
|
case '?':
|
|
usage:
|
|
// Display the help topic for command line options
|
|
DisplayHelpContents(NULL, _WinDbg_Command_Line);
|
|
exit(1);
|
|
break;
|
|
|
|
case ' ':
|
|
case '\t':
|
|
fSwitch = FALSE;
|
|
break;
|
|
|
|
case 'A':
|
|
// Auto start a dlg
|
|
// Used by the wizard so that the open executable
|
|
// dlg or the attach dlg, will appear as soon as
|
|
// windbg is started.
|
|
|
|
// 'e' executable
|
|
// 'p' process
|
|
// 'd' dump file
|
|
// ie: Ae, Ap, Ad
|
|
if (isspace(*lp1)) {
|
|
goto usage;
|
|
} else {
|
|
if ('e' == *lp1) {
|
|
// Auto open the Open Executable dlg
|
|
PostMessage(hwndFrame,
|
|
WM_COMMAND,
|
|
MAKEWPARAM(IDM_FILE_OPEN_EXECUTABLE, 0),
|
|
0);
|
|
lp1++;
|
|
} else if ('d' == *lp1) {
|
|
// Auto open the Attach to Process dlg
|
|
PostMessage(hwndFrame,
|
|
WM_COMMAND,
|
|
MAKEWPARAM(IDM_FILE_OPEN_CRASH_DUMP, 0),
|
|
0);
|
|
lp1++;
|
|
} else if ('p' == *lp1) {
|
|
// Auto open the Attach to Process dlg
|
|
PostMessage(hwndFrame,
|
|
WM_COMMAND,
|
|
MAKEWPARAM(IDM_DEBUG_ATTACH, 0),
|
|
0);
|
|
lp1++;
|
|
} else {
|
|
goto usage;
|
|
}
|
|
}
|
|
break;
|
|
|
|
case 'd':
|
|
iDebugLevel = atoi( GetArg(&lp1) );
|
|
fSwitch = FALSE;
|
|
break;
|
|
|
|
case 'e':
|
|
// signal an event after process is attached
|
|
hEventGo = (HANDLE)atol(GetArg(&lp1));
|
|
fSwitch = FALSE;
|
|
break;
|
|
|
|
case 'g':
|
|
// go now switch
|
|
fGoNow = TRUE;
|
|
break;
|
|
|
|
case 'h':
|
|
bInheritHandles = TRUE;
|
|
break;
|
|
|
|
case 'i':
|
|
bIgnoreDefault = TRUE;
|
|
break;
|
|
|
|
case 'I':
|
|
// Install windebug as the postmortem debugger
|
|
// Why 'I', because it was suggested in the raid item
|
|
{
|
|
HKEY hkey = NULL;
|
|
long lResult = 0;
|
|
|
|
lResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\AeDebug", 0, KEY_READ | KEY_WRITE, &hkey);
|
|
if (ERROR_SUCCESS == lResult) {
|
|
// The key has been opened.
|
|
LPSTR lpsz = "windbg -p %ld -e %ld";
|
|
lResult = RegSetValueEx(hkey, "Debugger", 0, REG_SZ, (PUCHAR) lpsz, strlen(lpsz) +1); // Need to include terminating 0
|
|
Assert(ERROR_SUCCESS == RegCloseKey(hkey));
|
|
}
|
|
|
|
if (ERROR_SUCCESS != lResult) {
|
|
// An error occurred, notify the user.
|
|
ErrorBox2(GetActiveWindow(), 0, ERR_Inst_Postmortem_Debugger);
|
|
} else {
|
|
InformationBox(DBG_Success_Inst_Postmortem_Debugger);
|
|
exit(0);
|
|
}
|
|
}
|
|
break;
|
|
|
|
case 'J':
|
|
case 'j':
|
|
// Allow journaling
|
|
// Already taken care of in main.
|
|
break;
|
|
|
|
case 'k':
|
|
|
|
// kernel debugging mode
|
|
|
|
bKernelDebugging = TRUE;
|
|
strcpy(szProgramName, NT_KERNEL_NAME);
|
|
lp2 = GetArg(&lp1);
|
|
|
|
// Set the platform type
|
|
if (!GetPlatformIdFromName(lp2,
|
|
&mptPlatformCmdLine
|
|
)) {
|
|
goto usage;
|
|
}
|
|
|
|
lp2 = GetArg(&lp1);
|
|
if (strlen(lp2) > 3 && _strnicmp(lp2,"com",3)==0) {
|
|
lp2 += 3;
|
|
dwKernelDebuggingCommPort = strtoul(lp2, NULL, 0);
|
|
}
|
|
lp2 = GetArg(&lp1);
|
|
dwKernelDebuggingBaudRate = strtoul(lp2, NULL, 0);
|
|
break;
|
|
|
|
case 'l':
|
|
fSetTitle = TRUE;
|
|
lp2 = GetArg(&lp1);
|
|
if (strlen(lp2) >= MAX_PATH) {
|
|
lp2[MAX_PATH-1] = NULL;
|
|
}
|
|
pszWindowTitle = _strdup( lp2 );
|
|
break;
|
|
|
|
case 'm':
|
|
fMinimize = TRUE;
|
|
nCmdShow = SW_MINIMIZE;
|
|
break;
|
|
|
|
case 'n':
|
|
// BUGBUG - kcarlos - hack. Fix with new workspace code.
|
|
// Load this transport as the default.
|
|
// -n "tl name" as specified in the registry
|
|
pszName_CmdLineTL = _strdup( GetArg(&lp1) );
|
|
fSwitch = FALSE;
|
|
break;
|
|
|
|
case 'N':
|
|
|
|
// This command line is not supported
|
|
|
|
bDll_CmdLineTL = TRUE;
|
|
GetArg(&lp1);
|
|
fSwitch = FALSE;
|
|
break;
|
|
|
|
case 'p':
|
|
// attach to an active process
|
|
// p specifies a process id
|
|
// pn specifies a process by name
|
|
// ie: -p 360
|
|
// -pn "foo bar"
|
|
if (!isspace(*lp1) && !isdigit(*lp1)) {
|
|
// They may have specified the -pn flag
|
|
if ('n' != *lp1 || OsVersionInfo.dwPlatformId != VER_PLATFORM_WIN32_NT) {
|
|
goto usage;
|
|
} else {
|
|
// Skip the 'n'
|
|
lp1++;
|
|
|
|
// Auto open the Open Executable dlg
|
|
char szProcessName[_MAX_FNAME + _MAX_EXT] = {0};
|
|
strncpy(szProcessName, GetArg(&lp1), sizeof(szProcessName)-1 );
|
|
|
|
if (!*szProcessName) {
|
|
// They did not specify a name
|
|
goto usage;
|
|
}
|
|
|
|
lAttachProcess = GetProcessIdGivenName(szProcessName);
|
|
|
|
if (lAttachProcess <= 0) {
|
|
lAttachProcess = -2;
|
|
ErrorBox2(hwndFrame, MB_TASKMODAL,
|
|
ERR_Invalid_Process_Name,
|
|
szProcessName);
|
|
}
|
|
}
|
|
} else {
|
|
// They speicified -p 360
|
|
lAttachProcess = strtoul(GetArg(&lp1), NULL, 0);
|
|
|
|
if (OsVersionInfo.dwPlatformId == VER_PLATFORM_WIN32_NT) {
|
|
if (lAttachProcess <= 0) {
|
|
lAttachProcess = -2;
|
|
ErrorBox2(hwndFrame, MB_TASKMODAL,
|
|
ERR_Invalid_Process_Id,
|
|
lAttachProcess);
|
|
}
|
|
}
|
|
}
|
|
fSwitch = FALSE;
|
|
break;
|
|
|
|
case 'r':
|
|
AutoRun = arCmdline;
|
|
PszAutoRun = _strdup( GetArg(&lp1) );
|
|
ShowWindow(hwndFrame, nCmdShow);
|
|
#if defined( NEW_WINDOWING_CODE )
|
|
New_OpenDebugWindow(CMD_WINDOW, FALSE); // Not user activated
|
|
#else
|
|
OpenDebugWindow(COMMAND_WIN, FALSE); // Not user activated
|
|
#endif
|
|
fSwitch = FALSE;
|
|
break;
|
|
|
|
case 'R':
|
|
{
|
|
|
|
// This code does not support nested dbl quotes.
|
|
|
|
BOOL bInDblQuotes = FALSE;
|
|
LPSTR lpszCmd;
|
|
LPSTR lpsz;
|
|
|
|
lpszCmd = lpsz = GetArg(&lp1);
|
|
|
|
while (*lpsz) {
|
|
if ('"' == *lpsz) {
|
|
// We found a quote. We assume it is either an
|
|
// opening quote or an ending quote, that's why
|
|
// we toggle.
|
|
bInDblQuotes = !bInDblQuotes;
|
|
} else {
|
|
// We only replace the '_' if we are not inside
|
|
// dbl quotes.
|
|
if (!bInDblQuotes && '_' == *lpsz) {
|
|
*lpsz = ' ';
|
|
}
|
|
}
|
|
lpsz = CharNext(lpsz);
|
|
}
|
|
|
|
if ( nNumCmds < sizeof(rgpszCmds)/sizeof(rgpszCmds[0]) ) {
|
|
rgpszCmds[nNumCmds++] = _strdup(lpszCmd);
|
|
}
|
|
fSwitch = FALSE;
|
|
}
|
|
break;
|
|
|
|
case 's':
|
|
fRemoteServer = TRUE;
|
|
lp2 = GetArg(&lp1);
|
|
if (lp2 && *lp2) {
|
|
strncpy(szPipeName, lp2, sizeof(szPipeName));
|
|
szPipeName[sizeof(szPipeName)-1] = NULL;
|
|
} else {
|
|
ErrorBox2(hwndFrame,
|
|
MB_TASKMODAL,
|
|
ERR_No_Remote_Pipe_Name
|
|
);
|
|
fRemoteServer = FALSE;
|
|
}
|
|
break;
|
|
|
|
case 't':
|
|
NoPopups = TRUE;
|
|
AutoTest = TRUE;
|
|
break;
|
|
|
|
case 'w':
|
|
bWorkSpaceSpecified = TRUE;
|
|
strncpy( szWorkSpace, GetArg(&lp1), sizeof(szWorkSpace)/sizeof(TCHAR) );
|
|
szWorkSpace[_tsizeof(szWorkSpace)-1] =NULL;
|
|
fSwitch = FALSE;
|
|
break;
|
|
|
|
case 'x':
|
|
// window layout
|
|
bWindowLayoutSpecified = TRUE;
|
|
strncpy(szWindowLayout,
|
|
GetArg(&lp1),
|
|
_tsizeof(szWorkSpace)
|
|
);
|
|
szWindowLayout[_tsizeof(szWindowLayout)-1] =NULL;
|
|
fSwitch = FALSE;
|
|
break;
|
|
|
|
|
|
case 'y':
|
|
Assert(pszSymPath);
|
|
Assert(NULL == *pszSymPath);
|
|
|
|
free(pszSymPath);
|
|
pszSymPath = NULL;
|
|
|
|
fSymPath = TRUE;
|
|
lp2 = GetArg(&lp1);
|
|
if (!TruncatePathsToMaxPath(lp2, pszSymPath)) {
|
|
// No truncations were made. Nothing was allocated.
|
|
// We need to duplicate the string ourselves
|
|
pszSymPath = _strdup(lp2);
|
|
}
|
|
break;
|
|
|
|
case 'z':
|
|
fCrashDump = TRUE;
|
|
lp2 = GetArg(&lp1);
|
|
strncpy(szCrashDump, lp2, sizeof(szCrashDump)/sizeof(TCHAR));
|
|
szCrashDump[sizeof(szCrashDump)/sizeof(TCHAR) -1] = NULL;
|
|
break;
|
|
|
|
default:
|
|
--lp1;
|
|
goto usage;
|
|
}
|
|
}
|
|
|
|
} else {
|
|
|
|
// pick up file args. If it is a program name,
|
|
// keep the tail of the cmd line intact.
|
|
char *lpSave = lp1;
|
|
|
|
AnsiUpper( lp2 = GetArg(&lp1) );
|
|
|
|
if (!*lp2) {
|
|
|
|
continue;
|
|
|
|
} else {
|
|
|
|
TCHAR szDrive[_MAX_DRIVE];
|
|
TCHAR szDir[_MAX_DIR];
|
|
TCHAR szFName[_MAX_FNAME];
|
|
TCHAR szExt[_MAX_EXT];
|
|
|
|
_fullpath(rgch, lp2, sizeof(rgch));
|
|
_splitpath(rgch, szDrive, szDir, szFName, szExt);
|
|
|
|
if ( !_stricmp( szExt, szStarDotExe+1 ) ||
|
|
!_stricmp( szExt, szStarDotCom+1 ) ||
|
|
( *szExt == '\0' ) )
|
|
{
|
|
|
|
// Program name. Get the command line.
|
|
|
|
strcpy( szProgramName, GetArg(&lpSave));
|
|
if (*lp1) {
|
|
// it must be a space or tab...
|
|
// if it is a tab, we are wrong...
|
|
++lp1;
|
|
}
|
|
LpszCommandLine = _strdup(lp1);
|
|
break;
|
|
|
|
} else {
|
|
|
|
//ShowWindow(hwndFrame, SW_SHOWNORMAL);
|
|
|
|
|
|
// Source file name
|
|
|
|
AddFile( MODE_OPENCREATE,
|
|
DOC_WIN,
|
|
rgch,
|
|
NULL,
|
|
NULL,
|
|
FALSE,
|
|
-1,
|
|
-1,
|
|
TRUE
|
|
);
|
|
bJustSource = TRUE;
|
|
bIgnoreDefault = TRUE;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
// Boost thread priority to improve performance.
|
|
|
|
if (!AutoTest) {
|
|
SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_HIGHEST);
|
|
}
|
|
|
|
if ( bIgnoreDefault && bWorkSpaceSpecified ) {
|
|
ErrorBox2( hwndFrame, MB_TASKMODAL,
|
|
ERR_Invalid_Command_Line_File,
|
|
(LPSTR)"" );
|
|
}
|
|
|
|
|
|
// Let's load the workspace
|
|
|
|
if (fCrashDump) {
|
|
if (!InitCrashDump( szCrashDump )) {
|
|
ErrorBox2(hwndFrame, MB_TASKMODAL,
|
|
ERR_Invalid_Crashdump_File,
|
|
szCrashDump);
|
|
exit(1);
|
|
} else {
|
|
ModListSetSearchPath( pszSymPath );
|
|
fGoNow = TRUE;
|
|
if (g_contWorkspace_WkSp.m_bUserCrashDump) {
|
|
strcpy( szProgramName, NT_USERDUMP_NAME );
|
|
} else {
|
|
strcpy( szProgramName, NT_KERNELDUMP_NAME );
|
|
}
|
|
}
|
|
}
|
|
|
|
if (*szProgramName) {
|
|
// A program was specified
|
|
g_Windbg_WkSp.SetCurrentProgramName(szProgramName);
|
|
}
|
|
|
|
if ( !bIgnoreDefault ) {
|
|
|
|
if (bWorkSpaceSpecified) {
|
|
g_contWorkspace_WkSp.SetRegistryName(szWorkSpace);
|
|
}
|
|
|
|
} else {
|
|
|
|
// We are finished. We have loaded with default values ignoring
|
|
// anything stored in the registry.
|
|
|
|
// force cmdwin
|
|
|
|
CWorkSpace_WKSP *pTmp = new CWorkSpace_WKSP;
|
|
|
|
g_contWorkspace_WkSp.Duplicate( *pTmp );
|
|
|
|
delete pTmp;
|
|
|
|
#if defined( NEW_WINDOWING_CODE )
|
|
New_OpenDebugWindow(CMD_WINDOW, FALSE); // Not user activated
|
|
#else
|
|
OpenDebugWindow(COMMAND_WIN, FALSE); // Not user activated
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
// Set the name of the window layout we want to load.
|
|
|
|
if (bWindowLayoutSpecified) {
|
|
g_contWinLayout_WkSp.SetRegistryName(szWindowLayout);
|
|
}
|
|
|
|
|
|
// Read of all the debuggees and workspaces
|
|
|
|
g_Windbg_WkSp.Restore(FALSE);
|
|
|
|
|
|
|
|
// Execute cmds from command line
|
|
|
|
{
|
|
for (int nIdx=0; nIdx < nNumCmds; nIdx++) {
|
|
|
|
CmdExecuteLine( rgpszCmds[nIdx] );
|
|
|
|
FREE_STR( rgpszCmds[nIdx] );
|
|
}
|
|
}
|
|
|
|
|
|
if (bKernelDebugging) {
|
|
g_contWorkspace_WkSp.m_bKernelDebugger = TRUE;
|
|
|
|
g_contKernelDbgPreferences_WkSp.m_mptPlatform = mptPlatformCmdLine;
|
|
g_contKernelDbgPreferences_WkSp.m_dwPort = dwKernelDebuggingCommPort;
|
|
g_contKernelDbgPreferences_WkSp.m_dwBaudRate = dwKernelDebuggingBaudRate;
|
|
|
|
if (fRemoteServer) {
|
|
g_contGlobalPreferences_WkSp.m_bCommandRepeat = TRUE;
|
|
}
|
|
if (!bWorkSpaceSpecified) {
|
|
g_contWorkspace_WkSp.m_bMasmEval = TRUE;
|
|
}
|
|
}
|
|
|
|
|
|
// Autorun has already displayed the window
|
|
if (arNone == AutoRun) {
|
|
if (fMinimize) {
|
|
// BUGBUG - kcarlos - store nCmdShow into the workspace
|
|
ShowWindow(hwndFrame, SW_MINIMIZE);
|
|
UpdateWindow(hwndFrame);
|
|
}
|
|
}
|
|
|
|
if (bInheritHandles) {
|
|
g_contWorkspace_WkSp.m_bInheritHandles = TRUE;
|
|
}
|
|
|
|
if (fSymPath) {
|
|
ModListSetSearchPath( pszSymPath );
|
|
}
|
|
|
|
if (fSetTitle) {
|
|
|
|
FREE_STR(g_contWorkspace_WkSp.m_pszWindowTitle);
|
|
g_contWorkspace_WkSp.m_pszWindowTitle = _strdup(pszWindowTitle);
|
|
|
|
SetWindowText( hwndFrame, pszWindowTitle );
|
|
}
|
|
|
|
CheckMenuItem(hMainMenu,
|
|
IDM_WINDOW_SOURCE_OVERLAY,
|
|
FSourceOverlay ? MF_CHECKED : MF_UNCHECKED
|
|
);
|
|
|
|
GetComPorts();
|
|
|
|
// If the user specified the -n or -N switch
|
|
// on the command line, initialize the default transport to
|
|
// that string.
|
|
if (bDll_CmdLineTL || pszName_CmdLineTL) {
|
|
if (bDll_CmdLineTL && pszName_CmdLineTL) {
|
|
// The idiot specified both.
|
|
ErrorBox2(hwndFrame, MB_TASKMODAL, ERR_TL_Both_Overrides);
|
|
} else {
|
|
// You cannot override the TL when debugging kernel or crash dumps
|
|
if (g_contWorkspace_WkSp.m_bKernelDebugger || g_contWorkspace_WkSp.m_bUserCrashDump) {
|
|
// fKernelDebugger cover kernel and kernel dumps
|
|
ErrorBox2(hwndFrame, MB_TASKMODAL, ERR_TL_Cannot_Be_Overridden);
|
|
} else if (bDll_CmdLineTL) {
|
|
ErrorBox2(hwndFrame, MB_TASKMODAL, ERR_TL_Cmd_Line_Opt_N);
|
|
} else {
|
|
Assert(pszName_CmdLineTL);
|
|
SetTransportLayer(pszName_CmdLineTL, &g_dynacontAll_TLs_WkSp);
|
|
}
|
|
}
|
|
}
|
|
|
|
if (g_contWorkspace_WkSp.m_bLfOptAuto) {
|
|
LogFileOpen(g_contWorkspace_WkSp.m_pszLogFileName, g_contWorkspace_WkSp.m_bLfOptAppend);
|
|
}
|
|
|
|
if (fRemoteServer) {
|
|
StartRemoteServer( szPipeName, FALSE );
|
|
}
|
|
|
|
if (fGoNow) {
|
|
if (g_contKernelDbgPreferences_WkSp.m_bUseCrashDump) {
|
|
RestartDebuggee( NT_KERNEL_NAME, NULL );
|
|
} else if (lAttachProcess == -2 || *szProgramName) {
|
|
ExecDebuggee(EXEC_GO);
|
|
}
|
|
}
|
|
|
|
if (arCmdline == AutoRun) {
|
|
if (CmdAutoRunInit() == FALSE) {
|
|
ErrorBox( ERR_File_Open, PszAutoRun );
|
|
exit(1);
|
|
}
|
|
}
|
|
|
|
if (lAttachProcess != -2) {
|
|
if (!AttachDebuggee(lAttachProcess, hEventGo)) {
|
|
CmdLogVar(ERR_Attach_Failed);
|
|
} else {
|
|
|
|
// stopped at ldr BP in bogus thread:
|
|
LptdCur->fGoOnTerm = TRUE;
|
|
|
|
if (fGoNow || hEventGo || g_contWorkspace_WkSp.m_bAttachGo) {
|
|
Go();
|
|
} else if (!DoStopEvent(NULL)) {
|
|
CmdLogVar(DBG_Attach_Stopped);
|
|
}
|
|
|
|
if (hEventGo) {
|
|
hDesk = GetThreadDesktop(GetCurrentThreadId());
|
|
if (hDesk) {
|
|
SwitchDesktop(hDesk);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if (pszSymPath) {
|
|
free(pszSymPath);
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
void
|
|
InitFileExtensions(
|
|
void
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Load the standard file extensions into strings
|
|
|
|
Arguments:
|
|
|
|
None
|
|
|
|
Return Value:
|
|
|
|
None
|
|
|
|
--*/
|
|
{
|
|
// Standard File Extensions
|
|
|
|
Dbg(LoadString(g_hInst, DEF_Ext_C, szStarDotC, _MAX_EXT));
|
|
Dbg(LoadString(g_hInst, DEF_Ext_H, szStarDotH, _MAX_EXT));
|
|
Dbg(LoadString(g_hInst, DEF_Ext_CPP, szStarDotCPP, _MAX_EXT));
|
|
Dbg(LoadString(g_hInst, DEF_Ext_CXX, szStarDotCXX, _MAX_EXT));
|
|
Dbg(LoadString(g_hInst, DEF_Ext_EXE, szStarDotExe, _MAX_EXT));
|
|
Dbg(LoadString(g_hInst, DEF_Ext_COM, szStarDotCom, _MAX_EXT));
|
|
Dbg(LoadString(g_hInst, DEF_Ext_ALL, szStarDotStar, _MAX_EXT));
|
|
|
|
return;
|
|
} /* InitFileExtensions() */
|
|
|
|
|
|
VOID
|
|
InitDefaultFont(
|
|
void
|
|
)
|
|
{
|
|
//Set a default font
|
|
|
|
CHARSETINFO csi;
|
|
DWORD dw = GetACP();
|
|
|
|
if (!TranslateCharsetInfo((DWORD*)dw, &csi, TCI_SRCCODEPAGE)) {
|
|
csi.ciCharset = ANSI_CHARSET;
|
|
}
|
|
|
|
g_logfontDefault.lfHeight = 10;
|
|
g_logfontDefault.lfWidth = 0;
|
|
g_logfontDefault.lfEscapement = 0;
|
|
g_logfontDefault.lfOrientation = 0;
|
|
g_logfontDefault.lfWeight = FW_NORMAL;
|
|
g_logfontDefault.lfItalic = 0;
|
|
g_logfontDefault.lfUnderline = 0;
|
|
g_logfontDefault.lfStrikeOut = 0;
|
|
/* use appropriate Character set font as default */
|
|
g_logfontDefault.lfCharSet = (BYTE)csi.ciCharset;
|
|
|
|
/* Set device independent font size */
|
|
{
|
|
HDC hDC;
|
|
int nLogPixY;
|
|
int nHeight;
|
|
int nPoints = 100; //Point size * 10
|
|
|
|
hDC = CreateDC(TEXT("DISPLAY"), NULL, NULL, NULL);
|
|
nLogPixY = GetDeviceCaps(hDC, LOGPIXELSY);
|
|
nHeight = (nPoints / 10) * nLogPixY;
|
|
if(nPoints % 10){
|
|
nHeight += MulDiv(nPoints % 10, nLogPixY, 10);
|
|
}
|
|
g_logfontDefault.lfHeight = MulDiv(nHeight, -1, 72);
|
|
DeleteDC(hDC);
|
|
}
|
|
g_logfontDefault.lfOutPrecision = OUT_DEFAULT_PRECIS;
|
|
g_logfontDefault.lfClipPrecision = CLIP_DEFAULT_PRECIS;
|
|
g_logfontDefault.lfQuality = DEFAULT_QUALITY;
|
|
g_logfontDefault.lfPitchAndFamily = FIXED_PITCH;
|
|
lstrcpy((LPSTR) g_logfontDefault.lfFaceName, (LPSTR)"Terminal");
|
|
|
|
return;
|
|
} /* InitDefaultFont() */
|
|
|
|
|
|
VOID
|
|
InitDefaultFindReplace(
|
|
void
|
|
)
|
|
{
|
|
int i, j;
|
|
|
|
//Initialize Replace/Find structure
|
|
|
|
findReplace.matchCase = FALSE;
|
|
findReplace.regExpr = FALSE;
|
|
findReplace.wholeWord = FALSE;
|
|
findReplace.goUp = FALSE;
|
|
findReplace.findWhat[0] = '\0';
|
|
findReplace.replaceWith[0] = '\0';
|
|
for (j = FIND_PICK; j <= REPLACE_PICK; j++) {
|
|
findReplace.nbInPick[j];
|
|
for (i = 0; i < MAX_PICK_LIST; i++)
|
|
{
|
|
findReplace.hPickList[j][i] = 0;
|
|
}
|
|
}
|
|
frMem.leftCol = 0;
|
|
frMem.rightCol = 0;
|
|
frMem.line = 0;
|
|
frMem.stopLine = 0;
|
|
frMem.stopCol = 0;
|
|
frMem.hDlgFindNextWnd = NULL;
|
|
frMem.hDlgConfirmWnd = NULL;
|
|
frMem.allTagged = FALSE;
|
|
frMem.replacing = FALSE;
|
|
frMem.replaceAll = FALSE;
|
|
|
|
return;
|
|
} /* InitDefaultFindReplace() */
|
|
|
|
|
|
void NEAR PASCAL
|
|
InitTitleBar(
|
|
void
|
|
)
|
|
{
|
|
Dbg(LoadString(g_hInst, SYS_Main_wTitle, (LPSTR)TitleBar.ProgName, sizeof(TitleBar.ProgName)));
|
|
TitleBar.UserTitle[0] = '\0';
|
|
TitleBar.ModeWork[0] = '\0';
|
|
Dbg(LoadString(g_hInst, TBR_Mode_Run, (LPSTR)TitleBar.ModeRun, sizeof(TitleBar.ModeRun)));
|
|
Dbg(LoadString(g_hInst, TBR_Mode_Break, (LPSTR)TitleBar.ModeBreak, sizeof(TitleBar.ModeBreak)));
|
|
TitleBar.Mode = TBM_WORK;
|
|
}
|
|
|
|
|
|
BOOL
|
|
InitDefaultDlls(
|
|
VOID
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Initializes the default workspace with some hard-coded values.
|
|
|
|
Arguments:
|
|
|
|
None
|
|
|
|
Return Value:
|
|
|
|
BOOL - TRUE if successfully initialized
|
|
|
|
--*/
|
|
{
|
|
char szKeyBuf[MAX_PATH];
|
|
|
|
ModListInit();
|
|
|
|
ModListAdd( NT_KERNEL_NAME, sheNone );
|
|
ModListAdd( NT_KRNLMP_NAME, sheNone );
|
|
|
|
ModListSetDefaultShe( sheDeferSyms );
|
|
ModListAddSearchPath( "%SystemRoot%\\symbols" );
|
|
|
|
SrcFileDirectory[0] = '\0';
|
|
ExeFileDirectory[0] = '\0';
|
|
DocFileDirectory[0] = '\0';
|
|
UserDllDirectory[0] = '\0';
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
void FAR PASCAL
|
|
InitDefaults(
|
|
void
|
|
)
|
|
{
|
|
UpdateRadix( 16 );
|
|
fCaseSensitive = FALSE;
|
|
|
|
InitDefaultFindReplace();
|
|
InitDefaultFont();
|
|
InitTitleBar();
|
|
|
|
SetSrcMode_StatusBar(TRUE);
|
|
|
|
InitDefaultDlls();
|
|
|
|
return;
|
|
} /* InitDefaults() */
|