引子

WRK 是微软于 2006 年针对教育和学术界开放的 Windows 内核的部分源码,

WRKWindows Research Kernel也就是 Windows 研究内核,

在 WRK 中不仅仅只提供了 Windows 内核模块的部分代码,其还提供了编译工具,

也就是通过这个编译工具,你可以将你的 WRK 编译成一个 EXE 文件,

也就是内核可执行模块,然后你可以利用这个 EXE 文件来取代操作系统本身的内核,

这样的话,下次开机的时候操作系统所加载的内核就是您编译的那个 EXE 了。

工具软件

Intel   x86  CPU

VMware  6.5

Windows  Server  2003  SP1(用于测试 WRK 编译结果);

Windows  7(用来编译 WRK);

WRK  1.2 ;             

概览 WRK

首先我们来找到当前 Windows 操作系统下的内核模块文件,

所谓的内核模块文件呢,其实就可以看做是 Windows  的内核,

其由执行体和微内核组成,该文件名为 ntoskrnl.exe ,即一个二进制模块,

该文件位于:C:\Windows\System32

而我们的 WRK 编译后所得的结果应该也是一个内核模块文件,

也就是说我们编译所得的结果应该就是这个 ntoskrnl.exe 

当然编译后的名称是可以不同的,

默认编译所得为 wrkx86.exe (这是 x86 环境下的默认编译结果名称)

下面来分析 WRK 中目录结构:

首先来看   WS03SP1HALS  目录:

WS03SP1HALS 代表的意思即 Windows  Server  2003  SP1  HALS

也就是在 Windows  Server  2003  SP1  下的  HAL (硬件抽象层)

