Windows 开机BOOT绘图
背景介绍
这次说的开机BOOT绘图,是在哪个阶段呢?时间起点:Windows内核正在初始化,内建驱动初始化完毕。时间终点:会话管理器加载win32.sys,启动winlogon进入系统。
给两个图:
前者是Windows自身的开机LOGO图,后者是运行时机是在autochk.exe运行的时候,江民在这里类似的做了自己的应用BootScan。把应用写在这里的好处是什么呢?
这个时候用户程序除了Boot与System类型的驱动,其它的都还没有机会运行。几乎没有文件句柄的干扰。
上面江民做界面比较粗糙,再看一张图:
这是分区助手在调整系统磁盘分区的界面,运行时机也是一样的。在这个时候做分区调整最合适。不过它做的更好看一些,一会我们慢慢来分析。
从上层一直向下分析,最简单这个就是BootScan它使用的与autochk.exe相同的界面。这个时候写的程序都叫Native程序,3环但可依赖的只有ntdll.dll。autochk.exe是通过设置注册表项:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SessionManager\ 值名为BootExecute。这是一个多值字符串的项,加进去的程序启动路径和参数。在内核初始化成之后,第一个启动的就是会话管理器smss.exe(第一个三环进程),它会读取这个注册表键值,按顺序启动。需要注意的一点是尽管这是3环的程序,只要崩溃,也会蓝屏。
通过对autochk.exe代码的分析发现,它们输出文字使用的是NtDisplayString.在三环也就只有这么一个能用有用的函数。而且只能输出英文。这也是为什么之前江民的BootScan界面做的如此粗糙的原因。
那么分区助手是怎么做的呢?把大背景换了,还有进度条,还有文字想显示在哪就可以显示在哪?不象上面autochk.exe那个就是一个蓝色的控制台。分区小助手还自带一系统启动的驱动,功能很简单只是做了3环到0环的通信把内核的函数调用了一下。NTKRLOS.exe导出了一系列的绘图函数。Inbv系列的函数:
InbvDisplayString显示字符串,还带有坐标(其中NtDisplayString就是调用的它)。
InbvSetScrollRegion设置滚动区域(autochk那个控制台是用这个来实现的)。
InbvSetTextColor设置字体颜色。
InbvSolidColorFill填充实体颜色,说白了画一实体色的矩形,有坐标信息。
通过以上几个函数,特别是这个矩形的,都可以完成。有一点不友好的是,不对三环导出,所以只能写一个驱动做转发。细心的同学会发现,分区助手里面的图形好简单呀,我想画一个圆呢?还有Windows开机那个多帅呀!
在Inbv系列的导出函数中能用的没几个了,但是在非导出函数中有InbvBitBlt可以把一位图贴到指定的坐标矩形中。只有这些了想要做透明效果的只能自己做位图运算了。
一起看看Windows的开机画面是怎么做到的, 在开机过程中ntoskrl.exe调用DisplayBootBitmap来显示开机画面。它是找自己的资源位图(类似于FindResource...),然后InbvBitBlt出来。
windows的开机效果就是这么来的。
这样应该能明白了,但是还是会有不甘心的同学会问,Inbv系列的函数到底是怎么搞到屏幕上去的?
可见Inbv系列的函数会调用到Vid系列的函数,而Vid系列的函数呢?是bootvid.dll,这个模块才提供最终的屏幕绘制操作。
看一下VidSolidColorFill的实现:
整个逻辑其实不少,以上只是一个片段。不过能看到具体操作,用一段内存来放显示数据:VgaBase表示显存的首地址..,只要把相应的数据写到这段内存就显示出来了。其中___imp_WRITE_REGISTER_UCHAR的实现只是一个加lock的内存读写操作。
如果大家再问为什么写到这个内存里屏幕就显示出来了呢?大家需要去了解APCI总线了,硬件就是这么设计的。
总结:
三环NTDLL导出接口:
1. NtDisplayString
只能输出字符串,位置在设定好的滚动区里
内核ntoskrl.exe导出的接口:
1. InbvAcquireDisplayOwnership
2. InbvCheckDisplayOwnership
3. InbvDisplayString
4. InbvEnableBootDriver
5. InbvEnableDisplayString
6. InbvInstallDisplayStringFilter
7. InbvIsBootDriverInstalled
8. InbvNotifyDisplayOwnershipLost
9. InbvResetDisplay
10. InbvSetScrollRegion
11. InbvSetTextColor
12. InbvSolidColorFill
13. InitSafeBootMode
内核导出的只能做简单绘图,像分区助手一样,类似DOS下面的带单纯颜色的矩形框,还有带颜色的文字。另外坐标可以自定义。
能继续深挖到的接口---Ntoskrl.exe内部的函数还有一个InbvBitBlt可以把Bitmap绘到屏幕上去,使用的是Bootvid.dll里的导出函数VidBitBlt,就像WindowsXp带滚动条的开机界面。
限制:
Bitmap是以资源形式的,最高质量为16位,屏幕分辨率只能为480*640。
Windows 开机BOOT绘图相关推荐
- windows开机进入grub解决方案 (无easyUEFI删除Linux启动项)
windows开机进入grub解决方案 (无easyUEFI删除Linux启动项) 之前装了windows 10 + ubuntu 21.04双系统,后面在windows下面使用磁盘管理删除了ubun ...
- python错了怎么修改密码_如何用python更改windows开机密码?
虽然2018年的愚人节已经过去了,但是我们的乐趣每天都不能少,尤其是高级的.这不刚get到还可以用python来更改小伙伴的windows开机密码,赶紧去试了一遍,就来分享给大家,接着吧: 今天教大家 ...
- 【转载】MongoDB安装并随windows开机自启
MongoDB安装并随windows开机自启 MongoDB的官方下载站是http://www.mongodb.org/downloads,可以去上面下载最新的程序下来.在下载页面可以看到,对操作系统 ...
- html 启动bat脚本,Windows开机自启动bat脚本设置方法
摘要 腾兴网为您分享:Windows开机自启动bat脚本设置方法,小睡眠,小书亭,托迈酷客,土豆等软件知识,以及显卡加亮,团购宝,多和梦,pdf编辑器,杭州地铁线路图,宝宝拼图游戏,蠕虫病毒专杀工具, ...
- 详解Windows开机自动运行
详解Windows开机自动运行 一.经典的启动--"启动"文件夹 单击"开始→程序",你会发现一个"启动"菜单,这就是最经典的Windows ...
- windows开机出现GNU GRUB黑屏解决方法记录
windows开机出现GNU GRUB黑屏解决方法记录 电脑情况 我的电脑是组装机,系统为WIN10+UBUNTU16.04, 一块240G固态,一块750G机械硬盘.固态平分为两部分,各120G安装 ...
- windows开机的问题
问题 XP进去启动不了桌面,一登陆桌面后,除了显示背景图片外,我的电脑,我的方档等下方的任务栏都不能显示,只有背景图片和鼠标,通过CTRL+ALT+DEL注销后才能正常登陆,并且已经重新杀了毒,一切正 ...
- Windows开机无法进入bios模式怎么处理
Windows开机无法进入bios模式怎么处理 方法:关闭[快速启动] 原因:windows默认开启了[快速启动],会导致会导致笔记本开机过快,无法进入bios. ##[快速启动]原理:关机时 Win ...
- windows开机密码问题
问:我的电脑用的是XP系统设且置了XP登录密码,但有的人不用问我密码就能打开我的电脑,而且密码没有取消也没有更改,我再开机的时候还是得输入我的登录密码才能进入系统,请问他们是怎么做到的,谢谢. 答:由 ...
最新文章
- halcon与c#联合编程的方法
- 访问web服务器--网络实验
- Python入门学习之异常处理机制
- Boost:使用 type <>语法测试功能
- 一个好的设计师_是什么让一个好的设计师
- 虚拟机centos7 桥接模式
- 前端基础-html-表格的标题和表头单元格标签
- (入门级小项目)JSP编程+web项目发布到Tomcat+mysql数据库
- python cut函数_一天学会Python Web框架(七)工具函数
- 现在有些公众号我真的看不惯
- 2017CV技术报告:从3D物体重建到人体姿态估计
- SQLyog 安装教程
- 机器学习十大算法都是何方神圣?看完你就懂了
- 多个PDF合并后页面大小不一
- 在计算机中用于实现域名和IP地址转换的是,internet中用于实现域名和ip地址转换的是什么...
- 如何快速部署企业私有云存储
- 【话题:工作生活】2021年工作总结--这些人,那些事。
- GitHub上Java捕鱼达人源码分析(fishlord)
- Python-自学爬虫篇
- Python和VizViewer进行自动驾驶数据集可视化