⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 watchwnd.c

📁 CC386 is a general-purpose 32-bit C compiler. It is not an optimizing compiler but given that the co
💻 C
📖 第 1 页 / 共 3 页
字号:
                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 + -