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

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

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

俺谢了先!

最新喜欢:

yizhilaiyizhil...
minsoft
驱动小牛
驱动小牛
  • 注册日期2001-07-30
  • 最后登录2007-03-06
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-11-11 11:26
关注
少了e,就少了全部
mike_wang
驱动中牛
驱动中牛
  • 注册日期2003-01-22
  • 最后登录2012-01-04
  • 粉丝0
  • 关注0
  • 积分91分
  • 威望10点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-11-11 11:48
不对吧!
视频与游戏的surface原理不一样的。
游戏用的是directdraw的表面,用print screen 功能都可以抓到bmp图片。
视频通常都是用的overlay surface,由于overlay surface处于所有表面的前面。所以用通常的抓屏软件是抓不到的。不过你可以写一些directshow 的filter就可以实现抓屏了。

至于你说的根据显存的变化来抓屏。也是可行的。不过我觉得这些功能完全可以在上层实现。你可以写一个transform filter来比较sample的内存变化就行了。没有必要去看显存的数据

bigbox
驱动牛犊
驱动牛犊
  • 注册日期2002-02-06
  • 最后登录2003-03-19
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-11-11 11:58
Mike_Wang兄把问题考虑的简单化了,俺在抓GDI窗口的同时还要抓DirectDraw&DirectShow&Direct3D窗口,也就是一个屏幕有可能混合n个不同的窗口,俺也不知道哪个窗口是Overlay,就算知道,还要HOOK窗口移动呀,WM_SIZE呀各种不同的消息,还不如直接监测现存的变化,有没有显卡驱动的高手给指点下下呀?
bigbox
驱动牛犊
驱动牛犊
  • 注册日期2002-02-06
  • 最后登录2003-03-19
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-11-11 14:43
折磨死俺了,不给俺点提示,俺要下课了:(
bigbox
驱动牛犊
驱动牛犊
  • 注册日期2002-02-06
  • 最后登录2003-03-19
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-11-12 10:27
俺有个新想法,写一个FilterDriver过滤向显卡的IRP,然后检测显存变化的数据,请问高手是否可行?
OneWind
驱动小牛
驱动小牛
  • 注册日期2002-05-15
  • 最后登录2009-04-10
  • 粉丝0
  • 关注0
  • 积分82分
  • 威望11点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-11-12 10:38
试一试,直接找到显存地址把全屏数据全部拷贝走,
嘿,大家好!
bigbox
驱动牛犊
驱动牛犊
  • 注册日期2002-02-06
  • 最后登录2003-03-19
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2002-11-12 11:14
ZBuilder兄,这样做也是不行的,效率太低,因为你不知道显存变化或者没变化,所以得起个定时器不停的抓,然后比较,想象一下,1024*768*24位真彩色是多大一个数量级,而且还只是一帧,再比较,再留住变化的部分,每秒钟能抓两帧就不错了。而直接监视显存,可以直接拿到变化的部分,比如鼠标移动,你就可以拿到需要重画鼠标的小部分区域,不需要一帧一帧的比较,效率要高上一万倍了!
ydyuse
驱动老牛
驱动老牛
  • 注册日期2002-07-25
  • 最后登录2005-03-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2002-11-12 11:31
俺有个新想法,写一个FilterDriver过滤向显卡的IRP,然后检测显存变化的数据,请问高手是否可行?


写个上层过滤驱动应是一个好办法!
生命驱动,活力无限!
OneWind
驱动小牛
驱动小牛
  • 注册日期2002-05-15
  • 最后登录2009-04-10
  • 粉丝0
  • 关注0
  • 积分82分
  • 威望11点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2002-11-12 14:02
TO bigbox兄:
   如果要监视显存的话该怎样去实现监视?(非要FilterDriver?)

[编辑 -  11/12/02 by  ZBuilder]
嘿,大家好!
bigbox
驱动牛犊
驱动牛犊
  • 注册日期2002-02-06
  • 最后登录2003-03-19
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2002-11-12 14:33
To ZBuilder兄
反正DirectX肯定是不行,而且用FilterDriver行不行还得两说,哪位高手给论证一下下呀!
迫切关注!
bigbox
驱动牛犊
驱动牛犊
  • 注册日期2002-02-06
  • 最后登录2003-03-19
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2002-11-12 14:37
To Ydyuse 兄
   上层过滤驱动,应该是Class Filter,而不是Device Filter,可是具体要过滤那些东西呢,针对显存的调用最后会追溯到那个函数或那个IRP上呢?或者使GDI和DirectX用的底层函数不一样?
GDI和DirectX是不是都调用Graphics Engine的DDI,是不是调用的同样的DDI函数呢?
   请高手给点儿答复呀,有点提示的俺就给分
bigbox
驱动牛犊
驱动牛犊
  • 注册日期2002-02-06
  • 最后登录2003-03-19
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2002-11-13 10:58
这个项目按已经放弃了,俺想老总提出请人来做,出价3万,分三期付清,只作显卡驱动部分,时间大概是1-2个月,有哪位高手或有经验者愿意挣点外快的,发信给俺。
具体要求按再跟您联系。

boxa@sina.com.cn

五五五,俺的价值在老板眼里大打折扣:(
jansen
驱动小牛
驱动小牛
  • 注册日期2001-10-21
  • 最后登录2007-10-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2002-11-15 20:57
一般来说视频是很难抓到的,即使你用print screen sys rq快捷键,正如楼上的所说的显卡是使用overlay来播放视频。另外显卡的驱动框架结构很大的,不是你所说得很简单就能搞定的。即使你就是使用整个显存拷贝的话,少说也有8M,那抓到一帧太慢,因为一般的video的刷新大概在1/20---1/25左右,何况你不一定能得到它的地址。有一个建议:如果你的DirectDraw地heap manager管理显存的话,你可以从overlay surface 的结构体的指针得到现存的地址,不过这个地址有两三个经常变化(取决于驱动程序的开辟了多少个缓冲区)因为要不停进行交换!
rich
bigbox
驱动牛犊
驱动牛犊
  • 注册日期2002-02-06
  • 最后登录2003-03-19
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2002-11-18 09:26
所以才采用显卡驱动的方式。
视频很难抓到,但不等于抓不到,难而已:)
bigbox
驱动牛犊
驱动牛犊
  • 注册日期2002-02-06
  • 最后登录2003-03-19
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2002-11-18 09:28
而且,怎麽会采用全显存拷贝!当然是只采集重画的部分,鼠标移动的话,就采鼠标那一点点!
jansen
驱动小牛
驱动小牛
  • 注册日期2001-10-21
  • 最后登录2007-10-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2002-11-18 20:12
如果自己的overlya surface是可以的
,调用Locksurface接口即可,如果是Mediaplayer的overlay surface 除非你做一监控的hook得到系统所有的overlay surface 然后用Locksurface来获取相应的overlay surface显村之指针,这个只有对directX非常熟练的可能做到
rich
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
leerom
驱动小牛
驱动小牛
  • 注册日期2001-06-08
  • 最后登录2010-08-31
  • 粉丝0
  • 关注0
  • 积分3分
  • 威望22点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2002-11-22 16:47
Mirror Driver只能监视GDI调用,对DirectX没办法监视。如果写一个驱动将原有的驱动包一层到是一个可行的办法,但是前提是你原有的显示驱动必须是自己写的,或有源代码。因为你要知道显卡驱动是怎样分配显存和使用显存才能进行截取。可能还有别的方法,但我没时间研究,要不让你老板先给3万,用一个月作个前期研究。如果可行,再给27万再用三、四个月给出产品,如何?:-)

[编辑 -  11/22/02 by  leerom]
leerom
bigbox
驱动牛犊
驱动牛犊
  • 注册日期2002-02-06
  • 最后登录2003-03-19
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2002-11-22 17:38
呵呵,可行性不必研究了,一定可行,方法是写一个通用MiniportDriver for PCI 然后写一个display driver就可以了
上一页
游客

返回顶部