Win32SS 目录架构分析
1. 概述
win32ss 是 ReactOS 操作系统的 Win32 图形子系统(Win32k Subsystem) 核心目录。它实现了 Windows NT/2000/XP/Vista 兼容的图形用户界面(GUI)功能,是整个操作系统的视觉呈现和用户交互基础设施。
核心职责:
- 管理窗口、菜单、对话框等 UI 元素
- 处理图形绘制和渲染(GDI)
- 管理输入设备(键盘、鼠标)
- 提供 DirectX/DirectDraw 支持
- 管理打印子系统
输出产物 :主要编译为 win32k.sys 内核模式驱动。
2. 目录架构
win32ss/
├── drivers/ # 显示驱动层
│ ├── displays/ # 显示适配器驱动 (framebuf, vga, vga_new)
│ ├── font/ # 字体驱动 (bmfd, ftfd)
│ ├── miniport/ # 显示微型端口驱动 (bochs, vbe, vga, vmx_svga)
│ ├── videoprt/ # 视频端口驱动框架
│ └── watchdog/ # 显示看门狗驱动
├── gdi/ # GDI 图形设备接口
│ ├── dib/ # DIB(设备无关位图)处理
│ ├── diblib/ # DIB 库(BitBlt 等操作)
│ ├── eng/ # GDI 引擎层(设备管理)
│ ├── gdi32/ # 用户态 GDI32.DLL
│ ├── gdi32_vista/ # Vista+ GDI32 扩展
│ └── ntgdi/ # 内核态 GDI 实现
├── printing/ # 打印子系统
│ ├── base/ # 打印基础服务 (spoolss, spoolsv, winspool)
│ ├── drivers/ # 打印驱动
│ ├── monitors/ # 端口监视器
│ ├── processors/ # 打印处理器
│ └── providers/ # 打印提供程序
├── reactx/ # ReactOS DirectX 实现
│ ├── dxapi/ # DirectX API 驱动
│ ├── dxg/ # DirectX 图形驱动
│ ├── dxgthk/ # DirectX 钩子层
│ ├── ntddraw/ # 内核态 DirectDraw
│ └── ntdxvista/ # Vista+ DirectX 扩展
├── user/ # 用户子系统
│ ├── imm32/ # 输入法管理器
│ ├── ntuser/ # 内核态用户子系统实现
│ ├── rtl/ # 运行时库
│ ├── user32/ # 用户态 USER32.DLL
│ ├── user32_vista/ # Vista+ USER32 扩展
│ └── winsrv/ # 窗口服务 (consrv, usersrv)
└── include/ # 共享头文件
3. 核心模块详解
3.1 Drivers - 显示驱动层
| 子目录 | 功能描述 |
|---|---|
displays/ |
显示适配器驱动,包括帧缓冲(framebuf)、VGA、新版 VGA 驱动 |
font/ |
字体驱动:bmfd(位图字体驱动)、ftfd(FreeType 字体驱动) |
miniport/ |
显示微型端口驱动,负责硬件抽象层,支持 Bochs、VBE、VMware SVGA 等 |
videoprt/ |
视频端口驱动框架,提供设备资源管理、中断处理等基础设施 |
3.2 GDI - 图形设备接口
架构分层:
用户态 内核态
┌──────────┐ ┌──────────┐
│ GDI32.DLL│ ──────────→ │ ntgdi/ │
└──────────┘ syscall └──────────┘
│ │
│ ├── dib/ (DIB 位图处理)
│ ├── eng/ (GDI 引擎)
│ └── diblib/ (BitBlt 操作)
└── gdi32/ └── font/ (字体渲染)
├── objects/
└── wine/ (Wine 兼容层)
核心功能:
- 绘图原语:线条、矩形、多边形、弧线等
- 位图操作:BitBlt、StretchBlt、AlphaBlend
- 字体渲染:TrueType/OpenType 字体支持
- 调色板管理:颜色映射和管理
- 设备上下文(DC):图形绘制上下文管理
关键数据结构(来自 ntgdityp.h(file:///d:/reactos/win32ss/include/ntgdityp.h)):
DEVCAPS- 设备能力描述MATRIX- 变换矩阵GDIBATCHHDR- GDI 批处理命令头DRIVER_FUNCTIONS- 显示驱动函数表
3.3 User - 用户子系统
架构分层:
用户态 内核态
┌──────────┐ ┌──────────┐
│ USER32.DLL│ ─────────→ │ ntuser/ │
└──────────┘ syscall └──────────┘
│ │
│ ├── window.c (窗口管理)
│ ├── message.c (消息处理)
│ ├── menu.c (菜单管理)
│ ├── input.c (输入处理)
│ ├── hook.c (钩子系统)
│ └── clipboard.c(剪贴板)
└── user32/ └── winsta.c (窗口站)
├── windows/
└── controls/
核心功能:
- 窗口管理:创建、销毁、移动、调整窗口
- 消息系统:消息队列、发送/投递消息
- 菜单管理:菜单创建、弹出、追踪
- 输入处理:键盘、鼠标、触摸屏输入
- 剪贴板:剪切/复制/粘贴操作
- 钩子系统:全局/线程钩子
- 窗口站/桌面:多用户会话管理
关键数据结构(来自 ntuser.h(file:///d:/reactos/win32ss/include/ntuser.h)):
WND- 窗口结构MENU- 菜单结构HOOK- 钩子结构CLIENTINFO- 客户端信息SERVERINFO- 服务器信息(全局状态)SHAREDINFO- 用户/内核共享信息
3.4 ReactX - DirectX 支持
| 子目录 | 功能描述 |
|---|---|
dxapi/ |
DirectX API 驱动接口 |
dxg/ |
DirectX 图形驱动实现 |
dxgthk/ |
用户态 DirectX 钩子层 |
ntddraw/ |
内核态 DirectDraw 实现 |
3.5 Printing - 打印子系统
组件架构:
spoolss/- 打印后台处理程序(用户态)spoolsv/- 打印后台处理服务(RPC 服务器)winspool/- Win32 打印 API 包装localspl/- 本地打印提供程序winprint/- 打印处理器
4. 构建架构
根据 CMakeLists.txt(file:///d:/reactos/win32ss/CMakeLists.txt):
主目标 :win32k.sys(内核模式驱动)
编译流程:
- 编译 GDI 核心模块(dib, eng, ntgdi)
- 编译 User 核心模块(ntuser)
- 编译 ReactX DirectX 模块
- 链接生成
win32k.sys
依赖关系:
- 依赖
ntoskrnl(NT 内核) - 依赖
hal(硬件抽象层) - 依赖
ftfd(字体驱动)
子系统目标:
gdi32.dll- GDI 用户态库user32.dll- 用户界面用户态库imm32.dll- 输入法管理器winspool.drv- 打印后台处理程序winsrv.dll- 窗口服务
5. 系统调用接口
Win32SS 通过 SSDT(System Service Descriptor Table) 暴露系统调用:
5.1 NtGdi* 系列(GDI 系统调用)
c
NtGdiBitBlt() // 位图块传输
NtGdiTextOut() // 文本输出
NtGdiCreateFont() // 创建字体
NtGdiCreateBrush() // 创建画刷
NtGdiSelectObject() // 选择 GDI 对象
5.2 NtUser* 系列(用户子系统系统调用)
c
NtUserCreateWindowEx() // 创建窗口
NtUserDestroyWindow() // 销毁窗口
NtUserSendMessage() // 发送消息
NtUserDispatchMessage() // 派发消息
NtUserGetMessage() // 获取消息
5.3 SimpleCall 优化
对于简单的无参数/少参数调用,使用 NtUserCallNoParam、NtUserCallOneParam 等优化路径,减少参数序列化开销。
6. 内存管理
6.1 Handle 管理
User Handle Table(ntuser.h:30-36(file:///d:/reactos/win32ss/include/ntuser.h#L30-L36)):
- 用户态通过句柄引用内核对象
- 支持窗口、菜单、光标、钩子等多种对象类型
GDI Handle Table:
- 类似机制管理 GDI 对象(画笔、画刷、字体、DC 等)
6.2 进程/线程关联
每个进程关联 PROCESSINFO 结构,每个线程关联 THREADINFO 结构,存储:
- GDI 对象池
- 用户对象句柄表
- 消息队列
- 键盘布局
- 输入上下文
7. 消息系统
7.1 消息队列
每个线程维护一个消息队列(MSGQUEUE),支持:
- 队列消息(
PostMessage) - 发送消息(
SendMessage) - 广播消息
7.2 消息派发流程
输入设备 → 内核输入处理 → 消息队列 → DispatchMessage → 窗口过程
8. 安全模型
8.1 对象访问控制
窗口站(HWINSTA)和桌面(HDESK)支持访问控制列表(ACL),实现多用户隔离。
8.2 权限检查
创建/访问窗口站和桌面需要相应权限,防止未授权访问。
9. 总结
| 维度 | 说明 |
|---|---|
| 核心职责 | Windows GUI 子系统,实现窗口管理、图形绘制、输入处理 |
| 架构模式 | 用户态/内核态分离,通过系统调用通信 |
| 关键组件 | win32k.sys(内核驱动)、gdi32.dll、user32.dll |
| 兼容性 | 目标兼容 Windows NT/2000/XP/Vista API |
| 扩展性 | 通过驱动模型支持多种显示硬件和字体格式 |
设计特点:
- 性能优化:GDI 批处理减少系统调用次数
- 资源管理:统一的 handle 管理机制
- 多用户支持:窗口站/桌面隔离
- 硬件抽象:显示驱动模型支持多种硬件