首页
社区
课程
招聘
[求助]关于wsprint的参数还是搞不懂·请教高手
发表于: 2009-1-19 15:43 4196

[求助]关于wsprint的参数还是搞不懂·请教高手

2009-1-19 15:43
4196
wsprint 的解释
Win32 API中一个很常用的函数wsprintf,这是一个字符串格式化函数,可以将数值按指定格式转换成字符串

这个数值到底是什么呢?肯定不是地址 是一个数据
那这个数据应该是多长呢?
我做了一个试验
szTest                db        '参数: [%08x]',0
szNum                dw        0d0ah
dwTemp                   db   256 dup (?)

invoke        wsprintf,addr dwTemp,addr sztest,szNum
invoke        MessageBox,NULL,addr dwTemp,NULL,MB_OK

运行以后 对话框提示
参数: [00000d0a]

似乎没错 接着我再重新定义一次

sztest                        db        '参数: [%08x]',0
szNum                        db        0ah,0dh
dwTemp                   db   256 dup (?)

invoke        wsprintf,addr dwTemp,addr sztest,szNum
invoke        MessageBox,NULL,addr dwTemp,NULL,MB_OK
运行以后 结果对话框提示
参数: [0000000a]

szNum                dw        0d0ah 和
szNum                db        0ah,0dh

我看了编译以后的数据 都是一样的啊?

为什么两次执行的结果却不一样?

写到一般,突然想到或许是 编译是编译器翻译的。我现在跟踪下看看 执行到这里到底是怎么翻译的

高手也可以解答下  这个数值的长度到底有什么样子的标准?
如果数字都是0的情况的下会怎么样?

最近 研究WIN32汇编 的HOOK
截取消息的时候 用这个函数格式化 MSG里的lParam的数值
有时候 格式化是8个0 有时候 8个0后面又会跟些莫名其妙的数据  
到现在一直搞不懂是为什么

比如

szFormat        db        0dh,0ah
                db        '消息类型:%s'
                db        'nWnd:%08x'
                db        'wParam:%08x'
                db        'lParam:%08x',0

_dwCode==HC_ACTION  
mov edx,_lParam
assume edx:ptr MSG

invoke        wsprintf,addr @szBuffer,addr szFormat,eax,[edx].hwnd,[edx].wParam,[edx].lParam

invoke        SendMessage,hWnd,WM_HOOK,0,addr @szBuffer

收到消息以后写到 文件里  有时候总是会出现乱七八糟的数据  到现在也搞不懂为什么

比如会写入类似

消息类型:WM_PAINT                 nWnd:00cf05f0wParam:00000000lParam:00000000             

这样的数据

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 2110
活跃值: (21)
能力值: (RANK:260 )
在线值:
发帖
回帖
粉丝
2
关于上db 0ah,0dh和dw 0d0ah的问题,我想提醒你,虽然汇编后这两处的数据一样,但不保证invoke宏展开后的代码也一样啊!

比如,很有可能它把最右边的参数展开成为

movzx eax, szNum
push  eax


在这种情况下,db 和 dw当然就不一样了。

关于格式化消息记录的问题,你试着在格式化字符串后加一个CRLF试试。后面的乱码很可以是跟下一次的输入信息搞混了。
2009-1-19 17:10
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
3
第一个问题的原因是虽然你所定义的数据内容是一样的,但你定义的变量数据类型却是不一样的。编译器是按你所定义的数据类型作为判断使用的。你定义db字节就取db字节,定义dw字节就取dw字节,并不是以内存数据作判断使用的。
第二个问题应该是你的@szBuffer缓冲区数据没有清零初始化所引起的。你要每次使用这个变量缓冲区时用RtlZeroMemory函数对@szBuffer作清零初始化。
2009-1-19 20:03
0
雪    币: 71
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
万分感谢斑猪
2009-1-20 07:40
0
游客
登录 | 注册 方可回帖
返回
//