180112 逆向-Windows消息机制(定时计时器消息)

1625-5 王子昂 总结《2018年1月12日》 【连续第469天总结】
A. Windows消息系统-定时计数器消息
B.

概述

通过SetTimer函数为应用程序分配一个计时器
SetTimer函数有一个时间间隔范围为1~4294967295ms(约50天)的整型数参数作为Windows给应用程序发送一个WM_TIMER消息的间隔时间
消息的wParam中包含定时器的序号和ID(序号通过SetTimer调用时指定)

时间单位及误差

注:虽然定时计数器设置的时间间隔单位为毫秒,但精度并没有达到毫秒级。这与硬件结构有关。
计数器的时钟来自于BIOS,而BIOS每54.915ms中断一次。即最小单位为54.195ms。
Windows总是将用户设置的毫秒数整除51.195,以商作为真正的间隔。

另外,投放的WM_TIMER消息会被放在消息队列中,等待窗口过程函数来处理。而窗口过程函数是线性的,依次处理队列中的消息。
所以不是说计时器一到点,投递的消息就会被立刻处理。
以及队列中的多个WM_TIMER消息会被合并成一个。

原理

当SetTimer的时候会为每个定时计数器设置时间单位,即毫秒数整除51.195
Windows中维护着中断服务程序,每次硬件中断(即54.915ms)时中断服务程序会将每个定时计数器的时间单位-1。
如果有定时计数器的时间单位为零,则投放消息或执行回调函数,然后再次恢复时间单位。

实践发现时间单位的整除是进一法,即不足51.195ms的多余部分补为一个时间单位

回调函数和消息投递

SetTimer的第四个参数lpTimerFunc为设置回调函数
如果未设置则进行WM_TIMER的投递,等待窗口过程函数来处理消息
设置了则直接执行回调函数

回调函数的原型与窗口过程函数一样

因此理论上来说,设置回调函数的实时性要比投递WM_TIMER消息的实时性高

C. 明日计划
考试看书复习

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值