鱼C论坛

 找回密码
 立即注册
查看: 2887|回复: 4

[争议讨论] wsprintf 函数在WIN32 汇编中出现BUG

[复制链接]
发表于 2014-6-22 12:08:40 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 风中醉柳 于 2014-6-22 12:11 编辑

不知道是不是BUG ,不过确实存在问题........

wsprintf -语法  int wsprintf(
  LPTSTRlpOut, // 输出缓冲区,最大为1024字节
  LPCTSTRlpFmt, // 格式字符串
  ...) // 需输出的参数;
  ;多少个参数都可以的

自己写了个获取本地时间并显示的小程序,发现问题, 其参数有一个的话正常打印,有两个及以上就出现了问题。
申明:我定义的SYSTEMTIME 这个结构里面的时间都是对的,我将月份放在第一个参数能正常打印,其他的放进去也一样!

1.跟两个参数,第一个能正常打印,第二个乱码显示,程序不崩溃

2.跟三个参数,第一个能正常打印,第二个乱码显示,第三个乱码显示,程序崩溃

跟两个参数

QQ截图20140622120858.png

跟三个参数


QQ截图20140622120915.png


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-6-22 15:44:31 | 显示全部楼层
看看   顺便顶LZ
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-6-22 21:36:02 | 显示全部楼层
应该是invoke指令的问题,我反汇编了一下
00401000 <>/$  68 00304000   PUSH 1.00403000                          ; /pLocaltime = 1.00403000
00401005   |.  E8 42000000   CALL <JMP.&kernel32.GetLocalTime>        ; \GetLocalTime
0040100A       6A 00         PUSH 0
0040100C   |.  66:FF35 02304>PUSH WORD PTR DS:[403002]
00401013       6A 00         PUSH 0
00401015   |.  66:FF35 00304>PUSH WORD PTR DS:[403000]                ; |<%d> = 0
0040101C   |.  68 10344000   PUSH 1.00403410                          ; |Format = "%x  %x"
00401021   |.  68 10304000   PUSH 1.00403010                          ; |s = 1.00403010
00401026   |.  E8 27000000   CALL <JMP.&user32.wsprintfA>             ; \wsprintfA

调用这个函数的时候多了push 0,我们解析一下,第一个变量是年份,输出的时候取值应该是四个字节。push 0是压入四个字节的,所以取低地址两个自己年份和push的两个字节组成的是0000+年份输出的结果是正确的年(因为高位写0结果不变例如0x01和0x1是一样的)。但是月份就有问题了。高位时月份低位时push的另外两个0,所以是 月份+0000,结果肯定不对啊(0x1和0x10000肯定不一样),所以才出现月份这么大的原因,以后调用参数可变的函数时(例如wsprintf),压入的参数最好是四个字节的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-6-22 21:37:32 | 显示全部楼层
要么把数据转换成四个字节当作参数,要么老老实实自己push call
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-6-25 12:26:48 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-24 15:14

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表