实现Flash加速原理是Hook住与时间相关的几个API函数,将API返回的实际时间值进行改写,来实现加速。

模板依赖于mhook库(https://github.com/SirAnthony/mhook)

#pragma onceclass SpeedMgr
{
public:static SpeedMgr& Instance();BOOL StartService();BOOL StopService();BOOL SetSpeed(float fRate);BOOL Restore();// Inner callDWORD WINAPI GetTickCount(VOID);BOOL  WINAPI QueryPerformanceFrequency(__out LARGE_INTEGER *lpFrequency);BOOL  WINAPI QueryPerformanceCounter(__out LARGE_INTEGER *lpPerformanceCount);VOID  WINAPI Sleep(__in DWORD dwMilliseconds);DWORD WINAPI timeGetTime(VOID);private:SpeedMgr(void);~SpeedMgr(void);private:// EnableBOOL   bSpeed_;// GetTickCountDWORD    gtcLastReal_;DWORD  gtcLastFake_;base::TLock gtc_lock_;// timeGetTimeDWORD  tgtLastReal_;DWORD  tgtLastFake_;base::TLock tgt_lock_;// QueryPerformanceCounterLONGLONG   qpcLastReal_;LONGLONG   qpcLastFake_;base::TLock qpc_lock_;// QueryPerformanceFrequencyLONGLONG qpfLastReal_;LONGLONG   qpfLastFake_;base::TLock qpf_lock_;// Speed Factorfloat speedFactor_;
};

cpp实现

#include "StdAfx.h"
#include "SpeedMgr.h"
#include "mhook.h"
#include <tchar.h>
#include <math.h>// kernel32.dll
typedef DWORD (WINAPI *pfn_GetTickCount)(VOID);
typedef BOOL  (WINAPI *pfn_QueryPerformanceFrequency)(__out LARGE_INTEGER *lpFrequency);
typedef BOOL  (WINAPI *pfn_QueryPerformanceCounter)(__out LARGE_INTEGER *lpPerformanceCount);
typedef VOID  (WINAPI *pfn_Sleep)(__in DWORD dwMilliseconds);
// winmm.dll
typedef DWORD (WINAPI *pfn_timeGetTime)(VOID);// Real Functions
namespace SpeedAid
{// kernel32.dllpfn_GetTickCount                Real_GetTickCount               = NULL;pfn_QueryPerformanceFrequency   Real_QueryPerformanceFrequency  = NULL;pfn_QueryPerformanceCounter     Real_QueryPerformanceCounter    = NULL;pfn_Sleep                       Real_Sleep                      = NULL;// winmm.dllpfn_timeGetTime                 Real_timeGetTime                = NULL;
}// Hook Functions
// kernel32.dll
DWORD WINAPI Hook_GetTickCount(VOID)
{return SpeedMgr::Instance().GetTickCount();
}BOOL WINAPI Hook_QueryPerformanceFrequency(__out LARGE_INTEGER *lpFrequency)
{return SpeedMgr::Instance().QueryPerformanceFrequency(lpFrequency);
}BOOL WINAPI Hook_QueryPerformanceCounter(__out LARGE_INTEGER *lpPerformanceCount)
{return SpeedMgr::Instance().QueryPerformanceCounter(lpPerformanceCount);
}VOID WINAPI Hook_Sleep(__in DWORD dwMilliseconds)
{return SpeedMgr::Instance().Sleep(dwMilliseconds);
}// winmm.dll
DWORD WINAPI Hook_timeGetTime(VOID)
{return SpeedMgr::Instance().timeGetTime();
}SpeedMgr::SpeedMgr(void): speedFactor_(1), bSpeed_(FALSE), gtcLastReal_(0), gtcLastFake_(0), tgtLastReal_(0), tgtLastFake_(0), qpcLastReal_(0), qpcLastFake_(0), qpfLastReal_(0), qpfLastFake_(0)
{HMODULE hMod                           = ::GetModuleHandle(_T("kernel32.dll"));SpeedAid::Real_GetTickCount              = (pfn_GetTickCount)               ::GetProcAddress(hMod,  "GetTickCount");SpeedAid::Real_QueryPerformanceFrequency= (pfn_QueryPerformanceFrequency)    ::GetProcAddress(hMod,  "QueryPerformanceFrequency");SpeedAid::Real_QueryPerformanceCounter   = (pfn_QueryPerformanceCounter)        ::GetProcAddress(hMod,  "QueryPerformanceCounter");SpeedAid::Real_Sleep                   = (pfn_Sleep)                      ::GetProcAddress(hMod,  "Sleep");hMod                                 = LoadLibrary(_T("winmm.dll"));SpeedAid::Real_timeGetTime                = (pfn_timeGetTime)                    ::GetProcAddress(hMod,  "timeGetTime");
}SpeedMgr::~SpeedMgr(void)
{StopService();
}SpeedMgr& SpeedMgr::Instance()
{static SpeedMgr instance;return instance;
}BOOL SpeedMgr::StartService()
{BOOL ret = TRUE;ret = Mhook_SetHook((PVOID*)&SpeedAid::Real_GetTickCount,                Hook_GetTickCount);ret = Mhook_SetHook((PVOID*)&SpeedAid::Real_QueryPerformanceFrequency,  Hook_QueryPerformanceFrequency);ret = Mhook_SetHook((PVOID*)&SpeedAid::Real_QueryPerformanceCounter,   Hook_QueryPerformanceCounter);ret = Mhook_SetHook((PVOID*)&SpeedAid::Real_Sleep,                       Hook_Sleep);ret = Mhook_SetHook((PVOID*)&SpeedAid::Real_timeGetTime,               Hook_timeGetTime);// 初始化值gtcLastReal_ = gtcLastFake_ = SpeedAid::Real_GetTickCount();tgtLastReal_ = tgtLastFake_ = SpeedAid::Real_timeGetTime();LARGE_INTEGER f;SpeedAid::Real_QueryPerformanceFrequency(&f);qpfLastReal_ = qpfLastFake_ = f.QuadPart;LARGE_INTEGER t;SpeedAid::Real_QueryPerformanceCounter(&t);qpcLastReal_ = qpcLastFake_ = t.QuadPart;return ret;
}BOOL SpeedMgr::StopService()
{BOOL ret = TRUE;ret = Mhook_Unhook ((PVOID*)&Hook_GetTickCount);ret = Mhook_Unhook ((PVOID*)&Hook_QueryPerformanceCounter);ret = Mhook_Unhook ((PVOID*)&Hook_QueryPerformanceFrequency);ret = Mhook_Unhook ((PVOID*)&Hook_Sleep);ret = Mhook_Unhook ((PVOID*)&Hook_timeGetTime);return ret;
}BOOL SpeedMgr::SetSpeed(float fRate)
{bSpeed_ = TRUE;speedFactor_ = fRate;return TRUE;
}BOOL SpeedMgr::Restore()
{bSpeed_ = FALSE;speedFactor_ = 1;return TRUE;
}// Inner call
DWORD WINAPI SpeedMgr::GetTickCount(VOID)
{DWORD ret = SpeedAid::Real_GetTickCount();DWORD nReal = ret;DWORD dReal = nReal - gtcLastReal_;DWORD dFake = speedFactor_ * dReal;gtcLastFake_ = gtcLastFake_ + dFake;gtcLastReal_ = nReal;return bSpeed_ ? gtcLastFake_ : gtcLastReal_;
}BOOL  WINAPI SpeedMgr::QueryPerformanceFrequency(__out LARGE_INTEGER *lpFrequency)
{BOOL ret = SpeedAid::Real_QueryPerformanceFrequency(lpFrequency);LONGLONG nReal = lpFrequency->QuadPart;LONGLONG dReal = nReal - qpfLastReal_;LONGLONG dFake = speedFactor_ * dReal;qpfLastFake_ = qpfLastFake_ + dFake;qpfLastReal_ = nReal;if (bSpeed_)lpFrequency->QuadPart = qpfLastFake_;return ret;
}BOOL  WINAPI SpeedMgr::QueryPerformanceCounter(__out LARGE_INTEGER *lpPerformanceCount)
{BOOL ret = SpeedAid::Real_QueryPerformanceCounter(lpPerformanceCount);LONGLONG nReal = lpPerformanceCount->QuadPart;LONGLONG dReal = nReal - qpcLastReal_;LONGLONG dFake = speedFactor_ * dReal;qpcLastFake_ = qpcLastFake_ + dFake;qpcLastReal_ = nReal;if (bSpeed_)lpPerformanceCount->QuadPart = qpcLastFake_;return ret;
}VOID  WINAPI SpeedMgr::Sleep(__in DWORD dwMilliseconds)
{if (bSpeed_){DWORD dwValue = dwMilliseconds;dwMilliseconds = static_cast<DWORD> (floor(dwValue / speedFactor_ + 0.5));DWORD dwMinValue = 1;if (dwMilliseconds < dwMinValue){if (dwValue < dwMinValue)dwMilliseconds = dwValue;elsedwMilliseconds = dwMinValue;}}return SpeedAid::Real_Sleep(dwMilliseconds);
}DWORD WINAPI SpeedMgr::timeGetTime(VOID)
{DWORD ret = SpeedAid::Real_timeGetTime();DWORD nReal = ret;DWORD dReal = nReal - tgtLastReal_;DWORD dFake = speedFactor_ * dReal;tgtLastFake_ = tgtLastFake_ + dFake;tgtLastReal_ = nReal;return bSpeed_ ? tgtLastFake_ : tgtLastReal_;
}

Flash加速功能实现相关推荐

  1. 怎样解决部分网站网页中IE9无法播放flash视频的问题--硬件加速功能存在冲突

    这个问题困扰了好久! 必须记录一下! 如果flash插件已经是最新版本,加载项显示"已启用"仍无法播放视频,这个问题可能是因为电脑里的显卡驱动与IE9硬件加速功能存在冲突,打开IE ...

  2. 启动延时缩短 50%-80%,函数计算发布镜像加速功能

    作者 | Shuai Chang  阿里云云原生 Serverless 团队高级技术专家 来源 | 阿里巴巴云原生公众号 体验文档:镜像拉取加速文档 FaaS 和容器 容器镜像因其颠覆式创新成为云原生 ...

  3. Mellanox CX-5网卡支持OVS流表加速功能的调研

    女主宣言 本文主要对Mellanox CX-5网卡支持OVS流表加速功能进行了调研,简单介绍了配套软件的版本要求,并描述了整体测试的步骤,另外对其支持VF热迁移也进行了初步的调研,希望对有相同需求的同 ...

  4. 浅谈一键内存加速功能是如何实现的

    前段时间笔者仿写一个简易版的电脑管家,对于其中的绝大部分功能,如垃圾清理.进程管理.软件卸载.启动项.云查杀等功能或多或少能猜测到一些,但惟独对其中的一键内存加速功能不得要领,无奈,只能试着逆向电脑管 ...

  5. 实战:借助ucloud镜像加速功能下载镜像(亲测成功)-2022.1.1

    实战:借助ucloud镜像加速功能下载镜像(亲测成功)-2022.1.1 目录 文章目录 实战:借助ucloud镜像加速功能下载镜像(亲测成功)-2022.1.1 目录 实验环境 实验软件 1.背景 ...

  6. 360网站卫士php-dos,360网站卫士的CDN缓存加速功能详解

    之前写过好几篇和360网站卫士相关的博文,也提到过完全开启360网站卫士后,速度可以快到飞.今天就来详细介绍下,如何完全开启360网站卫士的缓存功能,及每一项缓存代表的意义. 在介绍之前,张戈先来段关 ...

  7. Adobe Flash Player / 功能

    Adobe Flash Player / 功能

  8. 华为A1路由器设置虚拟服务器,华为a1路由器wifi定时加速功能的详细操作设置方法...

    华为a1路由器怎么设置wifi定时加速功能呀. 很多新手不知道这款华为a1路由器不仅可以设置wifi限速,还能在"华为智能家居"APP上下载应用设置wifi按时加速,下面能哈小编将 ...

  9. 计算机硬件加速怎么开,怎么开启显卡硬件加速?开启显卡硬件的加速功能步骤...

    在我们的电脑中,显卡已经有一定的效能水准,但当我们在开启玩游戏画面或是影音文件时仍然不是很流畅很清晰,这是为什么呢?这就要问你:你使用了显卡硬件的加速功能没有?如果没有使用,那你的显卡就还没有完全发挥 ...

  10. 百度云原生产品 6 月刊 | CCE 节点组支持配置多个备选机型、CCR 新增镜像加速功能

    百度智能云容器引擎 CCE 节点组支持配置多个备选机型(可指定不同可用区下规格相同的机型),降低计算资源售罄导致扩容失败的风险 CCE 集群提供接入云服务器 BCC 潮汐算力的 API 接口 创建 B ...

最新文章

  1. 初次尝试HTML,用记事本编写代码并以html格式保存后用Google浏览器打开
  2. maven2——设置镜像篇
  3. 使用混合多云每个人都应避免的3个陷阱(第3部分)
  4. 阿里云 linux mysql数据库_Linux Mysql数据库安全配置
  5. 【清北学堂】广州OI学习游记
  6. linux内存管理之malloc
  7. Linux非root用户部署jdk等命令
  8. 关于SQLyog创建的数据库不显示的问题
  9. 一入前端深似海,从此红尘是路人系列第四弹之未来前端路该何去何从
  10. javaee实训报告总结_javaee实训总结
  11. vlc搭建流媒体转发服务器
  12. 免费Web托管公司000Webhost被黑 1350万明文密码泄露
  13. iOS 第三方登录之 微信登录
  14. Linux下手动查杀木马
  15. incsgo 可直接立刻取回皮肤的CSGO饰品皮肤开箱网站
  16. Power BI 数据导入(SQL Server、MySQL、网页数据)
  17. 问题 B: 不同出栈情况(栈和队列)
  18. SQLMAP-Tamper之较为通用的双写绕过
  19. 加班奖金终于发下来了!3060显卡自费包邮送!
  20. python下载所有股票日交易数据

热门文章

  1. 总在说思科华为认证 可你真的清楚它们的区别吗?
  2. julia安装源_Ubuntu下安装Julia
  3. 说课稿模板计算机,计算机系统的组成说课稿1模板.doc
  4. android xml属性,android中解析XML androidxml属性大全
  5. CSR8610 入门操作(BlueSuite 2.6.2和CSRXX_ROM_ConfigTool_3.0.64使用)
  6. 目标检测综述学习笔记
  7. 前端研习录(02)——CSS内联样式、内部样式及外部样式
  8. 阿里云Maven镜像
  9. 字节跳动A/B实验背后的秘密:样本量计算
  10. HTTP请求过程——Chrome浏览器Network详解