阅读:1646回复:18
请问有直接写屏的例子吗?
搜索了几个直接写屏的贴子,照着得到显卡的内存地址,用MmMapIoSpace转化,然后写了几个字节进去,结果系统什么也不说就重起了,大家有做过的能给个例子吗?
|
|
最新喜欢:okincn
|
沙发#
发布于:2003-01-06 15:55
不要用其他函数,直接在设备管理里找到峡卡地址,循环写入即可。本人写过一个,可惜找不到了,是vxd驱动。思路代码都很简单。
|
|
板凳#
发布于:2003-01-07 17:36
呵呵,我这样干了一下可惨了,结果系统崩溃,无法再启动,删掉驱动也没用,好像连ddk都坏了,无法再编译新的驱动,又不想用原来的ghost,重装系统,直到现在才回来,555555555555555 :(
|
|
|
地板#
发布于:2003-01-08 13:21
不知道你是怎么干的,代码发来,看看!
|
|
地下室#
发布于:2003-01-09 10:51
不要用其他函数,直接在设备管理里找到峡卡地址,循环写入即可。本人写过一个,可惜找不到了,是vxd驱动。思路代码都很简单。 老兄的意思是在设备管理器里找到内存范围然后直接写入?比如范围是0xf0000000-0xf7ffffff,那么就直接往0xf0000000写数据? 这样在vxd里可行,可是在win2000里呢?一定要用mmmapiospace的吧?然后呢? |
|
|
5楼#
发布于:2003-01-09 12:56
要进行转换。你可以做这个实验。在softice里把显卡地址转换成虚拟地址,然后直接编辑此段内存,在屏幕上就可以看到效果。不要告诉我你不不知道如何现实相邀的信息。
|
|
6楼#
发布于:2003-01-09 13:29
我早就做过这个试验了,所有的内存区域全都无效
|
|
|
7楼#
发布于:2003-01-09 19:58
你softice用得是否正确,这个实验我做了n次,屡试不爽,不知道您那里为什么不行。如果想我帮忙,把你用的softice的又命令都写下来。
|
|
8楼#
发布于:2003-01-09 20:15
如下:
显卡内存区域从0xf0000000开始 phys f0000000 bb1d0000 bbb95000 显示数据: d bb1d0000 d bbb95000 直接用0填满: f bb1d0000 L 100 0 f bbb95000 L 100 0 都写了256个字节的0 结果屏幕毫无变化,其他的几个内存地址也一样,是哪里用错了吗 |
|
|
9楼#
发布于:2003-01-10 13:06
你写的字结束太少了。256字节如果一像素4字节,就是64像素,如果分辨率是800*600的话,还不到1/8行。也就是你只写了1/8行长,1像素高的一个长方形,你看得见吗?把它改大一点就行了比如800*100*4即可。
|
|
10楼#
发布于:2003-01-10 13:44
问题不在这里,1/8行已经足够看清了。我写入过了更多的字节,一样没有效果
|
|
|
11楼#
发布于:2003-01-10 14:06
你了多少字节?
|
|
12楼#
发布于:2003-01-10 14:41
4000h(16384)字节,我想只要已经写进去的话,足够看到了。
|
|
|
13楼#
发布于:2003-01-10 14:50
老哥,你多写点,4000h不过几行,你写半屏幕。
|
|
14楼#
发布于:2003-01-10 15:04
我想这不是数量的问题了,如果我眼睛没问题,16k的黑色区域应该看到了
|
|
|
15楼#
发布于:2003-01-10 16:21
如果你没有错的话,你的电脑该轧着吃了。我现在已经在吐血了,我血如泉涌。
|
|
16楼#
发布于:2003-01-10 16:26
老兄,保重身体 :D
|
|
|
17楼#
发布于:2003-01-10 23:46
呵呵,你可以试着用这个办法::
1 . 调用 DirectDraw,创建DirectDraw Primary Surface. 2. Lock DirectDraw Primary Surface . 3. 返回的结构DIRECTDRAWSURFACEDESC 里面有一个lpsurface, 就是显存的开始(虚拟)地址。 4. 将这个地址传给驱动程序,调用 MmGetPhysicalAddress。 就可以得到物理地址了。 5 如果你需要得到一个核心态的虚拟地址的话,就要调用: MmProbeAndLockPages,MmMapLockedPages。 6 不使用了的时候 ,Unlock DirectDraw Primary Surface BTW: 至于用softice编辑,看不到屏幕变化的,是因为,屏幕不 一定从显卡的内存的起始地址开始的。另外,有的卡,有两个内 存区域,其中一个是用来访问显卡寄存器的,另外一个才是frame buffer,也有可能还有一个,是用来AGP访问的。其他的还可能有 用于标准VGA的。 |
|
18楼#
发布于:2003-01-11 08:36
谢谢,我没用过directdraw,可以简要给几行代码说明一下吗?
另外,如果每次都要调用directdraw的话,稍微有点麻烦,如果直接用设备管理器里的内存地址的话,应该怎样转化? 非常感谢 :) |
|
|