背景介绍

这次说的开机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绘图相关推荐

  1. windows开机进入grub解决方案 (无easyUEFI删除Linux启动项)

    windows开机进入grub解决方案 (无easyUEFI删除Linux启动项) 之前装了windows 10 + ubuntu 21.04双系统,后面在windows下面使用磁盘管理删除了ubun ...

  2. python错了怎么修改密码_如何用python更改windows开机密码?

    虽然2018年的愚人节已经过去了,但是我们的乐趣每天都不能少,尤其是高级的.这不刚get到还可以用python来更改小伙伴的windows开机密码,赶紧去试了一遍,就来分享给大家,接着吧: 今天教大家 ...

  3. 【转载】MongoDB安装并随windows开机自启

    MongoDB安装并随windows开机自启 MongoDB的官方下载站是http://www.mongodb.org/downloads,可以去上面下载最新的程序下来.在下载页面可以看到,对操作系统 ...

  4. html 启动bat脚本,Windows开机自启动bat脚本设置方法

    摘要 腾兴网为您分享:Windows开机自启动bat脚本设置方法,小睡眠,小书亭,托迈酷客,土豆等软件知识,以及显卡加亮,团购宝,多和梦,pdf编辑器,杭州地铁线路图,宝宝拼图游戏,蠕虫病毒专杀工具, ...

  5. 详解Windows开机自动运行

    详解Windows开机自动运行 一.经典的启动--"启动"文件夹 单击"开始→程序",你会发现一个"启动"菜单,这就是最经典的Windows ...

  6. windows开机出现GNU GRUB黑屏解决方法记录

    windows开机出现GNU GRUB黑屏解决方法记录 电脑情况 我的电脑是组装机,系统为WIN10+UBUNTU16.04, 一块240G固态,一块750G机械硬盘.固态平分为两部分,各120G安装 ...

  7. windows开机的问题

    问题 XP进去启动不了桌面,一登陆桌面后,除了显示背景图片外,我的电脑,我的方档等下方的任务栏都不能显示,只有背景图片和鼠标,通过CTRL+ALT+DEL注销后才能正常登陆,并且已经重新杀了毒,一切正 ...

  8. Windows开机无法进入bios模式怎么处理

    Windows开机无法进入bios模式怎么处理 方法:关闭[快速启动] 原因:windows默认开启了[快速启动],会导致会导致笔记本开机过快,无法进入bios. ##[快速启动]原理:关机时 Win ...

  9. windows开机密码问题

    问:我的电脑用的是XP系统设且置了XP登录密码,但有的人不用问我密码就能打开我的电脑,而且密码没有取消也没有更改,我再开机的时候还是得输入我的登录密码才能进入系统,请问他们是怎么做到的,谢谢. 答:由 ...

最新文章

  1. halcon与c#联合编程的方法
  2. 访问web服务器--网络实验
  3. Python入门学习之异常处理机制
  4. Boost:使用 type <>语法测试功能
  5. 一个好的设计师_是什么让一个好的设计师
  6. 虚拟机centos7 桥接模式
  7. 前端基础-html-表格的标题和表头单元格标签
  8. (入门级小项目)JSP编程+web项目发布到Tomcat+mysql数据库
  9. python cut函数_一天学会Python Web框架(七)工具函数
  10. 现在有些公众号我真的看不惯
  11. 2017CV技术报告:从3D物体重建到人体姿态估计
  12. SQLyog 安装教程
  13. 机器学习十大算法都是何方神圣?看完你就懂了
  14. 多个PDF合并后页面大小不一
  15. 在计算机中用于实现域名和IP地址转换的是,internet中用于实现域名和ip地址转换的是什么...
  16. 如何快速部署企业私有云存储
  17. 【话题:工作生活】2021年工作总结--这些人,那些事。
  18. GitHub上Java捕鱼达人源码分析(fishlord)
  19. Python-自学爬虫篇
  20. Python和VizViewer进行自动驾驶数据集可视化

热门文章

  1. xp系统打开计算机硬盘分区,xp硬盘怎么分区?xp系统对硬盘进行分区的方法
  2. 商业地产拓展市场调查报告内容及格式
  3. 陪领导参加饭局,懂2个座次5道程序3套话术,不会喝酒也受重用
  4. phpcms 文章一键排版
  5. 精灵图专用 快速定位网站
  6. Words From the Wise——AQR公司对Ed Thorp的采访(一)
  7. 测试必备知识,性能测试入门学习
  8. 打开unity虚拟轴。
  9. 百炼2964 日历问题
  10. python爬虫——爬取古诗词