首页 > 代码库 > Windows系统结构

Windows系统结构

四种用户模式进程:
1.系统支持进程,比如登录进程和会话管理器,并不是Windows服务,不有服务控制管理器启动
2.服务进程,一些以Windows服务方式来运行的组件
3.用户应用进程
4.环境子系统服务器进程,实现了操作系统环境的支持部分,这里的环境是指操作系统展示给用户
或者程序员的个性化部分,三个子系统:Windows、POSIX和OS/2。(可以从PE文件中的subsystem成
员中读取出该应用程序运行的子系统)

Windows内核模式组件
1.Windows执行体,包含了基本的操作系统服务,比如内存管理、进程和线程管理、安全性、IO、
网络和跨进程通信
2.Windows内核,由一组低层次的操作系统功能构成的,如线程调度、中断和异常分发,以及多处
理器同步
3.设备驱动程序,包括硬件设备驱动程序,也包括文件系统和网络驱动程序
4.硬件抽象层HAL,一层特殊的代码,把内核、设备驱动程序和Windows执行体的其余部分,跟与平
台相关的硬件差异隔离开来
5.窗口和图形系统,实现了GUI函数(也就是Windows USER和GDI函数),比如窗口的处理、用户界面
控件以及绘制等

Windows核心系统文件

Ntoskrnl.exe 执行体和内核
Ntkrnlpa.exe 执行体和内核,支持物理地址扩展PAE
Hal.dll 硬件抽象层
win32k.sys Windows子系统的内核模式部分
ntdll.dll 内部支持函数,以及执行体函数的系统服务分发存根(stub)

Kernel32.dll
Advapi32.dll
User32.dll Windows的核心子系统dll
Gdi32.dll

HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\SubSystems中存储了子系统信息
Require列出了当系统引导时加载的子系统,Windows和Debug。Windows值为Csrss.exe,它代表了
客户/服务器运行时子系统,包含了Windows子系统的文件规范。Kmode值为win32k.sys,是Windows
子系统内核模式部分的文件名。

环境子系统角色是,将Windows基本系统服务的部分子集暴露给应用程序。每个子系统都提供了对
于Windows原生服务不同部分的访问能力。

每一个可执行文件都被绑定到一个且唯一一个子系统上。当一个映像文件被运行时,创建进程的代
码会检查映像头部的子系统类型代码,所以他可以通知正确的子系统有新的进程被创建了。

用户应用程序并不直接调用Windows系统服务,相反,他们通过一个或多个子系统DLL来进行。
子系统DLL的角色是将一个已文档化的函数转化为一些恰当的内部(通常是未文档化的)Windows系统
服务调用。这些转化可能会也可能不会向正在为用户应用程序提供服务的环境子系统发送一个消息

当一个应用程序调用子系统DLL中的函数是,可能会发生以下情况
1.该函数完全在该子系统DLL中实现,在用户模式下运行,运行结果被返回给调用者,不会向环境
子系统进程发送消息,而且并没有调用Windows执行体的系统服务。
2.该函数要求调用Windows执行体一次或者多次。
3.该函数要求在环境子系统进程中完成某些工作(环境子系统进程运行在用户模式下,负责维护那
些在其控制下运行的客户应用程序的状态)。在此情况下,该函数以消息的形式给环境子系统发送
一个C/S请求,从而让环境子系统执行某个操作,然后子系统DLL等待应答,将应答返回给调用者。
CreateProcess和CreateThread是第二和第三的结合

Windows子系统的组成
1.环境子系统进程Csrss.exe,包含以下支持
(1)控制台窗口
(2)创建或删除进程和线程
(3)对16位虚拟DOS机的一部分支持
(4)其他一些函数
2.内核模式设备驱动程序(Win32k.sys),包含
(1)窗口管理器,控制窗口显示,管理屏幕输出,采集键盘、鼠标和其他设备的输入,负责将用户
的消息传递给应用程序
(2)图形设备接口GDI,专门针对图形输出设备的函数库,包括线条、文本和图形的绘制函数,以及
绘图控制函数
3.子系统DLL,如Kernel32.dll,Advapi32.dll,User32.dll,Gdi32.dll。他们将已经文档化的
Windows API函数,翻译成Ntoskrnl.exe和Win32k.sys中恰当且为文档化的内核模式系统服务调用
4.图形设备驱动程序是指与硬件相关的图形显示器驱动程序、打印机驱动程序和视频微端口驱动程

