📄 asmwnd.c
字号:
CreateCaret(hwnd, 0, 2, 16);
SetCaretPos(caretX, caretY);
ShowCaret(hwnd);
break;
case WM_KILLFOCUS:
DestroyCaret();
break;
case WM_RBUTTONDOWN:
case WM_LBUTTONDOWN:
caretX = LOWORD(lParam);
caretY = HIWORD(lParam);
if (LOWORD(lParam) >= ASM_OFFSET + 5)
{
caretY &= ~15;
caretX -= ASM_OFFSET + 5;
caretX /= charwidth;
caretX *= charwidth;
caretX += ASM_OFFSET + 5;
SetCaretPos(caretX, caretY);
}
SetFocus(hwnd);
break;
case WM_KEYDOWN:
switch (wParam)
{
case VK_UP:
SendMessage(hwnd, WM_VSCROLL, SB_LINEUP, 0);
break;
case VK_DOWN:
SendMessage(hwnd, WM_VSCROLL, SB_LINEDOWN, 0);
break;
case VK_PRIOR:
SendMessage(hwnd, WM_VSCROLL, SB_PAGEUP, 0);
break;
case VK_NEXT:
SendMessage(hwnd, WM_VSCROLL, SB_PAGEDOWN, 0);
break;
case VK_HOME:
SendMessage(hwnd, WM_VSCROLL, SB_TOP, 0);
break;
case VK_END:
SendMessage(hwnd, WM_VSCROLL, SB_BOTTOM, 0);
break;
}
break;
case WM_VSCROLL:
GetClientRect(hwnd, &r);
xlines = r.bottom / 16;
switch (LOWORD(wParam))
{
case SB_BOTTOM:
case SB_TOP:
asmAddress = asmIP;
CalculateDisassembly(0);
break;
case SB_ENDSCROLL:
return 0;
case SB_LINEDOWN:
CalculateDisassembly(1);
break;
case SB_LINEUP:
CalculateDisassembly( - 1);
break;
case SB_PAGEDOWN:
CalculateDisassembly(xlines - 1);
break;
case SB_PAGEUP:
CalculateDisassembly(1-xlines);
break;
case SB_THUMBPOSITION:
offset = 0;
break;
case SB_THUMBTRACK:
xlines = (HIWORD(wParam) - 32000) / 320;
if (xlines - offset)
CalculateDisassembly(xlines - offset);
offset = xlines;
InvalidateRect(hwnd, 0, 1);
return 0;
// return DefMDIChildProc(hwnd,iMessage,wParam,lParam) ;
}
InvalidateRect(hwnd, 0, 1);
SetScrollPos(hwnd, SB_VERT, 32000, TRUE);
return 0;
}
return DefMDIChildProc(hwnd, iMessage, wParam, lParam);
}
//-------------------------------------------------------------------------
LRESULT CALLBACK _export gotoProc2(HWND hwnd, UINT iMessage, WPARAM wParam,
LPARAM lParam)
{
char buf[256];
int i;
VARINFO *info;
char *types, *syms;
int offset = StoppedThread->regs.Eip;
DEBUG_INFO *dbg;
switch (iMessage)
{
case WM_COMMAND:
if (wParam == IDOK)
{
GetEditField(hwnd, IDC_GOTO, buf);
info = EvalExpr(&types, &syms, &dbg, offset, &offset, buf);
if (info)
{
if (info->constant)
i = info->ival;
else
i = info->address;
FreeVarInfo(info);
}
else
i = 0xffffffff;
EndDialog(hwnd, i);
break;
}
if (HIWORD(wParam) == EN_CHANGE)
{
DisableControl(hwnd, IDOK, !GetWindowText((HWND)lParam, buf, 2))
;
break;
}
if (wParam != IDCANCEL)
break;
case WM_CLOSE:
EndDialog(hwnd, 0xffffffff);
break;
case WM_INITDIALOG:
CenterWindow(hwnd);
SetEditField(hwnd, IDC_GOTO, "");
DisableControl(hwnd, IDOK, 1);
break;
}
return 0;
}
//-------------------------------------------------------------------------
LRESULT CALLBACK _export ASMProc(HWND hwnd, UINT iMessage, WPARAM wParam,
LPARAM lParam)
{
RECT r;
int i;
HDC dc;
TEXTMETRIC metric;
DEBUG_EVENT *xc;
HFONT oldFont;
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(hwndBlank);
}
return TRUE;
case WM_SYSCOMMAND:
if (wParam == SC_CLOSE)
SendMessage(hwnd, WM_CLOSE, 0, 0);
break;
case WM_SETFOCUS:
SetFocus(hwndBlank);
break;
case WM_COMMAND:
switch (LOWORD(wParam))
{
case IDM_GOTO:
asmAddress = DialogBox(hInstance, "GOTODIALOG2", hwnd, (DLGPROC)
gotoProc2);
if (asmAddress != 0xffffffff)
{
CalculateDisassembly(0);
InvalidateRect(hwndBlank, 0, 1);
}
break;
case ID_SETADDRESS:
xc = (DEBUG_EVENT*)lParam;
asmAddress = asmIP = xc
->u.Exception.ExceptionRecord.ExceptionAddress;
threadID = xc->dwThreadId;
CalculateDisassembly(0);
InvalidateRect(hwndBlank, 0, 1);
break;
default:
return DefMDIChildProc(hwnd, iMessage, wParam, lParam);
}
break;
case WM_GETCURSORADDRESS:
if (shownLine + caretY / 16 >= 4096)
return 0;
sscanf(lines[shownLine + caretY / 16], "%x", &i);
return i;
case WM_CREATE:
lines = (char **)malloc(LINES *sizeof(char*));
if (!lines)
return - 1;
addrs = (int*)malloc(LINES *sizeof(int));
if (!addrs)
return - 1;
for (i = 0; i < LINES; i++)
if (!(lines[i] = (char*)malloc(LINELEN)))
return - 1;
caretY = 0;
caretX = ASM_OFFSET + 5;
hwndASM = hwnd;
asmFont = CreateFontIndirect(&fontdata);
dc = GetDC(hwnd);
oldFont = SelectObject(dc, asmFont);
GetTextMetrics(dc, &metric);
SelectObject(dc, oldFont);
ReleaseDC(hwnd, dc);
charwidth = metric.tmMaxCharWidth;
GetClientRect(hwnd, &r);
hwndCtrl = CreateControlWindow(DID_ASMWND, hwnd, &r, (int)(
(LPMDICREATESTRUCT)(*(int*)lParam))->lParam, szASMTitle);
SendMessage(hwndCtrl, LCF_ADJUSTRECT, 0, (LPARAM) &r);
hwndBlank = CreateWindow(szASMBlankClassName, 0, WS_CHILD +
WS_VSCROLL + WS_CLIPSIBLINGS + WS_BORDER + WS_VISIBLE, r.left,
r.top, r.right - r.left, r.bottom - r.top, hwndCtrl, 0,
hInstance, 0);
break;
case WM_CLOSE:
dmgrHideWindow(DID_ASMWND, TRUE);
return 0;
break;
case WM_DESTROY:
dmgrRemoveClient((CCW_params*)GetWindowLong(hwndCtrl, 0));
DestroyWindow(hwndBlank);
hwndASM = 0;
DeleteObject(asmFont);
for (i = 0; i < LINES; i++)
free(lines[i]);
free(lines);
free(addrs);
break;
case WM_SIZE:
r.left = r.top = 0;
r.right = LOWORD(lParam);
r.bottom = HIWORD(lParam);
MoveWindow(hwndCtrl, 0, 0, r.right, r.bottom, TRUE);
SendMessage(hwndCtrl, LCF_ADJUSTRECT, 0, (LPARAM) &r);
MoveWindow(hwndBlank, r.left, r.top, r.right - r.left, r.bottom -
r.top, TRUE);
break;
default:
break;
}
return DefMDIChildProc(hwnd, iMessage, wParam, lParam);
}
//-------------------------------------------------------------------------
void RegisterASMWindow(void)
{
WNDCLASS wc;
LOGBRUSH brushstr;
memset(&wc, 0, sizeof(wc));
wc.style = 0;
wc.lpfnWndProc = &ASMProc;
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 = szASMClassName;
RegisterClass(&wc);
wc.lpfnWndProc = &ASMBlankProc;
wc.lpszClassName = szASMBlankClassName;
RegisterClass(&wc);
pcBitmap = LoadBitmap(hInstance, "ID_PCBMP");
stopBitmap = LoadBitmap(hInstance, "ID_STOPBMP");
ChangeBitmapColor(pcBitmap, 0xffffff, GetSysColor(COLOR_3DFACE));
ChangeBitmapColor(stopBitmap, 0, GetSysColor(COLOR_3DFACE));
brushstr.lbStyle = BS_PATTERN;
brushstr.lbHatch = (int)pcBitmap;
pcBrush = CreateBrushIndirect(&brushstr);
brushstr.lbHatch = (int)stopBitmap;
stopBrush = CreateBrushIndirect(&brushstr);
}
//-------------------------------------------------------------------------
HWND CreateASMWindow(void)
{
MDICREATESTRUCT mc;
HWND rv;
if (hwndASM)
{
SendMessage(hwndASM, WM_SETFOCUS, 0, 0);
return hwndASM;
}
mc.szClass = szASMClassName;
mc.szTitle = szASMTitle;
mc.hOwner = hInstance;
mc.x = childxpos;
mc.y = childypos;
mc.cx = 500;
mc.cy = 200;
mc.style = WS_CHILD | WS_CLIPSIBLINGS | WS_DLGFRAME | WS_CLIPCHILDREN;
mc.lParam = (LPARAM)0;
rv = (HWND)SendMessage(hwndClient, WM_MDICREATE, 0, (LPARAM) &mc);
childxpos += 20;
childypos += 20;
if (childxpos > 120)
childxpos = childypos = 0;
return rv;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -