bigbox
驱动牛犊
驱动牛犊
  • 注册日期2002-02-06
  • 最后登录2003-03-19
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:5618回复:33

熟悉显卡的朋友请给点提示

楼主#
更多 发布于:2002-11-11 10:28
其实俺对驱动不是特懂,但俺老板认为俺无所不懂,他让俺些个抓屏的东西,俺写了,工作的也不错,但就是抓不到视频和游戏,这两个东西全用的DirectX,所以俺想写个显卡驱动,实时监测一下显存变化,就是,显存一有变化,就给俺个提示,俺就把它逮下来,就是HOOK显存的变化,俺读了半天DDK,有几个问题:
 1:俺是不是得把 DirectDraw&Direct3D DDI 函数全都得自己实现?
(要是这样,俺就撤了)
 2:有没有一个或几个简单的底层函数,显存变化追溯到最后的时候用的都是它,这样俺只要实现这几个就可以了?

俺谢了先!

最新喜欢:

yizhilaiyizhil...
zhbzhou
驱动牛犊
驱动牛犊
  • 注册日期2001-06-27
  • 最后登录2005-02-11
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-11-28 14:01
to leerom!
非常同意你对overlay的观点,现在我还没有看到能够抓overlay
的软件, 不知道有没有人看过!



leerom
驱动小牛
驱动小牛
  • 注册日期2001-06-08
  • 最后登录2010-08-31
  • 粉丝0
  • 关注0
  • 积分3分
  • 威望22点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
板凳#
发布于: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]
leerom
zhbzhou
驱动牛犊
驱动牛犊
  • 注册日期2001-06-27
  • 最后登录2005-02-11
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-11-28 09:35
to leetom:
可能我没留意前面的对话,但是即使写一个display驱动包在原驱动外面,也不能抓到overlay的图象啊!DirectX到是可以抓到的,这个我试
过了,你知道怎么抓overlay的图象吗???

jansen
驱动小牛
驱动小牛
  • 注册日期2001-10-21
  • 最后登录2007-10-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-11-27 19:09
To leerom:
原来是高手呀,ddk里面的sample code 就有s3的。似乎你对graphic DDI特别精通呀!有时间希望用email联系!顺便请教一下EngLoadImage()应该在哪里调用呢,什么时候调用?
rich
leerom
驱动小牛
驱动小牛
  • 注册日期2001-06-08
  • 最后登录2010-08-31
  • 粉丝0
  • 关注0
  • 积分3分
  • 威望22点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-11-27 18:53
to zhbzhou:
你可能没留意前面的对话。我已经说过mirror driver不能截取directX调用,所以我才说要另外写一个display驱动包在原驱动外面,实现类似mirror driver的功能,这样就能捕获所对显示驱动的调用。

to bigbox:
miniport driver可以不写,还用原来的。在你的display driver中用EngloadImage来加载原来的display driver。然后用EngFindImageProcAddress得到原来驱动的函数入口(不过你要知道函数名,头痛!)
leerom
zhbzhou
驱动牛犊
驱动牛犊
  • 注册日期2001-06-27
  • 最后登录2005-02-11
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-11-27 09:39
mirror miniport和mirror display driver在DDK中就有例子,
根本不需要做,他的通用性也不是问题,微软的netmeeting
中的截屏就是用的这个例子,效率相当好,但是他也抓不了
视频中的overlay,现在采用的是把视频加速关掉来抓图象。
确实这样可以抓到,但是关掉视频加速的图象效果没有原来的
好。有谁知道现在能做到抓视频加速的软件啊,方便的话给个
地址,thanks!

leerom
驱动小牛
驱动小牛
  • 注册日期2001-06-08
  • 最后登录2010-08-31
  • 粉丝0
  • 关注0
  • 积分3分
  • 威望22点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2002-11-26 18:55
s3
leerom
jansen
驱动小牛
驱动小牛
  • 注册日期2001-10-21
  • 最后登录2007-10-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2002-11-25 18:57
To leerom:
可以问一下??
你作哪方面的显卡驱动呀?
rich
leerom
驱动小牛
驱动小牛
  • 注册日期2001-06-08
  • 最后登录2010-08-31
  • 粉丝0
  • 关注0
  • 积分3分
  • 威望22点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2002-11-25 13:57