在 Windows 操作系统中,HAL 其实是一个独立的  DLL (在这里你就可以简单的将 HAL 看做一个 DLL 

通过 HAL 可以实现隔离掉硬件的差异,也就是上层的模块无需考虑下层真实硬件之间的差异性,

因为上层模块不能够直接访问硬件,而是通过 HAL 来访问硬件的,

所以对于硬件的差异性,在 HAL 中即可以解决掉,而不需要上层模块来解决,

这样做的好处是很显然的,那就是我们的上层模块都是一样的,也就是当硬件改动时不需要变,

只要提供针对不同的硬件的 HAL 即可以实现在不同的硬件上运转我们的上层模块。

由于我们的 PC 上的硬件不一致,所以必须有多个 HAL 。

比如我的 PC  的处理器为  Intel 的,而你的 PC 的处理器为 AMD 的,

我的处理器为单核的,而你的处理器为四核的,

那么这就会造成硬件上的不一致,为了解决这种不一致呢,

Windows 在打包的时候会打包多个 HAL 进来,比如一个 HAL 针对单核,一个 HAL 针对多核,

Windows 在安装的时候就会自动的识别出你的处理器是 AMD 还是 Intel ,是多核还是单核处理器,

然后 Windows 就会自动选择一个合适的 HAL  给你安装,同时,将 HAL 名字修改为 HAL.DLL

而在 WS03SP1HALS 目录下的也就是这些个 HAL 

比如我的 PC 的处理器为 Intel  x86 系列的双核处理器,

自然在安装 Windows 的时候,就会自动选择合适的 HAL ,比如 halmps.dll 作为 HAL 

然后在安装 Windows 的时候将这个 HAL 复制进我的 盘指定目录下后,

就将这个 halmps.dll 改名为 hal.dll(为了统一所以改名)

这样就可以得到我们下面看到的在 C:\Windows\System32\hal.dll 了。

再来看   Public   目录:

在这个目录下包含的是一些头文件,也就是 .h 文件,而且这些文件都是被各个组件所共享使用的,也就是公用的,

其中含有 ddk internal 等等,其中 internal 表示为内部使用的,也就是内核自身需要使用到的头文件。

再来看   Tools   目录:

前面提到,WRK 中不仅仅包含了微软公开的关于 Windows 内核的部分源代码,

还包括了用来编译这部分源代码的工具,而这些编译工具自然就在这个 Tools 目录下了。

在后面我们编译这个 WRK 源代码的时候就会用到这个 Tools 目录下的工具了。

最后看   Base   目录,其中 Base 目录下的 ntos 目录为 Windows 内核模块的主目录:

下面就来逐一的介绍这些个目录中的文件的含义:

build

WRK 只公开了部分源代码,那些未公开的则以二进制目标代码的形式存在于这个目录下。

cache

缓存管理器的实现的源文件。

config

注册表的实现的源文件。

dbgk

调试子系统的内核模式部分的源文件。

ex

执行体层函数(内核堆 , 同步 , 定时器等)的源文件。

fsrtl

文件系统运行库的源文件。

fstub

文件系统引导接口。

io

I/O 管理器,不包括即插即用管理器和电源管理器部分。

ke

(微)内核,包括线程调度器,CPU 管理以及底层的同步语义

lpc

本地过程调用 (LPC) 机制的实现。

mm

内存管理器。

ob

内核对象管理器。

perf

内核的性能日志记录功能。

ps

进程和线程。

se

安全引用监视器。

wmi

Windows 管理规范。

inc

仅适用于 NTOS 部分的包含文件。

raw

RAW 文件系统驱动程序的实现的源文件。

rtl

内核运行时库支持。

init

内核启动部分的代码。

vdm

虚拟 DOS 机。

verifier

驱动程序检验器。

编译 WRK

首先是设置 WRK 根目录下的 Tools 子目录中的 x86 子目录到  Path 环境变量中,

首先在控制台下进入到 WRK 根目录下的 Base 目录下的 Ntos 目录下,

然后输入命令:nmake  –nologo  x86= 

(如果是 AMD CPU 的话命令会有所不同,而且环境变量的设置也不同)

然后就开始编译整个 WRK 了。

编译完成:

此时就可以在目录WRK-v1.2\base\ntos\build 下面找到编译好的 EXE 文件了。

至此编译完成。

加载 WRK 编译所得的内核模块

前面我们已经由 WRK 编译得到了内核可执行模块,

下面我们就要让操作系统启动的时候加载上编译所得的这个内核可执行模块。

我们使用的环境是在 VMware 6.5 中安装好 Windows  Server  2003  SP1

首先,我们将由 WRK 编译所得的 wrkx86.exe 拷贝到虚拟机中,

并且将这个文件放置到目录(也就是 ntoskrnl.exe 所在目录):

然后再在其系统安装目录下(一般为 C: 盘)下面找到  boot.ini  文件(默认为隐藏)。

首先需要将这个文件的只读属性去掉,即将该文件改为可读写文件,

然后用记事本打开这个  boot.ini  文件

修改前的 boot.ini 文件:

再在 boot.ini 中添加如下行:

multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Windows Server 2003, WRK" /kernel=wrkx86.exe /hal=hal.dll

修改后的 boot.ini 文件:

将上面的都设置好以后就重新启动 Windows  Server  2003  SP1

然后在启动画面中即可以看到如下画面:

我们选择 Windows  Server  2003 WRK  启动 Windows  操作系统,

这样加载内核可执行模块的就是我们由 WRK 编译所得的那个 wrkx86.exe 了。

Windows 内核(WRK)编译相关推荐

  1. Windows 内核(WRK)简介

    引子 WRK 是微软于 2006 年针对教育和学术界开放的 Windows 内核的部分源码, WRK(Windows Research Kernel)也就是 Windows 研究内核, 在 WRK 中 ...

  2. 一起谈.NET技术,Windows 内核(WRK)简介

    引子 WRK 是微软于 2006 年针对教育和学术界开放的 Windows 内核的部分源码,WRK(Windows Research Kernel)也就是 Windows 研究内核,在 WRK 中不仅 ...

  3. windows下编译linux内核,windows上可编译Linux内核

    编译过程: 1). 解压后默认的文件夹位置是在D:\Linux-0.11,如果你不是将文件解压到该目录下, 你要修改MinGW32目录下的MinGW32.bat文件,将里面的PATH指向MinGW32 ...

  4. Windows内核执行体对象管理器的操作过程与分析

    我之前写过一个有关于对象管理的读书笔记.但是这篇文章与前面的不同,这是我个人对对象管理器到底是什么的一个分析,而且也是直接对WRK代码进行的阅读. 执行体对象即我们通常所言的内核对象,我们知道Wind ...

  5. Windows内核函数的命名

    <Windows内核情景分析--采用开源代码ReactOS(上.下册)>本书通过分析ReactOS的源代码介绍了Windows内核各个方面的结构.功能.算法与具体实现.本小节为大家介绍Wi ...

  6. Windows内核 基本汇编指令

    1)用VS2010新建Win32 Console Application,工程名为ACECore,工程建立完成后得到打开文件ACECore.cpp,代码如下: #include "stdaf ...

  7. 在 Windows 内核上运行 Docker 靠谱吗?专家六问六答帮你解惑!

    本文首发自"Docker公司"公众号(ID:docker-cn) 编译丨小东 每周一.三.五 与您不见不散! 上周三,我们为大家带来了新一期的网络研讨会--不改代码!看 Dock ...

  8. windows 内核情景分析

    原文很长:先转部分过来,有时间看一下: 一 windows 内核情景分析---说明 说明 本文结合<Windows内核情景分析>(毛德操著).<软件调试>(张银奎著).< ...

  9. Windows内核系统调用分析

    系统调用 进程 --> 调用OS API:OS进程管理 --> 调配进程. 仅从用户进程角度,OS就像是一个被动响应的运行时库.Windows提供了一个系统调用界面作为外层,即Win32A ...

