首页
社区
课程
招聘
[原创]浅谈汇编中返回值问题
发表于: 2015-1-4 12:22 4995

[原创]浅谈汇编中返回值问题

2015-1-4 12:22
4995
本人菜鸟一个,这个是这几天玩汇编,发现的一个小问题,就记录下来与大家分享,高手直接跳过吧没啥技术含量。
首先按说一下主要内容吧,熟悉C的朋友应该经常用类似这样的代码吧
  case WM_CTLCOLORDLG:
    GetClientRect(hDlg, &rcDialog);
    //通过SetStretchBltMode的设置能使StretchBlt在缩放图像更加清晰
    SetStretchBltMode((HDC)wParam, COLORONCOLOR);
    StretchBlt((HDC)wParam, 0, 0, rcDialog.right, rcDialog.bottom, s_hdcMem, 0, 0, s_bm.bmWidth, s_bm.bmHeight, SRCCOPY);  
    return (BOOL)((HBRUSH)GetStockObject(NULL_BRUSH));

但是在asm中我们应该怎么写同样的代码呢,,关键是最后一行
return (BOOL)((HBRUSH)GetStockObject(NULL_BRUSH))

然而在msdn介绍WM_CTLCOLCORDLG消息是这么说的
WM_CTLCOLORDLG message
Sent to a dialog box before the system draws the dialog box. By responding to this message, the dialog box can set its text and background colors using the specified display device context handle.

C++Copy

#define WM_CTLCOLORDLG 0x0136

Parameters
wParam
A handle to the device context for the dialog box.

lParam
A handle to the dialog box.

Return value
If an application processes this message, it must return a handle to a brush. The system uses the brush to paint the background of the dialog box.

返回值需要一个画刷句柄,但是在vc中却要把它转为bool型,我用的是vc6,不知道高版本怎么样,如果不加(BOOL) 就编译出错,在汇编中可以编译通过但是不注意返回值也会出现一些莫名其妙的问题
比如我刚开始写的代码
 .elseif eax==WM_CTLCOLORDLG
    invoke  RtlZeroMemory,addr rect,sizeof rect
    invoke GetClientRect,hWin,addr rect
    invoke SetStretchBltMode,wParam,COLORONCOLOR
    invoke StretchBlt,wParam,0,0,rect.right,rect.bottom,hdcSrc,0,0,sbmp.bmWidth,sbmp.bmHeight,SRCCOPY
    invoke GetStockObject,NULL_BRUSH

看起来应该是没啥问题的,但是就是不正常显示,这几天又仔细看了一下原来用Radasm它的模板自动生成的代码
DlgProc	proc	hWin:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM
	mov	eax,uMsg
	.if	eax==WM_INITDIALOG
		;initialization here
	.elseif	eax==WM_COMMAND
		mov edx,wParam
		movzx eax,dx
		shr edx,16
		.if edx==BN_CLICKED
			.if eax==IDOK

			.elseif eax==IDCANCEL
				invoke	SendMessage,hWin,WM_CLOSE,NULL,NULL
			.endif
		.endif
	.elseif	eax==WM_CLOSE
		invoke	EndDialog,hWin,0
	.else
		mov	eax,FALSE
		ret
	.endif
	mov	eax,TRUE ;注意此行已经设置了默认所有消息返回值为真
	ret
DlgProc endp

所以我们在需要特殊返回值的时候在对应的消息最后加上ret,这样不执行设置的默认返回值代码就好了再附上我最终修改版本代码

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

上传的附件:
收藏
免费 3
支持
分享
最新回复 (1)
雪    币: 188
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
前排支持一个
2015-1-4 18:00
0
游客
登录 | 注册 方可回帖
返回
//