大家好,欢迎来到IT知识分享网。
1.什么是DWM
DWM全称桌面窗口管理程序,是Windows Vista之后一个全新的窗口管理系统,他决定windows应用程序的呈现方式,用过XP的同学肯定遇到过窗口拖影的情况。
在XP时代,窗口绘制都是直接提交到显卡的显存中显示的,简单来说就是Windows桌面只有一个对应的图像缓存,所有程序都直接在这个缓存下进行渲染。这样就知道了只有应用程序知道应该怎么绘图,而XP下的Windows桌面系统完全不知道怎么绘制,因此当窗口出现未响应的窗口被遮挡时,Windows就会产生拖影的现象。
Windows Vista后彻底对窗口系统做了重构,引入了DWM,Windows应用程序的窗口绘制的图形就不会再和XP一样绘制到如上所说的桌面缓存里面去了,而是将绘制操作重定向到DWM的对应的off-screen surface上,然后再通过DWM合成输出到显示器上。
2.DWM对截屏的影响
先看一张图再开启DWM和关闭DWM截取窗口的效果
从图中可以看出启了DWM的则直接截取指定窗口及其子窗口的图像;而没有开启DWM则截取到目标窗口所在区域的所有图形;
其本质原因是如上文所说是
2.1跟着windbg看没有开启DWM情况下图形绘制流程
kd> !process 0 0 test_wnd_capture.exePROCESS a4ebf348 SessionId: 1 Cid: 0d04 Peb: 7ffd5000 ParentCid: 0764DirBase: be63ba60 ObjectTable: b4686c38 HandleCount: 43.Image: test_wnd_capture.exekd> ba e1 win32k!EngLineTo “.if(@$tpid==0d04){dt _eprocess @$proc -yn ImageF;kb}.else{gc;}”
直接手动修改Surface的像素数据也是OK的,看下图:
2.2 跟着windbg看开启DWM情况下图形绘制流程
还是以画线函数为例看DWM情况下图形绘制流程,简单做个逆向分析便知道该API的调用链如下:
pso
;即看
_SURFOBJ .
pvBits
也会改变,即OS会重新分配一块内存用以作为Surface;
ba &_SURFOBJ .pvBits r4;
然后手动改变窗口大小;栈回溯如下:
利用调试器手动的修改这块内存的像素数据,也是会生效的;但当WM_PAINT消息产生时,如果程序没有拦截该消息,OS默认的窗口过程会用背景画刷重绘该区域;
通过上述动手做实验发现了DWM开启时候,操作系统会为应用程序维护一个所有窗口共享的surface, 每个进程的窗口对应一个DC,DC相关接口如BitBlt, DX的想更换接口如ColorFill都只是在对应的DC或Surface上进行操作,最后会合成到进程共享的Surface上去,上述例子也证明了截图父窗口DC为啥可以既然看到DX绘制的红色,也能看到GDI绘制的斜线。
本质上DWM最后会维护所有进程的窗口共享surface, 然后在DWMCore中完全合成最后送显,在显示器中显示
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/130445.html