要在Mirror Driver实现图像的重复绘制的原因如下:
1、DDI函数的入口参数大多数都是系统使用的内部对象。我们不知道它的结构和大小。比如clipobj
2、我们不知道驱动程序怎样分配和使用显存的。比如对鼠标,显卡驱动通常会在显存的最高端分配一个缓冲区保存鼠标形状,在输出图像时在将桌面和鼠标叠加输出。这样可以避免在,收到鼠标移动的系统调用时对鼠标原先所在的位置的显存重新刷新。
对于miniport我想应该是写一个过滤驱动。
leerom
bigbox
驱动牛犊
驱动牛犊
  • 注册日期2002-02-06
  • 最后登录2003-03-19
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2002-11-25 13:04
To:leerom
不会呀,你想想,只要调用原驱动的程序的DirectX DDI就可以了呀,在mirror driver上怎么绘图不管它,活着不画,只要拿到屏幕变化,然后通知上层程序就行了。

我所担心的是通用的miniport driver,这方面有什么思路吗?
bigbox
驱动牛犊
驱动牛犊
  • 注册日期2002-02-06
  • 最后登录2003-03-19
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2002-11-25 12:59
To:leerom
怎麽会,你想想,只要调用原驱动程序的DDI就好了呀!
leerom
驱动小牛
驱动小牛
  • 注册日期2001-06-08
  • 最后登录2010-08-31
  • 粉丝0
  • 关注0
  • 积分3分
  • 威望22点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2002-11-25 10:47
如果只是GDI的Mirror Driver,我立即可以答应你。但是你的要求主要是DirectX,我没有的把握,所以才提出前期研究。原理虽然可以说出来,但是实现起来还是有很大的难度。DirectX和GDI不同,在GDI驱动中我可以调用那些Eng开头的系统函数来实现在系统内存上的绘图,而在DirectX中恐怕都要自己来。
leerom
bigbox
驱动牛犊
驱动牛犊
  • 注册日期2002-02-06
  • 最后登录2003-03-19
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2002-11-25 10:11
To:leerom
    你说得太对了,就是写一个miniport,然后一个mirror display driver.怎麽样?有兴趣接下来吗?
leerom
驱动小牛
驱动小牛
  • 注册日期2001-06-08
  • 最后登录2010-08-31
  • 粉丝0
  • 关注0
  • 积分3分
  • 威望22点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2002-11-24 09:46
如果你只是对特定的显卡驱动开发的话,那么恭喜你,你只要实现原显示驱动中提供的几个DDI函数就行了。但如果你开发的是一个通用驱动,那么你应该实现所有的和显示有关的DDI函数。在系统加载你的驱动的时候,你的驱动首先要查找并加载原有的驱动程序,同时纪录下原驱动程序的所有DDI函数的入口。你的驱动程序应该类似Mirror Driver使用系统内存作为frame buffer,系统你的驱动进行调用时你先要在你的frame buffer上完成相应的绘图,在调用原来的驱动程序。

[编辑 -  11/24/02 by  leerom]
leerom
bigbox
驱动牛犊
驱动牛犊
  • 注册日期2002-02-06
  • 最后登录2003-03-19
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2002-11-22 17:38
呵呵,可行性不必研究了,一定可行,方法是写一个通用MiniportDriver for PCI 然后写一个display driver就可以了
leerom
驱动小牛
驱动小牛
  • 注册日期2001-06-08
  • 最后登录2010-08-31
  • 粉丝0
  • 关注0
  • 积分3分
  • 威望22点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2002-11-22 16:47
Mirror Driver只能监视GDI调用,对DirectX没办法监视。如果写一个驱动将原有的驱动包一层到是一个可行的办法,但是前提是你原有的显示驱动必须是自己写的,或有源代码。因为你要知道显卡驱动是怎样分配显存和使用显存才能进行截取。可能还有别的方法,但我没时间研究,要不让你老板先给3万,用一个月作个前期研究。如果可行,再给27万再用三、四个月给出产品,如何?:-)

[编辑 -  11/22/02 by  leerom]
leerom
jansen
驱动小牛
驱动小牛
  • 注册日期2001-10-21
  • 最后登录2007-10-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
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.
rich
jansen
驱动小牛
驱动小牛
  • 注册日期2001-10-21
  • 最后登录2007-10-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2002-11-18 20:12
如果自己的overlya surface是可以的
,调用Locksurface接口即可,如果是Mediaplayer的overlay surface 除非你做一监控的hook得到系统所有的overlay surface 然后用Locksurface来获取相应的overlay surface显村之指针,这个只有对directX非常熟练的可能做到
rich
bigbox
驱动牛犊
驱动牛犊
  • 注册日期2002-02-06
  • 最后登录2003-03-19
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2002-11-18 09:28
而且,怎麽会采用全显存拷贝!当然是只采集重画的部分,鼠标移动的话,就采鼠标那一点点!
上一页
游客

返回顶部