Windows2000/private/windbg64/windbg/dbugdll.c

629 lines
20 KiB
C
Raw Permalink Normal View History

2001-01-01 00:00:00 +01:00
/*++
Copyright (c) 1992 Microsoft Corporation
Module Name:
dbugdll.c
Abstract:
This file contains the code for dealing with the Debugger Dll Dialog box
Author:
Griffith Wm. Kadnier (v-griffk)
Environment:
Win32 - User
--*/
#include "precomp.h"
#pragma hdrstop
#include "include\cntxthlp.h"
PSTR pszSelectedTL;
void
AddDataToList(
HWND hwndDlg,
CAll_TLs_WKSP * pCCopyOf_All_TLs_WrkSpc
)
{
Assert(pCCopyOf_All_TLs_WrkSpc);
HWND hwndList = GetDlgItem(hwndDlg, IDC_LIST1);
// Add the data to the list view
ListView_DeleteAllItems(hwndList);
// Add the individual items
LV_ITEM lvi;
// Initialize LV_ITEM members that are common to all items.
memset(&lvi, 0, sizeof(lvi));
lvi.mask = LVIF_TEXT; // | LVIF_IMAGE | LVIF_STATE;
//lvi.lParam = 0; // item data
//lvi.state = 0;
//lvi.stateMask = 0;
int nItems = 0;
TListEntry<CIndiv_TL_WKSP *> * pContEntry = pCCopyOf_All_TLs_WrkSpc->m_listConts.FirstEntry();
for (; pContEntry != pCCopyOf_All_TLs_WrkSpc->m_listConts.Stop();
pContEntry = pContEntry->Flink, nItems++) {
CIndiv_TL_WKSP * pIndTl = pContEntry->m_tData;
AssertType(*pIndTl, CIndiv_TL_WKSP);
// Add name (main item)
lvi.iItem = nItems;
lvi.pszText = (LPSTR) pIndTl->m_pszRegistryName;
lvi.iSubItem = 0;
// Index of the new item.
int nIdx = ListView_InsertItem(hwndList, &lvi);
Assert(-1 != nIdx);
// Add description (sub item)
ListView_SetItemText(hwndList, nIdx, 1, pIndTl->m_pszDescription);
// Add DLL (sub item)
ListView_SetItemText(hwndList, nIdx, 2, pIndTl->m_pszDll);
// Add params (sub item)
ListView_SetItemText(hwndList, nIdx, 3, pIndTl->m_pszParams);
// We perform the test because this routine is called on 2 occasions
// during init and after we have edited an entry. If we have something
// selected we don't want to overwrite it.
if (0 == GetWindowTextLength(GetDlgItem(hwndDlg, IDC_STEXT_SELECT) )) {
// Display the short name of the selected transport layer.
if (pszSelectedTL) {
SetDlgItemText(hwndDlg, IDC_STEXT_SELECT, pszSelectedTL);
}
}
}
// Select the first item
ListView_SetItemState(hwndList, 0, LVIS_SELECTED | LVIS_FOCUSED, 0x000F);
}
// Used primarily by DlgProc_TransportLayer, however, EditTransportLayersDlgProc
// also uses it to check for duplicates.
static CAll_TLs_WKSP * g_pCCopyOf_All_TLs_WrkSpc = NULL;
INT_PTR
WINAPI
EditTransportLayersDlgProc(
HWND hwndDlg,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
)
/*++
Routine Description:
Edit a transport layer
Arguments:
Return Value:
See docs for "DialogBox"
--*/
{
static DWORD HelpArray[]=
{
ID_CHDBDLL_NAME, IDH_DISPNAME,
ID_CHDBDLL_DESC, IDH_DESC,
ID_CHDBDLL_PATH, IDH_PATH,
ID_CHDBDLL_PARAM, IDH_PARAMETERS,
0, 0
};
static CIndiv_TL_WKSP * pTL = NULL;
switch (uMsg) {
case WM_INITDIALOG:
// lParam point to a transport layer.
Assert(lParam);
pTL = (CIndiv_TL_WKSP *) lParam;
AssertType(*pTL, CIndiv_TL_WKSP);
SetDlgItemText(hwndDlg, ID_CHDBDLL_NAME, pTL->m_pszRegistryName);
SetDlgItemText(hwndDlg, ID_CHDBDLL_DESC, pTL->m_pszDescription);
SetDlgItemText(hwndDlg, ID_CHDBDLL_PATH, pTL->m_pszDll);
SetDlgItemText(hwndDlg, ID_CHDBDLL_PARAM, pTL->m_pszParams);
return TRUE;
case WM_DESTROY:
pTL = NULL;
return TRUE;
case WM_COMMAND:
switch (wParam) {
case IDOK:
{
char szName[MAX_MSG_TXT];
char szDesc[MAX_MSG_TXT];
char szDll[MAX_MSG_TXT];
char szParams[MAX_MSG_TXT];
GetDlgItemText(hwndDlg, ID_CHDBDLL_NAME, szName, sizeof(szName));
GetDlgItemText(hwndDlg, ID_CHDBDLL_DESC, szDesc, sizeof(szDesc));
GetDlgItemText(hwndDlg, ID_CHDBDLL_PATH, szDll, sizeof(szDll));
GetDlgItemText(hwndDlg, ID_CHDBDLL_PARAM, szParams, sizeof(szParams));
// Verify that key is not empty, and unique
if (0 == strlen(szName)) {
WKSP_MsgBox(NULL, ERR_Empty_Shortname);
return TRUE;
}
// Are we adding or editing
if (NULL == pTL->m_pszRegistryName) {
// If it doesn't have a registry name, then we are adding
// Make sure the name isn't duplicated.
if (g_pCCopyOf_All_TLs_WrkSpc->
m_listConts.Find(szName, WKSP_Generic_CmpRegName) ) {
WKSP_MsgBox(NULL, ERR_Not_Unique_Shortname, szName);
return TRUE;
}
} else {
// If it does have a registry name, then we are editing
if (strcmp(szName, pTL->m_pszRegistryName)) {
// The name has changed, then make sure it isn't duplicated.
if (g_pCCopyOf_All_TLs_WrkSpc->
m_listConts.Find(szName, WKSP_Generic_CmpRegName) ) {
WKSP_MsgBox(NULL, ERR_Not_Unique_Shortname, szName);
return TRUE;
}
}
}
pTL->SetRegistryName(szName);
FREE_STR(pTL->m_pszDescription);
pTL->m_pszDescription = _strdup(szDesc);
FREE_STR(pTL->m_pszDll);
pTL->m_pszDll = _strdup(szDll);
FREE_STR(pTL->m_pszParams);
pTL->m_pszParams = _strdup(szParams);
EndDialog(hwndDlg, TRUE);
}
return TRUE;
case IDCANCEL:
EndDialog(hwndDlg, FALSE);
return TRUE;
case WM_HELP:
WinHelp((HWND)((LPHELPINFO) lParam)->hItemHandle, "windbg.hlp", HELP_WM_HELP,
(ULONG_PTR)(LPVOID) HelpArray );
return TRUE;
case WM_CONTEXTMENU:
WinHelp ((HWND) wParam, "windbg.hlp", HELP_CONTEXTMENU,
(ULONG_PTR)(LPVOID) HelpArray );
return TRUE;
}
}
return FALSE;
}
INT_PTR
DlgProc_TransportLayer(
HWND hwndDlg,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
)
/*++
Routine Description:
This routine contains the window procedure for transport dll selection
dialog
Editing of transport layers is not allowed when doing kernel debugging or
the debugging of kernel and user mode dumps.
Arguments:
Return Value:
See docs for "DialogBox"
--*/
{
// fKernelDebugger cover kernel and kernel dumps
BOOL bTL_EditingAllowed = !g_contWorkspace_WkSp.m_bKernelDebugger &&
!g_contWorkspace_WkSp.m_bUserCrashDump;
static DWORD HelpArray[]=
{
IDC_LIST1, IDH_TRANSPORT,
IDC_STEXT_SELECT, IDH_TLSELECT,
IDC_BUT_SELECT, IDH_TLSELECT,
IDC_BUT_ADD, IDH_TLADD,
IDC_BUT_EDIT, IDH_TLEDIT,
IDC_BUT_DELETE, IDH_TLDEL,
0, 0
};
static DWORD NOEDIT_HelpArray[]=
{
IDC_LIST1, IDH_TRANSPORT_DISABLED,
IDC_STEXT_SELECT, IDH_TRANSPORT_DISABLED,
IDC_BUT_SELECT, IDH_TRANSPORT_DISABLED,
IDC_BUT_ADD, IDH_TRANSPORT_DISABLED,
IDC_BUT_EDIT, IDH_TRANSPORT_DISABLED,
IDC_BUT_DELETE, IDH_TRANSPORT_DISABLED,
0, 0
};
PDWORD pdwHelpArray = bTL_EditingAllowed ? HelpArray : NOEDIT_HelpArray;
HWND hwndList = GetDlgItem(hwndDlg, IDC_LIST1);
HWND hwndEdit = GetDlgItem(hwndDlg, IDC_BUT_EDIT);
HWND hwndDelete = GetDlgItem(hwndDlg, IDC_BUT_DELETE);
HWND hwndSelect = GetDlgItem(hwndDlg, IDC_BUT_SELECT);
switch (uMsg) {
default:
return FALSE;
case WM_HELP:
WinHelp((HWND)((LPHELPINFO) lParam)->hItemHandle,
"windbg.hlp",
HELP_WM_HELP,
(ULONG_PTR) pdwHelpArray );
return TRUE;
case WM_CONTEXTMENU:
WinHelp((HWND) wParam,
"windbg.hlp",
HELP_CONTEXTMENU,
(ULONG_PTR) pdwHelpArray );
return TRUE;
case WM_INITDIALOG:
if (!bTL_EditingAllowed) {
EnableWindow(GetDlgItem(hwndDlg, IDC_LIST1), FALSE);
EnableWindow(GetDlgItem(hwndDlg, IDC_BUT_SELECT), FALSE);
EnableWindow(GetDlgItem(hwndDlg, IDC_STEXT_SELECT), FALSE);
EnableWindow(GetDlgItem(hwndDlg, IDC_BUT_ADD), FALSE);
EnableWindow(GetDlgItem(hwndDlg, IDC_BUT_EDIT), FALSE);
EnableWindow(GetDlgItem(hwndDlg, IDC_BUT_DELETE), FALSE);
}
// This section sets up the dialog and initializes the fields.
// Make a copy of the registry, and screw with the copy.
Assert(NULL == g_pCCopyOf_All_TLs_WrkSpc);
g_pCCopyOf_All_TLs_WrkSpc = new CAll_TLs_WKSP();
g_pCCopyOf_All_TLs_WrkSpc->m_bDynamicList = TRUE;
g_pCCopyOf_All_TLs_WrkSpc->Duplicate(g_dynacontAll_TLs_WkSp);
Assert(NULL == pszSelectedTL);
Assert(g_contWorkspace_WkSp.m_pszSelectedTL);
pszSelectedTL = _strdup(g_contWorkspace_WkSp.m_pszSelectedTL);
// Set the extended style
ListView_SetExtendedListViewStyle(hwndList, LVS_EX_FULLROWSELECT);
// Setup the column header for the list view
// Add Column headers
{
char szColHdr[MAX_MSG_TXT];
LV_COLUMN lvc;
// Initialize the LV_COLUMN structure.
lvc.mask = lvc.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
lvc.fmt = LVCFMT_LEFT;
lvc.cx = 100;
lvc.pszText = szColHdr;
// Add the 1st column hdr
Dbg(LoadString(g_hInst, SYS_TRANSPORT_LAYER_COL_HDR1,
szColHdr, sizeof(szColHdr)));
lvc.iSubItem = 0;
Dbg(ListView_InsertColumn(hwndList, lvc.iSubItem, &lvc) != -1);
// Add the 2nd col hdr
Dbg(LoadString(g_hInst, SYS_TRANSPORT_LAYER_COL_HDR2,
szColHdr, sizeof(szColHdr)));
lvc.iSubItem = 1;
Dbg(ListView_InsertColumn(hwndList, lvc.iSubItem, &lvc) != -1);
// Add the 3rd col hdr
Dbg(LoadString(g_hInst, SYS_TRANSPORT_LAYER_COL_HDR3,
szColHdr, sizeof(szColHdr)));
lvc.iSubItem = 2;
Dbg(ListView_InsertColumn(hwndList, lvc.iSubItem, &lvc) != -1);
// Add the 4th col hdr
Dbg(LoadString(g_hInst, SYS_TRANSPORT_LAYER_COL_HDR4,
szColHdr, sizeof(szColHdr)));
lvc.iSubItem = 3;
Dbg(ListView_InsertColumn(hwndList, lvc.iSubItem, &lvc) != -1);
}
// Add the actual data to the list
AddDataToList(hwndDlg, g_pCCopyOf_All_TLs_WrkSpc);
return TRUE;
case WM_COMMAND:
if (bTL_EditingAllowed) {
WORD wNotifyCode = HIWORD(wParam); // notification code
WORD wID = LOWORD(wParam); // item, control, or accelerator identifier
HWND hwndCtl = (HWND) lParam; // handle of control
switch (wID) {
default:
return FALSE;
case IDC_BUT_RESET:
{
// Reset it to the original contents
CAll_TLs_WKSP * pAll_TLs_Tmp = new CAll_TLs_WKSP();
if (pAll_TLs_Tmp) {
g_pCCopyOf_All_TLs_WrkSpc->Duplicate(*pAll_TLs_Tmp);
// Data has been changed, repopulate the list.
AddDataToList(hwndDlg, g_pCCopyOf_All_TLs_WrkSpc);
BOOL bEmpty = ListView_GetItemCount(hwndList) <= 0;
EnableWindow(hwndEdit, !bEmpty);
EnableWindow(hwndDelete, !bEmpty);
EnableWindow(hwndSelect, !bEmpty);
delete pAll_TLs_Tmp;
}
}
return FALSE;
case IDC_BUT_SELECT:
if (BN_CLICKED == wNotifyCode) {
int nCurSel = ListView_GetNextItem(hwndList, -1, LVNI_SELECTED);
Assert(-1 != nCurSel);
if (nCurSel >= 0) {
char sz[MAX_PATH];
ListView_GetItemText(hwndList, nCurSel, 0, sz, sizeof(sz));
SetDlgItemText(hwndDlg, IDC_STEXT_SELECT, sz);
FREE_STR(pszSelectedTL);
pszSelectedTL = _strdup(sz);
}
}
return FALSE;
case IDC_BUT_DELETE:
if (BN_CLICKED == wNotifyCode) {
int nCurSel = ListView_GetNextItem(hwndList, -1, LVNI_SELECTED);
Assert(-1 != nCurSel);
char szTransName[MAX_MSG_TXT]; // Transport name
ListView_GetItemText(hwndList, nCurSel, 0, szTransName, sizeof(szTransName));
char szMsg[MAX_VAR_MSG_TXT];
{
char szQuestion[MAX_MSG_TXT]; // Question confirming deletion
Dbg(LoadString(g_hInst, DBG_Deleting_DLL, szQuestion, sizeof(szQuestion)));
wsprintf(szMsg, szQuestion, szTransName);
}
char szTitle[MAX_MSG_TXT];
Dbg(LoadString(g_hInst, DLG_Deleting_DLL_Title, szTitle, sizeof(szTitle)));
strcat(szTitle, "'");
strcat(szTitle, szTransName);
strcat(szTitle, "'");
if (MessageBox(hwndDlg, szMsg, szTitle, MB_OKCANCEL | MB_TASKMODAL) == IDOK) {
// Did we erase the selected transport layer
if (pszSelectedTL && !strcmp(szTransName, pszSelectedTL)) {
// Erased
FREE_STR(pszSelectedTL);
}
// Remove the deleted TL from the reg list.
{
TListEntry<CIndiv_TL_WKSP *> * pContEntry =
g_pCCopyOf_All_TLs_WrkSpc->
m_listConts.Find(szTransName, WKSP_Generic_CmpRegName);
Assert(pContEntry);
delete pContEntry->m_tData;
delete pContEntry;
}
Dbg(ListView_DeleteItem(hwndList, nCurSel));
// Select the first item, make sure something is always selected.
ListView_SetItemState(hwndList, 0, LVIS_SELECTED | LVIS_FOCUSED, 0x000F);
BOOL bEmpty = ListView_GetItemCount(hwndList) <= 0;
EnableWindow(hwndEdit, !bEmpty);
EnableWindow(hwndSelect, !bEmpty);
EnableWindow(hwndDelete, !bEmpty);
SetDlgItemText(hwndDlg, IDC_STEXT_SELECT, pszSelectedTL);
}
}
return FALSE;
case IDC_BUT_EDIT:
if (BN_CLICKED == wNotifyCode) {
int nCurSel = ListView_GetNextItem(hwndList, -1, LVNI_SELECTED);
Assert(-1 != nCurSel);
char szTransName[MAX_MSG_TXT]; // Transport name
ListView_GetItemText(hwndList, nCurSel, 0, szTransName, sizeof(szTransName));
TListEntry<CIndiv_TL_WKSP *> * pContEntry =
g_pCCopyOf_All_TLs_WrkSpc->
m_listConts.Find(szTransName, WKSP_Generic_CmpRegName);
if (DialogBoxParam(g_hInst, MAKEINTRESOURCE(IDD_DLG_TRANSPORTLAYER), hwndDlg,
EditTransportLayersDlgProc, (LPARAM)pContEntry->m_tData)) {
// Data has been changed, repopulate the list.
AddDataToList(hwndDlg, g_pCCopyOf_All_TLs_WrkSpc);
}
BOOL bEmpty = ListView_GetItemCount(hwndList) <= 0;
EnableWindow(hwndEdit, !bEmpty);
EnableWindow(hwndDelete, !bEmpty);
EnableWindow(hwndSelect, !bEmpty);
}
return FALSE;
case IDC_BUT_ADD:
if (BN_CLICKED == wNotifyCode) {
CIndiv_TL_WKSP * pTL = new CIndiv_TL_WKSP;
if (DialogBoxParam(g_hInst, MAKEINTRESOURCE(IDD_DLG_TRANSPORTLAYER), hwndDlg,
EditTransportLayersDlgProc, (LPARAM)pTL)) {
pTL->SetParent(g_pCCopyOf_All_TLs_WrkSpc);
g_pCCopyOf_All_TLs_WrkSpc->AddToContainerList(pTL);
// Data has been changed, repopulate the list.
AddDataToList(hwndDlg, g_pCCopyOf_All_TLs_WrkSpc);
BOOL bEmpty = ListView_GetItemCount(hwndList) <= 0;
EnableWindow(hwndEdit, !bEmpty);
EnableWindow(hwndDelete, !bEmpty);
EnableWindow(hwndSelect, !bEmpty);
} else {
delete pTL;
}
}
return FALSE;
}
}
return FALSE;
case WM_NOTIFY:
switch (((LPNMHDR) lParam)->code) {
default:
return FALSE;
case NM_DBLCLK:
if (bTL_EditingAllowed) {
LPNMHDR lpnmh = (LPNMHDR) lParam;
switch (lpnmh->idFrom) {
case IDC_LIST1:
// Dbl clicking will work the same as a pressing the "select" button.
// Let the Select button process the dbl click
PostMessage(hwndDlg, WM_COMMAND, MAKEWPARAM(IDC_BUT_SELECT, BN_CLICKED),
(LPARAM) lpnmh->hwndFrom);
break;
}
}
return FALSE;
case PSN_KILLACTIVE:
// Error checking: must select a TL, and that TL must exist
if (!ValidateAllTransportLayers(hwndDlg, g_pCCopyOf_All_TLs_WrkSpc)) {
MessageBeep(MB_ICONEXCLAMATION);
SetWindowLong(hwndDlg, DWLP_MSGRESULT, TRUE);
}
if (NULL == pszSelectedTL) {
PSTR pszTitle = WKSP_DynaLoadString(g_hInst, SYS_Warning);
WKSP_MsgBox(pszTitle, ERR_Please_Select_A_TL);
free(pszTitle);
MessageBeep(MB_ICONEXCLAMATION);
SetWindowLong(hwndDlg, DWLP_MSGRESULT, TRUE);
} else if (NULL == g_pCCopyOf_All_TLs_WrkSpc->
m_listConts.Find(pszSelectedTL, WKSP_Generic_CmpRegName)) {
PSTR pszTitle = WKSP_DynaLoadString(g_hInst, SYS_Warning);
WKSP_MsgBox(pszTitle, ERR_Transport_Doesnt_Exist, pszSelectedTL);
free(pszTitle);
MessageBeep(MB_ICONEXCLAMATION);
SetWindowLong(hwndDlg, DWLP_MSGRESULT, TRUE);
}
SetWindowLong(hwndDlg, DWLP_MSGRESULT, FALSE);
return TRUE;
case PSN_APPLY:
g_dynacontAll_TLs_WkSp.Duplicate(*g_pCCopyOf_All_TLs_WrkSpc);
g_dynacontAll_TLs_WkSp.Save(FALSE, FALSE);
Assert(SetTransportLayer(pszSelectedTL, g_pCCopyOf_All_TLs_WrkSpc));
return TRUE;
}
break;
case WM_DESTROY:
delete g_pCCopyOf_All_TLs_WrkSpc;
g_pCCopyOf_All_TLs_WrkSpc = NULL;
if (pszSelectedTL) {
free(pszSelectedTL);
pszSelectedTL = NULL;
}
return FALSE;
}
}