LRESULT CALLBACK WatchWndProc(HWND hwnd, UINT iMessage, WPARAM wParam, LPARAM lParam) { WATCHDATA *ptr; 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; DEBUG_INFO *dbg; NM_TREEVIEW *nmt; VARINFO *var; HWND win; int level; int offset1; int doit; int i; CHARRANGE charrange; switch (iMessage) { case WM_SYSCOMMAND: if (wParam == SC_CLOSE) { PostMessage(hwnd, WM_CLOSE, 0, 0); return 0; } break; case WM_NOTIFY: ptr = (WATCHDATA *)GetWindowLong(hwnd, 0); h = (NMHDR*)lParam; switch (h->code) { case NM_RCLICK: { if (ptr->DID != DID_LOCALSWND) { HMENU menu = LoadMenuGeneric(hInstance, "WATCHMENU"); HMENU popup = GetSubMenu(menu, 0); TV_HITTESTINFO t; HTREEITEM titem; GetCursorPos(&t.pt); ScreenToClient(ptr->hwndWatchTree, &t.pt); titem = TreeView_HitTest(ptr->hwndWatchTree, &t); if (!titem || TreeView_GetParent(ptr->hwndWatchTree, titem)) { EnableMenuItem(popup, IDM_DELETEWATCH, MF_GRAYED); } InsertBitmapsInMenu(popup); GetCursorPos(&menupos); TrackPopupMenuEx(popup, TPM_BOTTOMALIGN | TPM_LEFTBUTTON, menupos.x, menupos.y, hwndFrame, NULL); DestroyMenu(menu); lastWatch = ptr->DID; } SetFocus(ptr->hwndWatchTree); } return 0; case TVN_ITEMEXPANDING: nmt = (LPNMTREEVIEW)h; if (nmt->action) { ExpandPointer((VARINFO*)nmt->itemNew.lParam, nmt->action, ptr); } return 0; case TCN_EDITQUERY: nmt = (LPNMTREEVIEW)h; item.mask = TVIF_PARAM; item.hItem = (HTREEITEM)nmt->itemNew.hItem; TreeView_GetItem(ptr->hwndWatchTree, &item); var = (VARINFO*)item.lParam; if (var->editable) { WatchValue(ptr->watchinfo_list[var->watchindex].dbg_info, buf, var, TRUE); return buf; } return 0; case TCN_EDITDONE: nmt = (LPNMTREEVIEW)h; item.mask = TVIF_PARAM; item.hItem = (HTREEITEM)nmt->itemNew.hItem; TreeView_GetItem(ptr->hwndWatchTree, &item); var = (VARINFO*)item.lParam; ChangeData(var, nmt->itemNew.pszText, ptr); RefreshItems(ptr); return 0; } break; case WM_CREATE: ptr = (WATCHDATA *)calloc(sizeof(WATCHDATA),1); SetWindowLong(hwnd, 0, (long)ptr); GetClientRect(hwnd, &r); tch.colText1 = "Item"; tch.colText2 = "Value"; tch.colBmp1 = itemBitmap; tch.colBmp2 = valueBitmap; ptr->hwndWatchTree = CreateextTreeWindow(hwnd, WS_DLGFRAME | TCS_LINE | WS_VISIBLE, &r, &tch); return 0; case WM_ADDWATCHINDIRECT: ptr = (WATCHDATA *)GetWindowLong(hwnd, 0); win = (HWND)wParam; doit = FALSE; SendMessage(win, EM_EXGETSEL, (WPARAM)0, (LPARAM) &charrange); if (charrange.cpMin == charrange.cpMax) { doit = SendMessage(win, WM_WORDUNDERPOINT, (WPARAM)&rightclickPos, (LPARAM)buf); if (!doit) { PostMessage(hwndFrame, WM_COMMAND, IDM_ADDWATCH, 0); break; } } else { if (charrange.cpMax - charrange.cpMin < sizeof(buf) ||charrange.cpMin - charrange.cpMax < sizeof(buf)) { SendMessage(win, EM_GETSELTEXT, 0, (LPARAM)buf); doit = TRUE ; } } if (doit) { var = EvalExpr(&dbg, activeScope, (char*) buf, TRUE); if (var) { AddItem(dbg, var, activeScope->address, ptr); SelectWindow(ptr->DID); break ; } } ExtendedMessageBox("Error", MB_SETFOREGROUND | MB_SYSTEMMODAL, "Symbol does not exist in this scope"); break; case WM_ADDWATCH: ptr = (WATCHDATA *)GetWindowLong(hwnd, 0); offset = wParam; if (!offset) { DeleteAllItems(ptr); } else { var = EvalExpr(&dbg, activeScope, (char*) lParam, TRUE); if (var) { AddItem(dbg, var, activeScope->address, ptr); SelectWindow(ptr->DID); } } break; case WM_INITIALSTACK: ptr = (WATCHDATA *)GetWindowLong(hwnd, 0); ptr->refreshNeeded = TRUE; break; case WM_COMMAND: ptr = (WATCHDATA *)GetWindowLong(hwnd, 0); switch (wParam) { case ID_SETADDRESS: if (ptr->DID == DID_LOCALSWND) LoadLocals(ptr); if (ptr->refreshNeeded) ReloadVars(ptr); else RefreshItems(ptr); ptr->refreshNeeded = FALSE; InvalidateRect(ptr->hwndWatchTree, 0, 0); break; case IDM_DELETEWATCH: DeleteItem(&menupos, ptr); break; case IDM_DELETEALLWATCH: DeleteAllItems(ptr); break; } break; case WM_DESTROY: ptr = (WATCHDATA *)GetWindowLong(hwnd, 0); TreeView_DeleteAllItems(ptr->hwndWatchTree); DestroyWindow(ptr->hwndWatchTree); DeleteObject(valueBitmap); DeleteObject(itemBitmap); break; case WM_SIZE: ptr = (WATCHDATA *)GetWindowLong(hwnd, 0); r.left = 0; r.right = LOWORD(lParam); r.top = 0; r.bottom = HIWORD(lParam); MoveWindow(ptr->hwndWatchTree, r.left, r.top, r.right - r.left, r.bottom - r.top, 0); return 0; case WM_CLOSE: break; case WM_ACTIVATEME: ptr = (WATCHDATA *)GetWindowLong(hwnd, 0); if (ptr->DID != DID_LOCALSWND) lastWatch = ptr->DID; SendMessage(GetParent(hwnd), WM_ACTIVATEME, 0, 0); break; } return DefWindowProc(hwnd, iMessage, wParam, lParam); }
LRESULT CALLBACK 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; DEBUG_INFO *dbg; NM_TREEVIEW *nmt; VARINFO *var; HWND win; int level; int offset1; int doit; int i; CHARRANGE charrange; switch (iMessage) { 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 TABN_SELECTED: { LSTABNOTIFY *p = (LSTABNOTIFY *)h; ShowWindow(hwndTree[selected], SW_HIDE); for (i=0; i < 4; i++) if (p->lParam == (LPARAM)hwndTree[i]) selected = i; ShowWindow(hwndTree[selected], SW_SHOW); break; } case NM_RCLICK: { HMENU menu = LoadMenuGeneric(hInstance, "WATCHMENU"); HMENU popup = GetSubMenu(menu, 0); InsertBitmapsInMenu(popup); GetCursorPos(&menupos); TrackPopupMenuEx(popup, TPM_BOTTOMALIGN | TPM_LEFTBUTTON, menupos.x, menupos.y, hwndFrame, NULL); DestroyMenu(menu); SetFocus(hwndTree[selected]); } return 0; case TVN_ITEMEXPANDING: nmt = h; if (nmt->action) { ExpandPointer((VARINFO*)nmt->itemNew.lParam, nmt->action, selected); } return 0; case TCN_EDITQUERY: nmt = h; item.mask = TVIF_PARAM; item.hItem = (HTREEITEM)nmt->itemNew.hItem; TreeView_GetItem(hwndTree[selected], &item); var = (VARINFO*)item.lParam; if (var->editable) { WatchValue(watchinfo_list[selected][var->watchindex].dbg_info, 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[selected], &item); var = (VARINFO*)item.lParam; ChangeData(var, nmt->itemNew.pszText, selected); RefreshItems(selected); return 0; } break; case WM_CREATE: hwndWatch = hwnd; GetClientRect(hwnd, &r); valueBitmap = LoadImage(hInstance, "ID_VALUEBMP", IMAGE_BITMAP, 0, 0, LR_LOADMAP3DCOLORS); itemBitmap = LoadImage(hInstance, "ID_ITEMBMP", IMAGE_BITMAP, 0, 0, LR_LOADMAP3DCOLORS); tch.colText1 = "Item"; tch.colText2 = "Value"; tch.colBmp1 = itemBitmap; tch.colBmp2 = valueBitmap; hwndTabCtrl = CreateLsTabWindow(hwnd, TABS_BOTTOM | TABS_HOTTRACK | TABS_FLAT | WS_VISIBLE); tabNormalFont = CreateFontIndirect(&tabFontData); SendMessage(hwndTabCtrl, WM_SETFONT, (WPARAM)tabNormalFont, 0); r.bottom -= 25; for (i=3; i >0 ; i--) hwndTree[i] = CreateextTreeWindow(hwnd, WS_DLGFRAME | TCS_LINE, &r, &tch); hwndTree[0] = CreateextTreeWindow(hwnd, WS_DLGFRAME | TCS_LINE | WS_VISIBLE, &r, &tch); for (i=3; i >=0 ; i--) SendMessage(hwndTabCtrl, TABM_ADD, (WPARAM)nameTags[i], (LPARAM)hwndTree[i]); return 0; case WM_ADDWATCHINDIRECT: win = (HWND)wParam; doit = FALSE; SendMessage(win, EM_EXGETSEL, (WPARAM)0, (LPARAM) &charrange); if (charrange.cpMin == charrange.cpMax) { doit = SendMessage(win, WM_WORDUNDERPOINT, (WPARAM)&rightclickPos, (LPARAM)buf); if (!doit) { SendMessage(hwndFrame, IDM_ADDWATCH, 0, 0); break; } } else { if (charrange.cpMax - charrange.cpMin < sizeof(buf)) { SendMessage(win, EM_GETSELTEXT, 0, (LPARAM)buf); doit = TRUE ; } } if (doit) { var = EvalExpr(&dbg, activeScope, (char*) buf, TRUE); if (var) { AddItem(dbg, var, activeScope->address, selected); dmgrHideWindow(DID_WATCHWND, FALSE); break ; } } ExtendedMessageBox("Error", MB_SETFOREGROUND | MB_SYSTEMMODAL, "Symbol does not exist in this scope"); break; case WM_ADDWATCH: offset = wParam; if (!offset) { DeleteAllItems(selected); } else { var = EvalExpr(&dbg, activeScope, (char*) lParam, TRUE); if (var) { AddItem(dbg, var, activeScope->address, selected); dmgrHideWindow(DID_WATCHWND, FALSE); } } break; case WM_COMMAND: switch (wParam) { case ID_SETADDRESS: for (i=3; i >=0; i--) RefreshItems(i); InvalidateRect(hwndTree[selected], 0, 0); break; case IDM_DELETEWATCH: DeleteItem(&menupos, selected); break; case IDM_DELETEALLWATCH: DeleteAllItems(selected); break; } break; case WM_DESTROY: for (i=3; i >=0 ; i--) TreeView_DeleteAllItems(hwndTree[i]); for (i=3; i >=0 ; i--) DestroyWindow(hwndTree[i]); DeleteObject(valueBitmap); DeleteObject(itemBitmap); hwndWatch = 0; break; case WM_SIZE: r.left = 0; r.right = LOWORD(lParam); r.top = 0; r.bottom = HIWORD(lParam); MoveWindow(hwndTabCtrl, r.left, r.bottom - 24, r.right - r.left, 24, 1); for (i=3; i >=0 ; i--) MoveWindow(hwndTree[i], r.left, r.top, r.right - r.left, r.bottom - r.top - 25, 0); return 0; case WM_CLOSE: break; case WM_ACTIVATEME: SendMessage(GetParent(hwnd), WM_ACTIVATEME, 0, 0); break; } return DefWindowProc(hwnd, iMessage, wParam, lParam); }
LRESULT CALLBACK RegisterProc(HWND hwnd, UINT iMessage, WPARAM wParam, LPARAM lParam) { static int charwidth; HDC dc; TEXTMETRIC metric; DEBUG_EVENT *xc; LOGBRUSH brushstr; RECT r; int i; NM_TREEVIEW *nmt; switch (iMessage) { case WM_NOTIFY: nmt = (NM_TREEVIEW*)lParam; switch (nmt->hdr.code) { case TCN_EDITQUERY: if (uState != atBreakpoint) return 0; for (i = 0; i < sizeof(regs) / sizeof(REGDATA); i++) if (regs[i].hTreeItem == nmt->itemNew.hItem) if (regs[i].flags &editable) return (LRESULT)regs[i].ptrs.col2Text; return 0; case TCN_EDITDONE: for (i = 0; i < sizeof(regs) / sizeof(REGDATA); i++) if (regs[i].hTreeItem == nmt->itemNew.hItem) { char *buf = (char*)nmt->itemNew.pszText; if (regs[i].flags &floating) { float val; BYTE *pos = regs[i].currentdataptr; sscanf(buf, "%f", &val); *(long double*)pos = val; sprintf(regs[i].ptrs.col2Text, "%f", (double)val); } else { if (buf[0] == '0' && buf[1] == 'x') sscanf(buf + 2, "%x", (int *)regs[i].currentdataptr); else if ((buf[strlen(buf) - 1] &0xDF) == 'H') sscanf(buf, "%x", (int *)regs[i].currentdataptr); else sscanf(buf, "%d", (int *)regs[i].currentdataptr); sprintf(regs[i].ptrs.col2Text, "0x%08x", *(int *)regs[i].currentdataptr); } regs[i].ptrs.col2Color = 0xff; } return 0; } break; case WM_SYSCOMMAND: if (wParam == SC_CLOSE) SendMessage(hwnd, WM_CLOSE, 0, 0); break; case WM_LBUTTONDOWN: break; case WM_COMMAND: switch (LOWORD(wParam)) { case ID_SETCONTEXT: SaveRegisterContext(); break; case ID_SETADDRESS: regContext = activeThread->regs; registerHandle = (HANDLE)lParam; if (lParam) { int i; for (i = 0; i < sizeof(regs) / sizeof(REGDATA); i++) if (regs[i].currentdataptr) { if (regs[i].flags &floating) { double val; BYTE *pos = regs[i].currentdataptr; val = *(long double*)pos; sprintf(regs[i].ptrs.col2Text, "%f", val); if (!memcmp(regs[i].currentdataptr, regs[i].olddataptr, sizeof(long double))) regs[i].ptrs.col2Color = 0; else regs[i].ptrs.col2Color = 0xff; } else { sprintf(regs[i].ptrs.col2Text, "0x%08x", *(int *)regs[i].currentdataptr); if (*(int *)regs[i].currentdataptr == *(int *)regs[i].olddataptr) regs[i].ptrs.col2Color = 0; else regs[i].ptrs.col2Color = 0xff; } } if (!drawn) { HTREEITEM after1 = 0, after2 = 0; for (i = 0; i < sizeof(regs) / sizeof(REGDATA); i++) { TV_INSERTSTRUCT t; memset(&t, 0, sizeof(t)); t.hParent = regs[i].currentdataptr ? after1 : 0; t.hInsertAfter = regs[i].currentdataptr ? after2 : after1; t.UNNAMED_UNION item.mask = 0; t.UNNAMED_UNION item.hItem = 0; t.UNNAMED_UNION item.lParam = (int) ®s[i].ptrs; regs[i].hTreeItem = TreeView_InsertItem(hwndTree, &t); if (!regs[i].currentdataptr) { TreeView_Expand(hwndTree, after1, TVE_EXPAND); after1 = regs[i].hTreeItem; after2 = 0; } else after2 = regs[i].hTreeItem; } TreeView_Expand(hwndTree, after1, TVE_EXPAND); drawn = TRUE; } } else if (!lParam && drawn) { TreeView_DeleteAllItems(hwndTree); drawn = FALSE; } InvalidateRect(hwndTree, 0, 0); break; default: break; } break; case WM_ACTIVATEME: SendMessage(GetParent(hwnd), WM_ACTIVATEME, 0, 0); break; case WM_KILLFOCUS: break; case WM_CREATE: GetClientRect(hwnd, &r); // valueBitmap = LoadBitmap(hInstance, "ID_VALUEBMP") ; // itemBitmap = LoadBitmap(hInstance, "ID_ITEMBMP") ; tch.colBmp1 = itemBitmap; tch.colBmp2 = valueBitmap; hwndTree = CreateextTreeWindow(hwnd, TCS_LINE | WS_VISIBLE, &r, &tch); ApplyDialogFont(hwndTree); break; case WM_CLOSE: break; case WM_DESTROY: DestroyWindow(hwndTree); // DeleteObject(itemBitmap) ; // DeleteObject(valueBitmap) ; hwndRegister = 0; registerHandle = 0; break; case WM_SIZE: r.left = r.top = 0; r.right = LOWORD(lParam); r.bottom = HIWORD(lParam); MoveWindow(hwndTree, r.left, r.top, r.right - r.left, r.bottom - r.top, 0); break; case WM_INITMENUPOPUP: break; default: break; } return DefWindowProc(hwnd, iMessage, wParam, lParam); }