首页
社区
课程
招聘
Win32是如何将数据显示在显示器上呢?
发表于: 2011-3-13 16:09 7766

Win32是如何将数据显示在显示器上呢?

2011-3-13 16:09
7766
我们知道,在DOS时代,只要往内存单元0XB8000H写入数据,就能将写入的数据显示出来。在windows下,是如何实现的呢?这个过程是怎么样的?
还有,DPTR,LPTR这样的寄存器,为什么在OD下看不到?

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
免费 0
支持
分享
最新回复 (13)
雪    币: 31
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
32位操作系统是图形界面的操作系统,使用图形设备接口(GDI),负责在视频显示器上显示图形。包括用户的输入显示,和系统本身也使用它来显示。
主要由GDI32.DLL动态链接库输出的函数来处理。
2011-3-20 11:31
0
雪    币: 1240
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
0XB8000H,呵呵,竟然还有人记得直接写屏技术……
在windows下是不能这么做的,因为所有的内存都处于保护状态,中断向量表、显示内存等在DOS时代随便玩的东西,在Windows下你都是摸不到的。

这样的好处很明显,硬件无关性。开发软件的人不必再关心用户显卡的牌子或支持哪些分辨率(在DOS时代搞图形界面的话这些都是要知道的),GUI和DirectX已经帮你包办掉了一切,你所要做的,只是对API函数操作就行了。
2011-3-20 12:32
0
雪    币: 30
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
这样做有利也有弊啊,有利方面是大大缩短了程序开发的周期,弊的方面是从此程序员就不了解程序底层的运作机理了,除非是自学相关方面的知识。
2011-3-20 16:21
0
雪    币: 1240
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
个人觉得是利大于弊

就拿楼主所说的DOS下的直接写屏来说吧,0XB8000H是有条件的,如果你是彩色显卡,并工作在25行X80列的显示模式下,才是0XB8000H这个地址,而VGA支持的显示模式,远不止这一种,那程序员必须了解每一种模式下的写屏起始地址,如果用户的显卡是黑白的,又是另一个地址了。
以上说的还只是文字模式,在图形模式下,大家的显卡、分辨率千差万别,让程序员了解这些?杀了他吧!

所谓术业有专攻,这是技术进步后必然的结果,让了解硬件的人写驱动,程序员只要知道API函数就够了。
2011-3-21 00:44
0
雪    币: 93
活跃值: (42)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
是的,封装起来安全性就好多了~~~
我也不去直接写显存,只是想了解一下windows的在显示方面的原始机制与原理
至少,操作系统是自己去写显存的.....
那请问大家,抛开gdi这样的抽象概念,从底层来说,操作系统是怎么样进行这样一个过程呢?
2011-3-21 09:33
0
雪    币: 38
活跃值: (52)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
7
从底层来说,操作系统把字体以点阵方式排布,转化为像素显示在显示器上。
2011-3-22 18:08
0
雪    币: 1240
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
抛开gdi这样的抽象概念,从底层来说,操作系统是怎么样进行这样一个过程呢?

操作系统管不了这么底层的事,最多管到点阵,然后交给显卡驱动,显卡驱动操作显卡,编辑显存
这个机制很复杂,不用多管,也管不了。
在DOS下,哪怕是简单地在屏幕上显示一个字母,对应的底层代码就要几十页。
2011-3-23 14:55
0
雪    币: 93
活跃值: (42)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
从硬件上理解,cpu和显卡通信也是要寻址的,这些“工作”我们反汇编后都应该能看到啊!
那显卡的地址是多少?找到这个地址,也就能进一步理解反编译的程序了
2011-3-24 18:23
0
雪    币: 1240
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
这部分工作是交给显卡驱动的,不同的驱动会有不同的做法,N卡和A卡的机制也不同,没有标准答案
2011-3-24 20:31
0
雪    币: 143
活跃值: (61)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
11
XP为了它的安全、稳定性,把这些内存地址给改了(它并不希望你找到并修改,这样很容易出错)。

如果你想显示什么在桌面,看看下面的代码(C/C++):
int main()
{
char Text[] = "这样就能在屏幕上显示文字啦^_^";
HWND Desk = GetDesktopWindow();
HDC DeskDC = GetWindowDC(Desk);
while(true)
{
TextOutA(DeskDC, 0, 0, Text, sizeof(Text));
Sleep(1000);
}
return 0;
}
2011-3-27 14:48
0
雪    币: 93
活跃值: (42)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
[QUOTE=weizehua;940847]XP为了它的安全、稳定性,把这些内存地址给改了(它并不希望你找到并修改,这样很容易出错)。

如果你想显示什么在桌面,看看下面的代码(C/C++):

int main()
{
char Text[] = "这样就能在屏幕上显示文字啦^_^";
HWND Desk = GetDe...[/QUOTE]

对于windows的这种做法,我想大家都是不乐意的。
有没有人能把地址找出来?
如果能把MS这套思路摸透,加之图像处理与理解技术,我想,一个新的时代即将来临!
2011-3-28 08:45
0
雪    币: 122
活跃值: (46)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
13
我觉得哈其实现与dos的底层实现也相差无几,只是dos的要我们去做,而在windows中我们不用去管他,交给操作系统来做的!比如你别看那些任务调度多高级,最后还是用中断来实现的!所以再复杂的底层也是相同的原理吧!
2011-3-28 09:26
0
雪    币: 93
活跃值: (42)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
是的,只要我们了解这个基本原理,就能掌控整个过程
2011-3-28 10:40
0
游客
登录 | 注册 方可回帖
返回
//