阅读:5618回复:33
熟悉显卡的朋友请给点提示
其实俺对驱动不是特懂,但俺老板认为俺无所不懂,他让俺些个抓屏的东西,俺写了,工作的也不错,但就是抓不到视频和游戏,这两个东西全用的DirectX,所以俺想写个显卡驱动,实时监测一下显存变化,就是,显存一有变化,就给俺个提示,俺就把它逮下来,就是HOOK显存的变化,俺读了半天DDK,有几个问题:
1:俺是不是得把 DirectDraw&Direct3D DDI 函数全都得自己实现? (要是这样,俺就撤了) 2:有没有一个或几个简单的底层函数,显存变化追溯到最后的时候用的都是它,这样俺只要实现这几个就可以了? 俺谢了先! |
|
最新喜欢:![]() |
沙发#
发布于:2002-11-28 14:01
to leerom!
非常同意你对overlay的观点,现在我还没有看到能够抓overlay 的软件, 不知道有没有人看过! |
|
板凳#
发布于:2002-11-28 11:11
to jansen:
我的想法是:在DrvEanbleDriver中调用EngLoadImage()加载原来的驱动程序,然后再用EngFindImageProcAddress()得到原来驱动的DrvEanbleDriver函数地址(DrvEnableDriver为每个display driver的入口地址,我头痛的问题解决了)。再通过对原来驱动的DrvEnableDriver进行调用,即可得到原驱动提供的DDI函数入口表。 to zhbzhou: 不能捕获overlay的确是这种方法的弱点。因为我们不知道视频图像究竟被放在显存的什么位置。应用通常是通过DrvEscape接口将显示的参数直接传入,比如显示视频图像的窗口句柄或信号制式。再输出时再把视频图像和桌面进行叠加输出。对这种视频图像我个人认为是没法捕捉的,除非你有原来display driver的源码。 [编辑 - 11/28/02 by leerom] |
|
|
地板#
发布于:2002-11-28 09:35
to leetom:
可能我没留意前面的对话,但是即使写一个display驱动包在原驱动外面,也不能抓到overlay的图象啊!DirectX到是可以抓到的,这个我试 过了,你知道怎么抓overlay的图象吗??? |
|
地下室#
发布于:2002-11-27 19:09
To leerom:
原来是高手呀,ddk里面的sample code 就有s3的。似乎你对graphic DDI特别精通呀!有时间希望用email联系!顺便请教一下EngLoadImage()应该在哪里调用呢,什么时候调用? |
|
|
5楼#
发布于:2002-11-27 18:53
to zhbzhou:
你可能没留意前面的对话。我已经说过mirror driver不能截取directX调用,所以我才说要另外写一个display驱动包在原驱动外面,实现类似mirror driver的功能,这样就能捕获所对显示驱动的调用。 to bigbox: miniport driver可以不写,还用原来的。在你的display driver中用EngloadImage来加载原来的display driver。然后用EngFindImageProcAddress得到原来驱动的函数入口(不过你要知道函数名,头痛!) |
|
|
6楼#
发布于:2002-11-27 09:39
mirror miniport和mirror display driver在DDK中就有例子,
根本不需要做,他的通用性也不是问题,微软的netmeeting 中的截屏就是用的这个例子,效率相当好,但是他也抓不了 视频中的overlay,现在采用的是把视频加速关掉来抓图象。 确实这样可以抓到,但是关掉视频加速的图象效果没有原来的 好。有谁知道现在能做到抓视频加速的软件啊,方便的话给个 地址,thanks! |
|
7楼#
发布于:2002-11-26 18:55
s3
|
|
|
8楼#
发布于:2002-11-25 18:57
To leerom:
可以问一下?? 你作哪方面的显卡驱动呀? |
|
|
9楼#
发布于:2002-11-25 13:57
要在Mirror Driver实现图像的重复绘制的原因如下:
1、DDI函数的入口参数大多数都是系统使用的内部对象。我们不知道它的结构和大小。比如clipobj 2、我们不知道驱动程序怎样分配和使用显存的。比如对鼠标,显卡驱动通常会在显存的最高端分配一个缓冲区保存鼠标形状,在输出图像时在将桌面和鼠标叠加输出。这样可以避免在,收到鼠标移动的系统调用时对鼠标原先所在的位置的显存重新刷新。 对于miniport我想应该是写一个过滤驱动。 |
|
|
10楼#
发布于:2002-11-25 13:04
To:leerom
不会呀,你想想,只要调用原驱动的程序的DirectX DDI就可以了呀,在mirror driver上怎么绘图不管它,活着不画,只要拿到屏幕变化,然后通知上层程序就行了。 我所担心的是通用的miniport driver,这方面有什么思路吗? |
|
11楼#
发布于:2002-11-25 12:59
To:leerom
怎麽会,你想想,只要调用原驱动程序的DDI就好了呀! |
|
12楼#
发布于:2002-11-25 10:47
如果只是GDI的Mirror Driver,我立即可以答应你。但是你的要求主要是DirectX,我没有的把握,所以才提出前期研究。原理虽然可以说出来,但是实现起来还是有很大的难度。DirectX和GDI不同,在GDI驱动中我可以调用那些Eng开头的系统函数来实现在系统内存上的绘图,而在DirectX中恐怕都要自己来。
|
|
|
13楼#
发布于:2002-11-25 10:11
To:leerom
你说得太对了,就是写一个miniport,然后一个mirror display driver.怎麽样?有兴趣接下来吗? |
|
14楼#
发布于:2002-11-24 09:46
如果你只是对特定的显卡驱动开发的话,那么恭喜你,你只要实现原显示驱动中提供的几个DDI函数就行了。但如果你开发的是一个通用驱动,那么你应该实现所有的和显示有关的DDI函数。在系统加载你的驱动的时候,你的驱动首先要查找并加载原有的驱动程序,同时纪录下原驱动程序的所有DDI函数的入口。你的驱动程序应该类似Mirror Driver使用系统内存作为frame buffer,系统你的驱动进行调用时你先要在你的frame buffer上完成相应的绘图,在调用原来的驱动程序。
[编辑 - 11/24/02 by leerom] |
|
|
15楼#
发布于:2002-11-22 17:38
呵呵,可行性不必研究了,一定可行,方法是写一个通用MiniportDriver for PCI 然后写一个display driver就可以了
|
|
16楼#
发布于:2002-11-22 16:47
Mirror Driver只能监视GDI调用,对DirectX没办法监视。如果写一个驱动将原有的驱动包一层到是一个可行的办法,但是前提是你原有的显示驱动必须是自己写的,或有源代码。因为你要知道显卡驱动是怎样分配显存和使用显存才能进行截取。可能还有别的方法,但我没时间研究,要不让你老板先给3万,用一个月作个前期研究。如果可行,再给27万再用三、四个月给出产品,如何?:-)
[编辑 - 11/22/02 by leerom] |
|
|
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-18 20:12
如果自己的overlya surface是可以的
,调用Locksurface接口即可,如果是Mediaplayer的overlay surface 除非你做一监控的hook得到系统所有的overlay surface 然后用Locksurface来获取相应的overlay surface显村之指针,这个只有对directX非常熟练的可能做到 |
|
|
19楼#
发布于:2002-11-18 09:28
而且,怎麽会采用全显存拷贝!当然是只采集重画的部分,鼠标移动的话,就采鼠标那一点点!
|
|
上一页
下一页