📄 watchwnd.c
字号:
WriteValue(info->address, &v, 4, &info->thread->regs);
break;
case T_REAL64:
case T_IMAGINARY64:
v2 = v;
WriteValue(info->address, &v2, 8, &info->thread->regs);
break;
case T_REAL80:
case T_IMAGINARY80:
*(long double*)data = v;
WriteValue(info->address, data, 10, &info->thread->regs);
break;
default:
break;
}
}
else if (CV_TYP_IS_COMPLEX(info->type))
{
float v[2];
double v2[2];
long double v4[2];
sscanf(text, "%f + %f * I", &v[0],&v[1]);
switch (info->type)
{
case T_CPLX32:
WriteValue(info->address, &v[0], 8, &info->thread->regs);
break ;
case T_CPLX64:
v2[0] = v[0];
v2[1] = v[1];
WriteValue(info->address, &v2[0], 16, &info->thread->regs);
break ;
case T_CPLX80:
v4[0] = v[0];
v4[1] = v[1];
WriteValue(info->address, &v4[0], 20, &info->thread->regs);
break ;
}
}
else
{
LLONG_TYPE value;
int size;
if (info->enumx && !isdigit(text[0]))
{
value = InputEnum(watchinfo_list[info->watchindex].typetab, info,
text);
size = 4;
}
else
{
#ifdef BORLANDC
if (text[0] == '0' && text[1] == 'x')
sscanf(text + 2, "%x", &value);
else if ((text[strlen(text) - 1] &0xDF) == 'H')
sscanf(text, "%x", &value);
else
sscanf(text, "%d", &value);
#else
if (text[0] == '0' && text[1] == 'x')
sscanf(text + 2, "%llx", &value);
else if (text[strlen(text) - 1] &0xDF == 'H')
sscanf(text, "%llx", &value);
else
sscanf(text, "%lld", &value);
#endif
switch (CV_TYPE(info->type))
{
case CV_INT:
size = 1 << (CV_SUBT(info->type) / 2);
break;
case CV_SIGNED:
case CV_UNSIGNED:
case CV_BOOLEAN:
size = 1 << CV_SUBT(info->type);
break;
}
}
if (info->bitfield)
{
char data[10];
int signedx;
int v;
HintBasicType(info, &signedx, &data);
v = *(int*)data;
v &= ~(bitmask[info->bitlength - 1] << info->bitstart);
value = v | ((value &bitmask[info->bitlength - 1]) << info
->bitstart);
}
WriteValue(info->address, &value, size, &info->thread->regs);
if (info->pointer)
{
if (!value && info->subtype)
{
VARINFO *inf = info->subtype;
info->subtype = 0;
FreeTree(inf);
FreeVarInfo(inf);
}
else
RefreshAddresses(info->subtype, value, info->outofscope);
}
}
RefreshData(watchinfo_list[info->watchindex].typetab, info);
}
//-------------------------------------------------------------------------
int EIPFromCursor(HWND win)
{
charinfo charrange;
int offset = 0;
int lineno;
char *filename;
if (!win)
{
if (!IsWindow(win = (HWND)SendMessage(hwndClient, WM_MDIGETACTIVE, 0, 0)
) || IsSpecialWindow(win))
return 0;
}
filename = (char*)SendMessage(win, WM_FILENAME, 0, 0);
SendMessage(GetDlgItem(win, ID_EDITCHILD), EM_EXGETSEL, (WPARAM)0, (LPARAM)
&charrange);
lineno = SendMessage(GetDlgItem(win, ID_EDITCHILD), EM_EXLINEFROMCHAR, 0,
(LPARAM)charrange.min) + 1;
lineno = TagOldLine(filename, lineno);
offset = GetBreakpointAddress(filename, &lineno, TRUE);
return offset;
}
//-------------------------------------------------------------------------
LRESULT CALLBACK _export WatchWndProc(HWND hwnd, UINT iMessage, WPARAM wParam,
LPARAM lParam)
{
static int selected;
static POINT menupos;
static char buf[256];
RECT r, *pr;
WINDOWPOS wp;
HD_ITEM hie;
HD_LAYOUT hdl;
NMHDR *h;
DRAWITEMSTRUCT *dr;
HBITMAP hbmp;
HDC hMemDC;
TCHeader tch;
TV_ITEM item;
TV_INSERTSTRUCT t;
static int sizingbottom;
int offset;
char *types, *syms;
DEBUG_INFO *dbg;
NM_TREEVIEW *nmt;
VARINFO *var;
HWND win;
int ebp;
int level;
int offset1;
THREAD *thread;
switch (iMessage)
{
case WM_MDIACTIVATE:
SendMessage(hwndCtrl, LCF_SETACTIVE, 0, lParam == (LPARAM)hwnd);
if (lParam == (LPARAM)hwnd)
{
SendMessage(hwndSourceTab, WM_SETACTIVETAB, 0, (LPARAM)hwnd);
SetFocus(hwndTree);
}
return TRUE;
case WM_SYSCOMMAND:
if (wParam == SC_CLOSE)
{
PostMessage(hwnd, WM_CLOSE, 0, 0);
return 0;
}
break;
case WM_NOTIFY:
h = (NMHDR*)lParam;
switch (h->code)
{
case NM_RCLICK:
{
HMENU menu = LoadMenu(hInstance, "WATCHMENU");
HMENU popup = GetSubMenu(menu, 0);
GetCursorPos(&menupos);
TrackPopupMenuEx(popup, TPM_BOTTOMALIGN | TPM_LEFTBUTTON,
menupos.x, menupos.y, hwndFrame, NULL);
DestroyMenu(menu);
}
return 0;
case TVN_ITEMEXPANDING:
nmt = h;
if (nmt->action)
{
ExpandPointer((VARINFO*)nmt->itemNew.lParam, nmt->action);
}
return 0;
case TCN_EDITQUERY:
nmt = h;
item.mask = TVIF_PARAM;
item.hItem = (HTREEITEM)nmt->itemNew.hItem;
TreeView_GetItem(hwndTree, &item);
var = (VARINFO*)item.lParam;
if (var->editable)
{
WatchValue(watchinfo_list[var->watchindex].typetab, buf,
var, TRUE);
return buf;
}
return 0;
case TCN_EDITDONE:
nmt = h;
item.mask = TVIF_PARAM;
item.hItem = (HTREEITEM)nmt->itemNew.hItem;
TreeView_GetItem(hwndTree, &item);
var = (VARINFO*)item.lParam;
ChangeData(var, nmt->itemNew.pszText);
return 0;
}
break;
case WM_CREATE:
hwndWatch = hwnd;
GetClientRect(hwnd, &r);
hwndCtrl = CreateControlWindow(DID_WATCHWND, hwnd, &r, FALSE,
szWatchTitle);
GetClientRect(hwnd, &r);
SendMessage(hwndCtrl, LCF_ADJUSTRECT, 0, (LPARAM) &r);
valueBitmap = LoadBitmap(hInstance, "ID_VALUEBMP");
itemBitmap = LoadBitmap(hInstance, "ID_ITEMBMP");
ChangeBitmapColor(valueBitmap, 0x00ffff, GetSysColor(COLOR_3DFACE));
ChangeBitmapColor(itemBitmap, 0x00ffff, GetSysColor(COLOR_3DFACE));
tch.colText1 = "Item";
tch.colText2 = "Value";
tch.colBmp1 = itemBitmap;
tch.colBmp2 = valueBitmap;
hwndTree = CreateextTreeWindow(hwndCtrl, WS_DLGFRAME | TCS_LINE, &r,
&tch);
// PostMessage(hwnd,WM_CLOSE,0 , 0 ) ;
// PostMessage(hwndFrame, WM_REDOSIZING, 0, 0) ;
return 0;
case WM_ADDWATCHINDIRECT:
win = (HWND)wParam;
if (SendMessage(win, WM_WORDUNDERCURSOR, 0, (LPARAM)buf))
{
int offset2 = offset = EIPFromCursor(win);
offset1 = findStackedFunction(offset, &ebp, &level, &thread);
if (FindSymbol(&dbg, &types, &syms, &offset, offset1, offset,
buf))
{
var = GetVarInfo(dbg, types, syms, offset, buf, ebp, thread)
;
if (var)
{
AddItem(types, dbg, syms, var, ebp, offset2);
dmgrHideWindow(DID_WATCHWND, FALSE);
break;
}
}
}
ExtendedMessageBox("Symbol scope", MB_SETFOREGROUND |
MB_SYSTEMMODAL, "Symbol does not exist in this scope");
break;
case WM_ADDWATCH:
offset = wParam;
if (!offset)
{
DeleteAllItems();
}
else
{
int offset2 = offset = EIPFromCursor(0);
var = EvalExpr(&types, &syms, &dbg, offset, &offset, (char*)
lParam);
if (var)
{
AddItem(types, dbg, syms, var, ebp, offset2);
dmgrHideWindow(DID_WATCHWND, FALSE);
}
}
break;
case WM_COMMAND:
switch (wParam)
{
case ID_SETADDRESS:
RefreshItems();
InvalidateRect(hwndTree, 0, 0);
break;
case IDM_DELETEWATCH:
DeleteItem(&menupos);
break;
}
break;
case WM_DESTROY:
TreeView_DeleteAllItems(hwndTree);
DestroyWindow(hwndTree);
DeleteObject(valueBitmap);
DeleteObject(itemBitmap);
DestroyWindow(hwndCtrl);
hwndWatch = 0;
break;
case WM_SIZE:
r.left = r.top = 0;
r.right = LOWORD(lParam);
r.bottom = HIWORD(lParam);
MoveWindow(hwndCtrl, r.left, r.top, r.right - r.left, r.bottom -
r.top, TRUE);
SendMessage(hwndCtrl, LCF_ADJUSTRECT, 0, (LPARAM) &r);
MoveWindow(hwndTree, r.left, r.top, r.right - r.left, r.bottom -
r.top, TRUE);
return 0;
case WM_CLOSE:
dmgrHideWindow(DID_WATCHWND, TRUE);
return 0;
}
return DefMDIChildProc(hwnd, iMessage, wParam, lParam);
}
//-------------------------------------------------------------------------
void RegisterWatchWindow(void)
{
WNDCLASS wc;
memset(&wc, 0, sizeof(wc));
wc.style = 0;
wc.lpfnWndProc = &WatchWndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(0, IDI_APPLICATION);
wc.hCursor = LoadCursor(0, IDC_ARROW);
wc.hbrBackground = GetStockObject(WHITE_BRUSH);
wc.lpszMenuName = 0;
wc.lpszClassName = szWatchClassName;
RegisterClass(&wc);
}
//-------------------------------------------------------------------------
void CreateWatchWindow(void)
{
CreateMDIWindow(szWatchClassName, szWatchTitle, WS_CHILD | WS_CLIPSIBLINGS
| WS_DLGFRAME, CW_USEDEFAULT, CW_USEDEFAULT, 200, 200, hwndClient,
hInstance, (LPARAM)0);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -