首页
技术博客
PHP教程
数据库技术
前端开发
HTML5
Nginx
php论坛
新用户注册
|
会员登录
PHP教程
技术博客
编程问答
PNG素材
编程语言
前端技术
Android
PHP教程
HTML5教程
数据库
Linux技术
Nginx技术
PHP安全
WebSerer
职场攻略
JavaScript
开放平台
业界资讯
大话程序猿
登录
极速注册
取消
热门标签 | HotTags
select
heap
keyword
python2
solr
case
hashcode
less
node.js
metadata
replace
bit
cSharp
scala
frameworks
chat
grid
emoji
plugins
include
stream
string
hook
join
format
bytecode
utf-8
usb
dagger
erlang
controller
integer
cookie
spring
callback
filter
post
c语言
random
byte
go
require
express
java
python3
blob
nodejs
int
buffer
js
char
uri
uml
vbscript
javascript
email
function
subset
default
ip
iostream
php5
python
object
web3
数组
request
process
hash
testing
foreach
ascii
vba
dll
fetch
match
io
hashset
merge
当前位置:
开发笔记
>
编程语言
> 正文
D3D9hookPresent优化CPU
作者:营在天下的世界_141 | 来源:互联网 | 2023-07-08 17:20
D3D9hookPresent优化CPU具体实现步骤:1.HOOKDirect3DCreate9来获得类型为LPDIRECT3D9的Direct3D对象的接口指针,它有一个
D3D9 hook Present优化CPU
具体实现步骤:
1.HOOK Direct3DCreate9来获得类型为LPDIRECT3D9的Direct3D对象的接口指针,它有一个成员函数为 IDirect3D9::CreateDevice,所以,只要根据Direct3D对象接口指针找到Direct3D对象的虚函数表,再根据虚函数表确定IDirect3D9::CreateDevice的内存地址,就可以hook这个函数,从而获得类型为LPDIRECT3DDEVICE9的设备对象指针,然后根据设备对象指针找到设备对象的虚函数表,根据虚函数表找到IDirect3DDevice9::Present在内存中的地址,对其进行HOOK,在其中加入sleep函数.
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
//代码参考runjin
[cpp]
view plain copy
#include
#include
#pragma comment(lib, "D3D9.lib")
#pragma comment(lib, "D3Dx9.lib")
void
GameD3D_HOOK();
IDirect3D9 * _stdcall New_Direct3DCreate9(
UINT
SDKVersion);
HRESULT
_stdcall New_CreateDevice(
LPDIRECT3D9 pDx9,
UINT
Adapter,
D3DDEVTYPE DeviceType,
HWND
hFocusWindow,
DWORD
BehaviorFlags,
D3DPRESENT_PARAMETERS * pPresentsentationParameters,
IDirect3DDevice9 ** pPresentturnedDeviceInterface
);
HRESULT
_stdcall New_Present(
LPDIRECT3DDEVICE9 pDxdevice,
CONST RECT * pSourceRect,
CONST RECT * pDestRect,
HWND
hDestWindowOverride,
CONST RGNDATA * pDirtyRegion
);
LPDIRECT3D9 m_pD3D=NULL;
//Direct3D对象的接口指针
void
* pDirect3DCreate9=NULL;
//Direct3DCreate9函数地址指针
void
* pCreateDevice=NULL;
//IDirect3D9::CreateDevice函数地址指针
void
* pPresent=NULL;
//IDirect3DDevice9::Present函数地址指针
int
Sleeptime=50;
//延时时间
BYTE
Direct3DCreate_Begin;
//用于保存Direct3DCreate9入口的5字节
BYTE
CreateDevice_Begin;
//用于保存IDirect3D9::CreateDevice入口的字节
BYTE
Present_Begin;
//用于保存IDirect3DDevice9::Present入口的5字节
void
GameD3D_HOOK()
{
//hook Direct3DCreate9
pDirect3DCreate9=GetProcAddress(GetModuleHandle(
"d3d9.dll"
),
"Direct3DCreate9"
);
DWORD
oldproc=0;
memcpy(Direct3DCreate_Begin,pDirect3DCreate9,5);
VirtualProtect(pDirect3DCreate9,5,PAGE_EXECUTE_READWRITE,&oldpro);
*(
BYTE
*)pDirect3DCreate9=0xe9;
*(
DWORD
*)((
BYTE
*)pDirect3DCreate9+1)=(
DWORD
)New_Direct3DCreate9-(
DWORD
)pDirect3DCreate9-5;
}
//当运行到Direct3DCreate9时跳转到这里
IDirect3D9 * _stdcall New_Direct3DCreate9(
UINT
SDKVersion
)
{
__asm pushad
memcpy(pDirect3DCreate9,Direct3DCreate_Begin,5);
//首先还原入口的5个字节
m_pD3D=Direct3DCreate9(SDKVersion);
if
(m_pD3D){
//如果成功
pCreateDevice=(
void
*)*(
DWORD
*)(*(
DWORD
*)m_pD3D+0x40);
//获得IDirect3D9::CreateDevice的地址指针
DWORD
oldpro=0;
memcpy(CreateDevice_Begin,pCreateDevice,5);
//保存IDirect3D9::CreateDevice入口5个字节
VirtualProtect(pCreateDevice,5,PAGE_EXECUTE_READWRITE,&oldpro);
*(
BYTE
*)pCreateDevice=0xe9;
*(
DWORD
*)((
BYTE
*)pCreateDevice+1)=(
DWORD
)New_CreateDevice-(
DWORD
)pCreateDevice-5;
}
else
{
//如果失败就再hook一次
DWORD
oldpro=0;
VirtualProtect(pDirect3DCreate9,5,PAGE_EXECUTE_READWRITE,&oldpro);
*(
BYTE
*)pDirect3DCreate9=0xe9;
*(
DWORD
*)((
BYTE
*)pDirect3DCreate9+1)=(
DWORD
)New_Direct3DCreate9-(
DWORD
)pDirect3DCreate9-5;
}
__asm popad
return
m_pD3D;
}
//hook CreateDevice
HRESULT
_stdcall New_CreateDevice(
LPDIRECT3D9 pDx9,
UINT
Adapter,
D3DDEVTYPE DeviceType,
HWND
hFocusWindow,
DWORD
BehaviorFlags,
D3DPRESENT_PARAMETERS * pPresentsentationParameters,
IDirect3DDevice9 ** pPresentturnedDeviceInterface
)
{
__asm pushad
memcpy(pCreateDevice,CreateDevice_Begin,5);
//先还原入口的5个字节
HRESULT
ret=pDx9->CreateDevice(
//创建设备
Adapter,
DeviceType,
hFocusWindow,
BehaviorFlags,
pPresentsentationParameters,
pPresentturnedDeviceInterface);
if
(ret==D3D_OK){
//如果创建设备成功
LPDIRECT3DDEVICE9 m_pDevice=*pPresentturnedDeviceInterface;
pPresent=(
void
*)*(
DWORD
*)(*(
DWORD
*)m_pDevice+0x44);
//获得IDirect3DDevice9::Present的地址指针
memcpy(Present_Begin,pPresent,5);
//保存IDirect3DDevice9::Present入口的5个字节
DWORD
oldpro=0;
VirtualProtect(pPresent,5,PAGE_EXECUTE_READWRITE,&oldpro);
*(
BYTE
*)pPresent=0xe9;
*(
DWORD
*)((
BYTE
*)pPresent+1)=(
DWORD
)New_Present-(
DWORD
)pPresent-5;
}
else
{
//如果失败再hookIDirect3D9::CreateDevice一次
DWORD
oldpro=0;
VirtualProtect(pCreateDevice,5,PAGE_EXECUTE_READWRITE,&oldpro);
*(
BYTE
*)pCreateDevice=0xe9;
*(
DWORD
*)((
BYTE
*)pCreateDevice+1)=(
DWORD
)New_CreateDevice-(
DWORD
)pCreateDevice-5;
}
__asm popad
return
ret;
}
//当程序运行到IDirect3DDevice9::Present入口处将跳转到这里
HRESULT
_stdcall New_Present(
LPDIRECT3DDEVICE9 pDxdevice,
//类的this指针
CONST RECT * pSourceRect,
//此参数请参考dx sdk
CONST RECT * pDestRect,
//同上
HWND
hDestWindowOverride,
//同上
CONST RGNDATA * pDirtyRegion
//同上
)
{
Sleep(Sleeptime);
__asm pushad
if
(pDirect3DCreate9 && pCreateDevice && pPresent)
memcpy(pPresent,Present_Begin,5);
//先还原IDirect3DDevice9::Present入口的5字节
HRESULT
retdata= pDxdevice->;Present(pSourceRect,pDestRect,hDestWindowOverride,pDirtyRegion);
if
(pDirect3DCreate9 && pCreateDevice && pPresent){
//DWORD oldpro=0;
//VirtualProtect(pPresent,5,PAGE_EXECUTE_READWRITE,&oldpro);
//调用完IDirect3DDevice9::Present后再hook一次
*(
BYTE
*)pPresent=0xe9;
*(
DWORD
*)((
BYTE
*)pPresent+1)=(
DWORD
)New_Present-(
DWORD
)pPresent-5;
}
__asm popad
return
retdata;
}
hook
cpu
写下你的评论吧 !
吐个槽吧,看都看了
会员登录
|
用户注册
推荐阅读
select
如何限制php数据库链接数和连接超时时间?
本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ...
[详细]
蜡笔小新 2023-12-14 14:06:10
string
阿里云物联网 .NET Core 客户端 | CZGL.AliIoTClient:4. 设备上报属性
阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ...
[详细]
蜡笔小新 2023-12-14 12:40:20
string
mcs51单片机定时器计数器应用教程(基于c语言)
本文介绍了基于c语言的mcs51单片机定时器计数器的应用教程,包括定时器的设置和计数方法,以及中断函数的使用。同时介绍了定时器应用的举例,包括定时器中断函数的编写和频率值的计算方法。主函数中设置了T0模式和T1计数的初值,并开启了T0和T1的中断,最后启动了CPU中断。 ...
[详细]
蜡笔小新 2023-12-14 12:15:04
string
乐视手机S1 Pro发布,声称手机真不卡,外观酷似iPhone
乐视宣布即将发布乐视手机S1 Pro,搭载虎贲T7510芯片,声称手机真不卡。该手机外观与iPhone 14 Pro相似,采用居中药丸式挖孔屏和方形三摄模组。官方定位该手机为便宜的5G手机,售价预计在千元价位。 ...
[详细]
蜡笔小新 2023-12-14 10:51:51
string
显卡驱动对游戏的影响及其提升效果的研究
本文研究了显卡驱动对游戏体验的提升效果,通过比较新旧驱动加持下的RTX 2080Ti显卡在游戏体验上的差异。测试平台选择了i9-9900K处理器和索泰RTX 2080Ti玩家力量至尊显卡,以保证数据的准确性。研究结果表明,显卡驱动的更新确实能够带来近乎50%的性能提升,对于提升游戏体验具有重要意义。 ...
[详细]
蜡笔小新 2023-12-13 21:52:19
string
Linux进程控制块PCBtask_struct结构体结构及作用详解
本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ...
[详细]
蜡笔小新 2023-12-13 21:31:18
select
图解redis的持久化存储机制RDB和AOF的原理和优缺点
本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ...
[详细]
蜡笔小新 2023-12-13 20:24:11
select
基于事件驱动的并发编程及其消息通信机制的同步与异步、阻塞与非阻塞、IO模型的分类
本文介绍了基于事件驱动的并发编程中的消息通信机制,包括同步和异步的概念及其区别,阻塞和非阻塞的状态,以及IO模型的分类。同步阻塞IO、同步非阻塞IO、异步阻塞IO和异步非阻塞IO等不同的IO模型被详细解释。这些概念和模型对于理解并发编程中的消息通信和IO操作具有重要意义。 ...
[详细]
蜡笔小新 2023-12-13 19:32:09
select
计算机存储系统的层次结构及其优势
本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ...
[详细]
蜡笔小新 2023-12-13 17:32:41
select
Tomcat/Jetty为何选择扩展线程池而不是使用JDK原生线程池?
本文探讨了Tomcat和Jetty选择扩展线程池而不是使用JDK原生线程池的原因。通过比较IO密集型任务和CPU密集型任务的特点,解释了为何Tomcat和Jetty需要扩展线程池来提高并发度和任务处理速度。同时,介绍了JDK原生线程池的工作流程。 ...
[详细]
蜡笔小新 2023-12-13 16:18:09
select
记录一次es集群load过高问题(待更新)
toptop-H-ppid按shiftp以cpu来排序按shiftm以memory来排序将10进制线程pid转为16进制printf%x\npidjstackjstackP ...
[详细]
蜡笔小新 2023-12-13 13:49:20
string
C++字符字符串处理及字符集编码方案
本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ...
[详细]
蜡笔小新 2023-12-13 04:59:58
string
CentOS 7部署KVM虚拟化环境之一架构介绍
本文介绍了CentOS 7部署KVM虚拟化环境的架构,详细解释了虚拟化技术的概念和原理,包括全虚拟化和半虚拟化。同时介绍了虚拟机的概念和虚拟化软件的作用。 ...
[详细]
蜡笔小新 2023-12-12 21:38:57
string
java命令运行
Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ...
[详细]
蜡笔小新 2023-12-12 19:26:55
string
iOS Metal shader中的if条件判断限制及处理方式
本文讨论了在iOS平台中的Metal框架中,对于if语句中的判断条件的限制和处理方式。作者提到了在Metal shader中,判断条件不能写得太长太复杂,否则可能导致程序停留或没有响应。作者还分享了自己的经验,建议在CPU端进行处理,以避免出现问题。 ...
[详细]
蜡笔小新 2023-12-12 19:01:06
营在天下的世界_141
这个家伙很懒,什么也没留下!
Tags | 热门标签
select
heap
keyword
python2
solr
case
hashcode
less
node.js
metadata
replace
bit
cSharp
scala
frameworks
chat
grid
emoji
plugins
include
stream
string
hook
join
format
bytecode
utf-8
usb
dagger
erlang
RankList | 热门文章
1
关于数据迁移的方法、步骤和心得
2
PowershellMailmodule,发送outbox里的所有邮件(一个.csv文件代
3
《数据库原理》复习总结
4
C#实现GRID字段别名显示,利用MSSQL数据库表及字段描述
5
《数据库原理与应用》复习试题归纳
6
数据库系统可以查性能瓶颈,自己写的小组件不行。
7
Left Join
8
当ASM磁盘组无法MOUNT之时如何找到对应的物理磁盘?
9
MSSQL中用WITHAS和PIVOT来统计编辑新闻发布时间详情和总数
10
EF初步认识
11
事务、存储过程数据统一的守护神
12
万能数据库查询分析器使用技巧之(十六)
13
FirebirdDatabaseOnMacOSX
14
HowdoestheMETHOD_OPTparameterworkMethod_opt参数应用
15
用热备+归档恢复损坏的非系统表空间
PHP1.CN | 中国最专业的PHP中文社区 |
DevBox开发工具箱
|
json解析格式化
|
PHP资讯
|
PHP教程
|
数据库技术
|
服务器技术
|
前端开发技术
|
PHP框架
|
开发工具
|
在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved |
京公网安备 11010802041100号
|
京ICP备19059560号-4
| PHP1.CN 第一PHP社区 版权所有