Hook Win32 API 的应用研究之三:变速控制

 
          这是Hook Win32 API的一个比较另类和有趣的应用方面。
 
         
      这里所指的变速控制,并不是说可以改变任何程序的运行速度,只能改变符合这些条件的程序的运行速度:程序的运行速度依赖于定时控制,也就是说,程序的执行单元执行的频率是人为的依靠定时机制控制的,不是依赖于CPU的快慢。比如说,某个程序每隔1秒钟发出 滴答 声,它在快的电脑上和慢的电脑上所表现出来的行为是一致的。这样的依赖于定时控制的程序才是我们的研究 变速 对象。
 
         
      一个WINDOWS应用程序的定时机制有很多。像上面提到的例子程序可以采用WM_TIMER消息来实现,通过函数SetTimer()可以设定产生WM_TIMER消息的时间间隔。其它的方法还有通过GetTickCount()和timeGetTime()等函数得到系统时间,然后通过比较时间间隔来定时,还有timerSetEvent()设置时钟事件等等方式。先来看看这些函数的定义:
 
      UINT_PTR SetTimer(
        HWND      hWnd, // 接收WM_TIMER消息的窗口句柄
        UINT_PTR nIDEvent, // 定时器的ID号
        UINT      uElapse, // 发生WM_TIMER消息的时间间隔
        TIMERPROC lpTimerProc // 处理定时发生时的回调函数入口地址
      );
 
      MMRESULT timeSetEvent(
        UINT               uDelay, // 时钟事件发生的时间间隔
        UINT               uResolution, // 设置时钟事件的分辨率
        LPTIMERCALLBACK    lpTimerProc, // 处理时钟事件发生时的回调函数入口地址
        DWORD              dwUser, // 用户提供的回调数据
        UINT               fuEvent // 设置事件的类型
      );
 
      DWORD GetTickCount(VOID) // 返回系统启动以来经过了多少毫秒了
 
      DWORD timeGetTime(VOID) // 类似于GetTickCount(),但分辨率更高
 
         
      那么我们来看,如果能控制SetTimer()的uElapse参数、timeSetEvent()的uDelay参数、GetTickCount()和timeGetTime()的返回值,就能实现变速控制,除非应用程序使用的是其它的定时机制,不过大多数应用程序采用的定时机制不外乎都是这些。
 
         
      该轮到Hook大法出场了。因为我们一般只想改变某个程序的速度,比如是说某个游戏程序,所以我们不设置全局钩子。又因为我们不清楚那个应用程序到底使用的是那种定时机制,所以上述几个函数我们全部都要接管,然后把关于定时参数或返回值按比例缩放就可以了。
  
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值