阅读:5616回复:33
熟悉显卡的朋友请给点提示
其实俺对驱动不是特懂,但俺老板认为俺无所不懂,他让俺些个抓屏的东西,俺写了,工作的也不错,但就是抓不到视频和游戏,这两个东西全用的DirectX,所以俺想写个显卡驱动,实时监测一下显存变化,就是,显存一有变化,就给俺个提示,俺就把它逮下来,就是HOOK显存的变化,俺读了半天DDK,有几个问题:
1:俺是不是得把 DirectDraw&Direct3D DDI 函数全都得自己实现? (要是这样,俺就撤了) 2:有没有一个或几个简单的底层函数,显存变化追溯到最后的时候用的都是它,这样俺只要实现这几个就可以了? 俺谢了先! |
|
最新喜欢:![]() |
沙发#
发布于:2002-11-11 11:26
关注
|
|
|
板凳#
发布于:2002-11-11 11:48
不对吧!
视频与游戏的surface原理不一样的。 游戏用的是directdraw的表面,用print screen 功能都可以抓到bmp图片。 视频通常都是用的overlay surface,由于overlay surface处于所有表面的前面。所以用通常的抓屏软件是抓不到的。不过你可以写一些directshow 的filter就可以实现抓屏了。 至于你说的根据显存的变化来抓屏。也是可行的。不过我觉得这些功能完全可以在上层实现。你可以写一个transform filter来比较sample的内存变化就行了。没有必要去看显存的数据 |
|
地板#
发布于:2002-11-11 11:58
Mike_Wang兄把问题考虑的简单化了,俺在抓GDI窗口的同时还要抓DirectDraw&DirectShow&Direct3D窗口,也就是一个屏幕有可能混合n个不同的窗口,俺也不知道哪个窗口是Overlay,就算知道,还要HOOK窗口移动呀,WM_SIZE呀各种不同的消息,还不如直接监测现存的变化,有没有显卡驱动的高手给指点下下呀?
|
|
地下室#
发布于:2002-11-11 14:43
折磨死俺了,不给俺点提示,俺要下课了:(
|
|
5楼#
发布于:2002-11-12 10:27
俺有个新想法,写一个FilterDriver过滤向显卡的IRP,然后检测显存变化的数据,请问高手是否可行?
|
|
6楼#
发布于:2002-11-12 10:38
试一试,直接找到显存地址把全屏数据全部拷贝走,
|
|
|
7楼#
发布于:2002-11-12 11:14
ZBuilder兄,这样做也是不行的,效率太低,因为你不知道显存变化或者没变化,所以得起个定时器不停的抓,然后比较,想象一下,1024*768*24位真彩色是多大一个数量级,而且还只是一帧,再比较,再留住变化的部分,每秒钟能抓两帧就不错了。而直接监视显存,可以直接拿到变化的部分,比如鼠标移动,你就可以拿到需要重画鼠标的小部分区域,不需要一帧一帧的比较,效率要高上一万倍了!
|
|
8楼#
发布于:2002-11-12 11:31
俺有个新想法,写一个FilterDriver过滤向显卡的IRP,然后检测显存变化的数据,请问高手是否可行? 写个上层过滤驱动应是一个好办法! |
|
|
9楼#
发布于:2002-11-12 14:02
TO bigbox兄:
如果要监视显存的话该怎样去实现监视?(非要FilterDriver?) [编辑 - 11/12/02 by ZBuilder] |
|
|
10楼#
发布于:2002-11-12 14:33
To ZBuilder兄
反正DirectX肯定是不行,而且用FilterDriver行不行还得两说,哪位高手给论证一下下呀! 迫切关注! |
|
11楼#
发布于:2002-11-12 14:37
To Ydyuse 兄
上层过滤驱动,应该是Class Filter,而不是Device Filter,可是具体要过滤那些东西呢,针对显存的调用最后会追溯到那个函数或那个IRP上呢?或者使GDI和DirectX用的底层函数不一样? GDI和DirectX是不是都调用Graphics Engine的DDI,是不是调用的同样的DDI函数呢? 请高手给点儿答复呀,有点提示的俺就给分 |
|
12楼#
发布于:2002-11-13 10:58
这个项目按已经放弃了,俺想老总提出请人来做,出价3万,分三期付清,只作显卡驱动部分,时间大概是1-2个月,有哪位高手或有经验者愿意挣点外快的,发信给俺。
具体要求按再跟您联系。 boxa@sina.com.cn 五五五,俺的价值在老板眼里大打折扣:( |
|
13楼#
发布于:2002-11-15 20:57
一般来说视频是很难抓到的,即使你用print screen sys rq快捷键,正如楼上的所说的显卡是使用overlay来播放视频。另外显卡的驱动框架结构很大的,不是你所说得很简单就能搞定的。即使你就是使用整个显存拷贝的话,少说也有8M,那抓到一帧太慢,因为一般的video的刷新大概在1/20---1/25左右,何况你不一定能得到它的地址。有一个建议:如果你的DirectDraw地heap manager管理显存的话,你可以从overlay surface 的结构体的指针得到现存的地址,不过这个地址有两三个经常变化(取决于驱动程序的开辟了多少个缓冲区)因为要不停进行交换!
|
|
|
14楼#
发布于:2002-11-18 09:26
所以才采用显卡驱动的方式。
视频很难抓到,但不等于抓不到,难而已:) |
|
15楼#
发布于:2002-11-18 09:28
而且,怎麽会采用全显存拷贝!当然是只采集重画的部分,鼠标移动的话,就采鼠标那一点点!
|
|
16楼#
发布于:2002-11-18 20:12
如果自己的overlya surface是可以的
,调用Locksurface接口即可,如果是Mediaplayer的overlay surface 除非你做一监控的hook得到系统所有的overlay surface 然后用Locksurface来获取相应的overlay surface显村之指针,这个只有对directX非常熟练的可能做到 |
|
|
17楼#
发布于:2002-11-21 21:54
作一个镜像驱动程序,就可以了 mirror driver can use a driver to perform video mirroring. When video mirroring is active, each time the system draws to the primary video device at a location inside the mirrored area, a copy of the draw operation is executed on the mirrored video device in real time. With this mirroring scheme, you can simultaneously draw the same output to several video devices.
|
|
|
18楼#
发布于:2002-11-22 16:47
Mirror Driver只能监视GDI调用,对DirectX没办法监视。如果写一个驱动将原有的驱动包一层到是一个可行的办法,但是前提是你原有的显示驱动必须是自己写的,或有源代码。因为你要知道显卡驱动是怎样分配显存和使用显存才能进行截取。可能还有别的方法,但我没时间研究,要不让你老板先给3万,用一个月作个前期研究。如果可行,再给27万再用三、四个月给出产品,如何?:-)
[编辑 - 11/22/02 by leerom] |
|
|
19楼#
发布于:2002-11-22 17:38
呵呵,可行性不必研究了,一定可行,方法是写一个通用MiniportDriver for PCI 然后写一个display driver就可以了
|
|
上一页
下一页