Flash加速功能实现
实现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加速功能实现相关推荐
- 怎样解决部分网站网页中IE9无法播放flash视频的问题--硬件加速功能存在冲突
这个问题困扰了好久! 必须记录一下! 如果flash插件已经是最新版本,加载项显示"已启用"仍无法播放视频,这个问题可能是因为电脑里的显卡驱动与IE9硬件加速功能存在冲突,打开IE ...
- 启动延时缩短 50%-80%,函数计算发布镜像加速功能
作者 | Shuai Chang 阿里云云原生 Serverless 团队高级技术专家 来源 | 阿里巴巴云原生公众号 体验文档:镜像拉取加速文档 FaaS 和容器 容器镜像因其颠覆式创新成为云原生 ...
- Mellanox CX-5网卡支持OVS流表加速功能的调研
女主宣言 本文主要对Mellanox CX-5网卡支持OVS流表加速功能进行了调研,简单介绍了配套软件的版本要求,并描述了整体测试的步骤,另外对其支持VF热迁移也进行了初步的调研,希望对有相同需求的同 ...
- 浅谈一键内存加速功能是如何实现的
前段时间笔者仿写一个简易版的电脑管家,对于其中的绝大部分功能,如垃圾清理.进程管理.软件卸载.启动项.云查杀等功能或多或少能猜测到一些,但惟独对其中的一键内存加速功能不得要领,无奈,只能试着逆向电脑管 ...
- 实战:借助ucloud镜像加速功能下载镜像(亲测成功)-2022.1.1
实战:借助ucloud镜像加速功能下载镜像(亲测成功)-2022.1.1 目录 文章目录 实战:借助ucloud镜像加速功能下载镜像(亲测成功)-2022.1.1 目录 实验环境 实验软件 1.背景 ...
- 360网站卫士php-dos,360网站卫士的CDN缓存加速功能详解
之前写过好几篇和360网站卫士相关的博文,也提到过完全开启360网站卫士后,速度可以快到飞.今天就来详细介绍下,如何完全开启360网站卫士的缓存功能,及每一项缓存代表的意义. 在介绍之前,张戈先来段关 ...
- Adobe Flash Player / 功能
Adobe Flash Player / 功能
- 华为A1路由器设置虚拟服务器,华为a1路由器wifi定时加速功能的详细操作设置方法...
华为a1路由器怎么设置wifi定时加速功能呀. 很多新手不知道这款华为a1路由器不仅可以设置wifi限速,还能在"华为智能家居"APP上下载应用设置wifi按时加速,下面能哈小编将 ...
- 计算机硬件加速怎么开,怎么开启显卡硬件加速?开启显卡硬件的加速功能步骤...
在我们的电脑中,显卡已经有一定的效能水准,但当我们在开启玩游戏画面或是影音文件时仍然不是很流畅很清晰,这是为什么呢?这就要问你:你使用了显卡硬件的加速功能没有?如果没有使用,那你的显卡就还没有完全发挥 ...
- 百度云原生产品 6 月刊 | CCE 节点组支持配置多个备选机型、CCR 新增镜像加速功能
百度智能云容器引擎 CCE 节点组支持配置多个备选机型(可指定不同可用区下规格相同的机型),降低计算资源售罄导致扩容失败的风险 CCE 集群提供接入云服务器 BCC 潮汐算力的 API 接口 创建 B ...
最新文章
- 初次尝试HTML,用记事本编写代码并以html格式保存后用Google浏览器打开
- maven2——设置镜像篇
- 使用混合多云每个人都应避免的3个陷阱(第3部分)
- 阿里云 linux mysql数据库_Linux Mysql数据库安全配置
- 【清北学堂】广州OI学习游记
- linux内存管理之malloc
- Linux非root用户部署jdk等命令
- 关于SQLyog创建的数据库不显示的问题
- 一入前端深似海,从此红尘是路人系列第四弹之未来前端路该何去何从
- javaee实训报告总结_javaee实训总结
- vlc搭建流媒体转发服务器
- 免费Web托管公司000Webhost被黑 1350万明文密码泄露
- iOS 第三方登录之 微信登录
- Linux下手动查杀木马
- incsgo 可直接立刻取回皮肤的CSGO饰品皮肤开箱网站
- Power BI 数据导入(SQL Server、MySQL、网页数据)
- 问题 B: 不同出栈情况(栈和队列)
- SQLMAP-Tamper之较为通用的双写绕过
- 加班奖金终于发下来了!3060显卡自费包邮送!
- python下载所有股票日交易数据
热门文章
- 总在说思科华为认证 可你真的清楚它们的区别吗?
- julia安装源_Ubuntu下安装Julia
- 说课稿模板计算机,计算机系统的组成说课稿1模板.doc
- android xml属性,android中解析XML androidxml属性大全
- CSR8610 入门操作(BlueSuite 2.6.2和CSRXX_ROM_ConfigTool_3.0.64使用)
- 目标检测综述学习笔记
- 前端研习录(02)——CSS内联样式、内部样式及外部样式
- 阿里云Maven镜像
- 字节跳动A/B实验背后的秘密:样本量计算
- HTTP请求过程——Chrome浏览器Network详解