实现Flash加速原理是Hook住与时间相关的几个API函数,将API返回的实际时间值进行改写,来实现加速。
模板依赖于mhook库(https://github.com/SirAnthony/mhook)
#pragma once
class SpeedMgr
{
public:
static SpeedMgr& Instance();
BOOL StartService();
BOOL StopService();
BOOL SetSpeed(float fRate);
BOOL Restore();
// Inner call
DWORD 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:
// Enable
BOOL bSpeed_;
// GetTickCount
DWORD gtcLastReal_;
DWORD gtcLastFake_;
base::TLock gtc_lock_;
// timeGetTime
DWORD tgtLastReal_;
DWORD tgtLastFake_;
base::TLock tgt_lock_;
// QueryPerformanceCounter
LONGLONG qpcLastReal_;
LONGLONG qpcLastFake_;
base::TLock qpc_lock_;
// QueryPerformanceFrequency
LONGLONG qpfLastReal_;
LONGLONG qpfLastFake_;
base::TLock qpf_lock_;
// Speed Factor
float speedFactor_;
};
cpp实现
#include "StdAfx.h"
#include "SpeedMgr.h"
#include "mhook.h"
#include <tchar.h>
#include <math.h>
// kernel32.dll
typedef DWORD (WINAPI *pfn_GetTickCoun