20楼#
发布于:2002-11-24 09:46
如果你只是对特定的显卡驱动开发的话,那么恭喜你,你只要实现原显示驱动中提供的几个DDI函数就行了。但如果你开发的是一个通用驱动,那么你应该实现所有的和显示有关的DDI函数。在系统加载你的驱动的时候,你的驱动首先要查找并加载原有的驱动程序,同时纪录下原驱动程序的所有DDI函数的入口。你的驱动程序应该类似Mirror Driver使用系统内存作为frame buffer,系统你的驱动进行调用时你先要在你的frame buffer上完成相应的绘图,在调用原来的驱动程序。
[编辑 - 11/24/02 by leerom] |
|
|
21楼#
发布于:2002-11-25 10:11
To:leerom
你说得太对了,就是写一个miniport,然后一个mirror display driver.怎麽样?有兴趣接下来吗? |
|
22楼#
发布于:2002-11-25 10:47
如果只是GDI的Mirror Driver,我立即可以答应你。但是你的要求主要是DirectX,我没有的把握,所以才提出前期研究。原理虽然可以说出来,但是实现起来还是有很大的难度。DirectX和GDI不同,在GDI驱动中我可以调用那些Eng开头的系统函数来实现在系统内存上的绘图,而在DirectX中恐怕都要自己来。
|
|
|
23楼#
发布于:2002-11-25 12:59
To:leerom
怎麽会,你想想,只要调用原驱动程序的DDI就好了呀! |
|
24楼#
发布于:2002-11-25 13:04
To:leerom
不会呀,你想想,只要调用原驱动的程序的DirectX DDI就可以了呀,在mirror driver上怎么绘图不管它,活着不画,只要拿到屏幕变化,然后通知上层程序就行了。 我所担心的是通用的miniport driver,这方面有什么思路吗? |
|
25楼#
发布于:2002-11-25 13:57
要在Mirror Driver实现图像的重复绘制的原因如下:
1、DDI函数的入口参数大多数都是系统使用的内部对象。我们不知道它的结构和大小。比如clipobj 2、我们不知道驱动程序怎样分配和使用显存的。比如对鼠标,显卡驱动通常会在显存的最高端分配一个缓冲区保存鼠标形状,在输出图像时在将桌面和鼠标叠加输出。这样可以避免在,收到鼠标移动的系统调用时对鼠标原先所在的位置的显存重新刷新。 对于miniport我想应该是写一个过滤驱动。 |
|
|
26楼#
发布于:2002-11-25 18:57
To leerom:
可以问一下?? 你作哪方面的显卡驱动呀? |
|
|
27楼#
发布于:2002-11-26 18:55
s3
|
|
|
28楼#
发布于:2002-11-27 09:39
mirror miniport和mirror display driver在DDK中就有例子,
根本不需要做,他的通用性也不是问题,微软的netmeeting 中的截屏就是用的这个例子,效率相当好,但是他也抓不了 视频中的overlay,现在采用的是把视频加速关掉来抓图象。 确实这样可以抓到,但是关掉视频加速的图象效果没有原来的 好。有谁知道现在能做到抓视频加速的软件啊,方便的话给个 地址,thanks! |
|
29楼#
发布于:2002-11-27 18:53
to zhbzhou:
你可能没留意前面的对话。我已经说过mirror driver不能截取directX调用,所以我才说要另外写一个display驱动包在原驱动外面,实现类似mirror driver的功能,这样就能捕获所对显示驱动的调用。 to bigbox: miniport driver可以不写,还用原来的。在你的display driver中用EngloadImage来加载原来的display driver。然后用EngFindImageProcAddress得到原来驱动的函数入口(不过你要知道函数名,头痛!) |
|
|
30楼#
发布于:2002-11-27 19:09
To leerom:
原来是高手呀,ddk里面的sample code 就有s3的。似乎你对graphic DDI特别精通呀!有时间希望用email联系!顺便请教一下EngLoadImage()应该在哪里调用呢,什么时候调用? |
|
|
31楼#
发布于:2002-11-28 09:35
to leetom:
可能我没留意前面的对话,但是即使写一个display驱动包在原驱动外面,也不能抓到overlay的图象啊!DirectX到是可以抓到的,这个我试 过了,你知道怎么抓overlay的图象吗??? |
|
32楼#
发布于: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] |
|
|
33楼#
发布于:2002-11-28 14:01
to leerom!
非常同意你对overlay的观点,现在我还没有看到能够抓overlay 的软件, 不知道有没有人看过! |
|
上一页
下一页