ReactOS Win32SS 目录架构分析

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(内核模式驱动)

编译流程

  1. 编译 GDI 核心模块(dib, eng, ntgdi)
  2. 编译 User 核心模块(ntuser)
  3. 编译 ReactX DirectX 模块
  4. 链接生成 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 优化

对于简单的无参数/少参数调用,使用 NtUserCallNoParamNtUserCallOneParam 等优化路径,减少参数序列化开销。


6. 内存管理

6.1 Handle 管理

User Handle Tablentuser.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
扩展性 通过驱动模型支持多种显示硬件和字体格式

设计特点

  1. 性能优化:GDI 批处理减少系统调用次数
  2. 资源管理:统一的 handle 管理机制
  3. 多用户支持:窗口站/桌面隔离
  4. 硬件抽象:显示驱动模型支持多种硬件