Windows 体系结构
在进入驱动开发之前,我们首先来了解一下Windows体系结构
Windows体系结构如上图所示:
注意区分用户模式和内核模式,用户模式线程执行在私有地址空间(内核模式代码直接共享整个地址空间,但用户线程可以提供特殊CPU指令来切换到内核模式用以访问系统空间),系统进程、服务进程、用户进程和子系统进程都有各自的私有地址空间,内核模式和hyper v之间的分界线也清晰可见,严格说,hyperv以相同的CPU特权级别运行(ring0)作为内核,但实际上hyperv因为使用了专门的CPU指令(vt-x/svm)可以将自己和内核相隔离并监控它。
- 用户进程:这是一个基于映像文件的普通进程,比如vscode.exe,cmd.exe,explore.exe等
- 服务进程:和上面用户进程最大区别就是不和用户交互,由服务控制管理器(SCM,在services.exe中实现)进行通信,并控制生命周期,可以在运行框中输入service.msc打开查看,比如我们最常见的Windows update 服务。我们可以使用sc create 去手动创建一个服务,sc start/stop去启动、关闭服务。格式如下:
sc [<ServerName>] create [<ServiceName>] [type= {own | share | kernel | filesys | rec | interact type= {own | share}}] [start= {boot | system | auto | demand | disabled}] [error= {normal | severe | critical | ignore}] [binpath= <BinaryPathName>]
注意这里的type,我们后面将会kernel这个type来运行内核驱动程序
- 系统进程:系统进程也不和用户交互,和上面最大区别是它不受服务控制管理器控制,他们对于系统非常重要,并只使用原生API(由NTDLL实现的API),比如,Service.exe,smss.exe(会话管理器),在这一级里。这些exe都将归系统所有而不是用户,这点可以打开任务管理器的详细信息看到。
- 子系统DLL:是实现子系统的API的dll,windows NT内核在最初发布时候是有三个不同环境的子系统,分别是Windows、posix和os/2,然而现在只剩下了一个(Linux子系统和安卓子系统在这里不算),子系统DLL包括众所周知的文件,比如kernel32.dll、user32.dll、gdi32.dll、advapi32.dll、combase.dll等。这些DLL包含了大部分官方公开的Windows API。
- 子系统进程:也叫 environment subsystems。Windows子系统的映像文件是Csrss.exe,可以视为一个助手进程,帮助内核对window系统中运行的进程管理,通常每个会话都有一个csrss.exe的实例,所以一般系统可以看到是有2个Csrss.exe在运行,一个对应对应会话0,一个对应用户登录的会话1。
- NtDLL:实现了Windows原生Api,这是用户模式代码的底层。它最重要的作用是为系统调用提供到内核模式的转换。NTDLL也实现了堆管理、映像加载以及部分用户模式线程池功能.
- 执行体:位于NtosKernel.exe中,包含大部分内核代码,比如内存管理器、IO管理器、网络管理器等。
- 设备驱动:是可转载的内核模块,包含硬件设备驱动,文件系统、网络驱动这种软件驱动,其中硬件设备驱动是将用户的IO函数调用转换到特定的硬件设备IO请求
- 内核:是最底层的实现,包含线程调度、中断和异常分发和多处理器同步,并提供原语和对象供执行体使用完成高级功能。
- Win32k.sys:也可以称之为GUI,包含用户交互和GDI两个部分,本质是一个内核驱动
- HAL:硬件抽象层,主要是把上面提到的内核组件和与平台无关的差异隔绝开来
- HyperV虚拟机管理器:也称hypervisor,它实际只由它自己组成,没有驱动程序和其他模块在这个环境中,也就是说,hypervisor本身由以下组成,比如它自己的内存管理器,虚拟处理器调度器、中断和定时器管理、同步原语、分区(虚拟机实例)管理和分区间通信(IPC)等,因为它在最下面,所以当我们电脑实际打开hyper v后,guest和host都是运行在虚拟机环境中,与之类似的是,如果开启Windows的内核安全隔离,它实际就是利用hyper v技术来做到安全性。
下面是一些Windows核心组成的文件名
-
NtosKrnl.dll:执行体和内核 Hal.dll:HAL硬件抽象层
-
win32k.sys:GUI(Windows子系统的内核部分)
-
Hvix64.exe(intel)、Hvax64.exe(amd): Hypervisor
-
后缀sys文件 in C:\Windows\System32\drivers:核心驱动文件,比如DX,TCP/IP,TPM,ACPI 支持
-
Ntdll.dll:内部功能实现系统服务分发给内核的执行体
-
Kernel32.dll、Advapi32.dll、User32.dll、GDI32.dll:Windows子系统核心DLL