最新文章

  1. 深度学习最常用的10个激活函数
  2. 某程序员感叹:本是家族边缘人,但亲戚得知自己年入二百万后,都上来巴结!...
  3. memcached在windows下的基本使用方法
  4. mongodb 3.2配置内存缓存大小为MB/MongoDB 3.x内存限制配置
  5. 如何转移主机之间Docker镜像
  6. junit-4.9.jar_JUnit 4.9(测试版3)中的规则
  7. CompletableFuture详解~thenApply
  8. Timeline中让你事半功倍的工具链
  9. 用python实现接口测试(八、实现序列化与反序列化)
  10. 输入框值不能赋值成功
  11. Vue ---- 指令
  12. easyBCD多系统引导软件
  13. Kali [masscan]端口扫描
  14. 大数据Top K问题
  15. 新一代XSS平台(送邀请码)
  16. 洛谷——P1957 口算练习题
  17. 苗圩:5G技术将八成用于移动物联网 年内适时发放5G牌照
  18. Mac OS 名称问题及修改方法(修改终端中显示的hostname(主机名称) / 电脑名称 / 管理员名称 / LocalHostName(本地主机名称))
  19. 男人很容易喜欢一个女人,却不轻易深爱一个女人。
  20. C语言期末设计不在是千篇一律的学生管理系统,新题设值教师工作量管理系统(数组)。

热门文章

  1. iOS9及以下的自带词典无法下载问题的解决方法
  2. 拿走不谢,数据可视化地图制作教程
  3. Hive函数与文件格式
  4. Python Flask MongoDB Web开发:前 言
  5. 变革模式:十室之邑必有忠信,堂堂全浙岂无材勇?
  6. 【毕业季】我们的时光,是最好的时光
  7. 2D动作游戏开发与实现(翻译)
  8. 李学克心录:被问了无数遍的 怎样才能更快变现的途径
  9. 织梦excel导入mysql_织梦dedecms excel导入mysql数据库方法
  10. Android 视频 短视频录制预览尺寸(简单几款机型测试)