Ntdll.dll
是一个特殊的系统支持库,主要用于子系统DLL,包含两种类型函数
1.系统服务分发存根(stub),他们会调用Windows执行体服务
2.系统支持函数,供子系统、子系统DLL和其他的原生映像文件使用
第一组函数为Windows执行体系统服务提供了接口,在用户模式下可以通过这些接口函数调用
Windows执行体的系统服务,如NtCreateFile,这些函数大多数的功能可以通过WindowsAPI来访问
得到。
对于每一个这样的函数,Ntdll包含了一个同名的入口点。函数内部的代码包含了与处理器体系结
构相关的模式切换指令,通过该指令可以切换到内核模式下,从而调用了系统服务分发器。分发器
在检查了某些参数后再真正调用了内核模式的系统服务,其中包括Ntoskrnl.exe内部的实际代码。
Ntdll也包含了许多支持函数,比如映像加载器Ldr、堆管理器、Windows子系统进程通信函数Csr,
以及一般的运行库过程Rtl,也包含用户模式下的异步过程调用APC和异常分发器。

执行体
Windows执行体是Ntoskrnl.exe中的上层,内核是下层。执行体包含以下内容函数
1.可以在用户模式下调用的导出函数,这些函数称为系统服务,并且通过Ntdll被导出。这些服务
绝大多数可以通过WindowsApi来访问,或者通过另一个环境子系统的API来访问。也有一些未被文
档化的函数如NTQueryInformationProcess等
2.可以通过DeviceIoControl函数来调用的设备驱动器函数。
3.只能在内核模式下导出的函数,且在DDK中已经文档化的函数
4.在内核模式下调用,但未在DDK中文档化的导出函数(如Inbv开头的函数)
5.定义为全局富豪但是未被导出的函数如以Iop或者Mi开头的函数
6.为定义为全局符号而是在一个模块内部的函数

执行体包含以下组件
1.配置管理器,负责注册表的实现和管理
2.进程和线程管理器
3.。。。。。。

内核
有Ntoskrnl.exe中的一组函数以及对于硬件体系结构的底层支持(中断和异常)组成。内核中许多函
数在DDK文档中也有描述,如Ke开头的函数

内核对象
线程调度和分发,室友内核自己来实现的
执行体将线程和其他可共享的资源都表示成对象,这些对象要求一些策略开销,用以维护它们的对
象句柄,以及保护它们的各种安全检查,相应的资源配额。内核则实现了一组更为简单的对象,称
为内核对象,帮助内核控制好中心处理过程,并且支持执行体对象的创建工作。执行体层绝大多数
对象封装成多个内核对象,把它们的内核属性合并起来。
一组为控制对象,建立了一组有关控制各种操作系统功能的语义,如APC、DPC、中断对象
另一组为分发器对象,融合了同步的能力,它们改变或者影响了线程的调度。分发器对象包括内核
线程、互斥体、内核事件对、事件、信号量、定时器、等待定时器。可执行体利用内核函数来创建
内核对象的实例,并维护这些对象实例。

Inside Native API

System进程和系统线程
System进程是一种特殊的线程的母体,这种特殊线程只能在内核模式下运行,称为内核模式系统线
程。系统线程具备普通用户模式线程的所有属性和环境,但它们只能在内核模式下运行系统空间中
加载的代码,无论这些代码是在Ntoskrnl.exe中还是在任何其他加载进来的设备驱动程序中。而且
系统线程没有一个用户进程地址空间,因此,任何的动态存储空间,它们都必须从操作系统的内存
堆中分配,比如从一个换页的或者非换页的池中分配。

Windows系统结构