ReactOS 图形系统架构分析
目录
- 概述
- 整体架构分层
- [GDI 引擎 (eng/)](#GDI 引擎 (eng/))
- [内核模式 GDI (ntgdi/)](#内核模式 GDI (ntgdi/))
- 4.1 [GDI 对象管理](#GDI 对象管理)
- 4.2 设备上下文 (DC)
- 4.3 图形对象类型
- 4.4 绘图操作
- [用户模式 GDI32 (gdi32/)](#用户模式 GDI32 (gdi32/))
- [DIB 引擎 (dib/ 和 diblib/)](#DIB 引擎 (dib/ 和 diblib/))
- 6.1 [DIB 引擎架构](#DIB 引擎架构)
- 6.2 [DIB 库 (diblib)](#DIB 库 (diblib))
- 6.3 [DIB 函数表](#DIB 函数表)
- 显示驱动模型
- 7.1 显示驱动架构
- 7.2 [Framebuffer 显示驱动](#Framebuffer 显示驱动)
- 7.3 [VGA 显示驱动](#VGA 显示驱动)
- 字体内核 (freetype)
- [DirectX 支持 (reactx/)](#DirectX 支持 (reactx/))
- 打印子系统 (printing/)
- 图形输出管线
- 构建系统结构
1. 概述
ReactOS 的图形系统位于 win32ss/(Win32 子系统)目录下,是操作系统中最庞大、最复杂的组件之一。它实现了 Windows 图形设备接口(GDI)的全部功能,包括:
- 完整的 GDI32 用户模式 DLL
- 内核模式 GDI 实现(位于 win32k.sys)
- 图形渲染引擎(GDI Engine)
- 设备无关位图(DIB)引擎
- 显示驱动程序接口
- 打印子系统
- DirectX 支持
整个图形系统被编译为 win32k.sys(内核模式)和 gdi32.dll(用户模式)两部分。
2. 整体架构分层
ReactOS 的图形系统采用分层架构,从底层到顶层依次为:
┌─────────────────────────────────────────────────────────┐
│ 应用程序 (Application) │
├─────────────────────────────────────────────────────────┤
│ gdi32.dll (用户模式 GDI) user32.dll (用户模式 USER) │
│ │ 系统调用 (NtGdi*) │ │
├─────────────────────────────────────────────────────────┤
│ win32k.sys (内核模式) │
│ ┌──────────────┬──────────────┬──────────────┐ │
│ │ ntgdi/ │ user/ntuser/│ reactx/ │ │
│ │ (内核 GDI) │ (窗口管理) │ (DirectX) │ │
│ └──────┬───────┴──────┬───────┴──────┬───────┘ │
│ │ │ │ │
│ ┌──────┴──────────────┴──────────────┴───────┐ │
│ │ gdi/eng/ (GDI 引擎) │ │
│ │ ┌──────────────────────────────┐ │ │
│ │ │ gdi/dib/ + gdi/diblib/ │ │ │
│ │ │ (DIB 渲染引擎) │ │ │
│ └──────┬───────────────────────────┘ │ │
├─────────┼──────────────────────────────────────────────┤
│ ↓ │
│ ┌──────────────┐ ┌──────────────┐ ┌───────────┐ │
│ │ framebuf/ │ │ vga/ vga_new/│ │ 字体驱动 │ │
│ │ (显示驱动) │ │ (显示驱动) │ │ bmfd/ftfd │ │
│ └──────────────┘ └──────────────┘ └───────────┘ │
│ ↓ │
│ ┌────────────────────────────────────────────────┐ │
│ │ videoprt/ (视频端口驱动) │ │
│ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │
│ │ │ vbe/ │ │ vga/ │ │ bochs/ │ ... │ │
│ │ │ miniport │ │ miniport │ │ miniport │ │ │
│ └──────────┴──────────────────────────────┘ │ │
└─────────────────────────────────────────────────────────┘
分层说明:
| 层次 | 位置 | 功能 |
|---|---|---|
| gdi32.dll | 用户模式 DLL | 导出 Win32 GDI API,封装系统调用 |
| ntgdi/ | 内核模式 (win32k.sys) | 实现 GDI 系统调用处理,对象管理,DC 管理 |
| gdi/eng/ | 内核模式 (win32k.sys) | 核心渲染引擎,设备交互,裁剪,坐标变换 |
| gdi/dib/ | 内核模式 (win32k.sys) | 设备无关位图渲染,各色深实现 |
| gdi/diblib/ | 内核模式 (win32k.sys) | 模板化 BitBlt 渲染库 |
| 显示驱动 | 内核模式 | 实现 DDI 接口,直接操作显示硬件 |
| videoprt/ | 内核模式 | 视频端口驱动,miniPort 驱动管理 |
现代 Windows 图形架构对比: 现代 Windows 图形系统(Vista+)的常见架构包括:应用层、API 层(GDI/GDI+、Direct2D/DirectWrite、Direct3D 等)、用户模式驱动(UMD)、内核模式(Win32k.sys、Dxgkrnl.sys)、内核模式驱动(KMD)、硬件抽象层(HAL),以及硬件。ReactOS 当前主要实现的是 Windows XP/2003 时代的图形架构,尚未引入 WDDM(Windows Display Driver Model)和 Dxgkrnl.sys 的完整支持。
3. GDI 引擎 (eng/)
GDI 引擎位于 win32ss/gdi/eng/,是图形子系统的核心渲染引擎,负责所有图形操作的实际执行。它实现了 GDI 的 DDI(Device Driver Interface)层,管理显示设备、表面、裁剪等核心功能。
3.1 核心数据结构
SURFACE (表面) --- surface.h(file:///d:/reactos/win32ss/gdi/eng/surface.h)
SURFACE 是 GDI 中最核心的数据结构之一,代表一个可绘制的图形表面:
c
typedef struct _SURFACE
{
BASEOBJECT BaseObject; // GDI 对象的基类头
SURFOBJ SurfObj; // 公开的 SURFOBJ(DDI 层使用)
FLONG flags; // 表面标志位
struct _PALETTE * const ppal; // 关联的调色板
struct _EWNDOBJ *pWinObj; // 窗口对象(用于窗口表面)
union {
HANDLE hSecureUMPD; // UMPD 表面
HANDLE hMirrorParent; // 镜像表面
HANDLE hDDSurface; // DirectDraw 表面
};
SIZEL sizlDim; // 位图尺寸
HDC hdc; // 关联的 DC
ULONG cRef; // 引用计数
HPALETTE hpalHint; // 调色板提示
HANDLE hDIBSection; // DIB Section 句柄
HANDLE hSecure; // 安全句柄
DWORD dwOffset; // 数据偏移
DWORD biClrImportant; // 重要颜色数
ULONG biCompression; // 压缩类型
} SURFACE, *PSURFACE;
SURFACE 包含多种标志位(_SURFACEFLAGS),标识表面的类型和属性,如 UMDP_SURFACE、MIRROR_SURFACE、DIRECTDRAW_SURFACE、DRIVER_CREATED_SURFACE、DDB_SURFACE、API_BITMAP、PDEV_SURFACE 等。
SURFOBJ (DDI 表面对象)
SURFOBJ 是引擎公开的 DDI 层表面结构,包含:
pvBits--- 指向像素数据的指针lDelta--- 每行字节数iBitmapFormat--- 位图格式(BMF_1BPP ~ BMF_32BPP)iType--- 类型(STYPE_BITMAP、STYPE_DEVICE 等)hpal--- 调色板句柄sizlBitmap--- 位图尺寸
3.2 引擎核心功能
GDI 引擎提供以下核心功能(声明在 eng.h(file:///d:/reactos/win32ss/gdi/eng/eng.h)):
- 位块传输 :
EngBitBlt、IntEngBitBlt、IntEngMaskBlt、IntEngStretchBlt - 裁剪管理 :
EngCreateClip、裁剪区域枚举 - 表面管理 :
EngCreateSurface、EngModifySurface、表面锁定 - 调色板 :
EngCreatePalette - 设备管理:设备锁定、PDEV 管理
- 同步原语 :
EngAcquireSemaphore、EngAcquireSemaphoreShared - 内存管理 :
EngSecureMemForRead、EngAllocMem、EngFreeMem - 事件 :
EngCreateEvent、EngWaitForSingleObject - 坐标变换 :
EngLineTo、EngStrokePath、EngFillPath - 文本输出 :
EngTextOut、EngGetGlyphOutline - Alpha 混合 :
EngAlphaBlend - 渐变填充 :
EngGradientFill - 透明混合 :
EngTransparentBlt - 复制位 :
EngCopyBits
3.3 设备对象管理体系
GDI 引擎使用四层设备对象结构来管理显示设备,这种分层设计将物理设备、逻辑设备、映射设备和物理设备属性分离:
PDEVOBJ (物理设备对象) --- pdevobj.h(file:///d:/reactos/win32ss/gdi/eng/pdevobj.h)
c
typedef struct _PDEVOBJ
{
BASEOBJECT BaseObject;
struct _PDEVOBJ * ppdevNext; // 下一个 PDEV(链表)
LONG cPdevRefs; // 引用计数
LONG cPdevOpenRefs;
struct _PDEVOBJ * ppdevParent; // 父 PDEV
FLONG flFlags; // PDEV 标志
HSEMAPHORE hsemDevLock; // 设备锁
POINTL ptlPointer; // 指针位置
HSURF ahsurf[HS_DDI_MAX]; // 引擎表面句柄数组
PWSTR pusPrtDataFileName; // 打印机数据文件
// ... 更多字段
} PDEVOBJ, *PPDEVOBJ;
PDEV 标志(_PDEVFLAGS):
PDEV_DISPLAY--- 显示设备PDEV_HARDWARE_POINTER--- 支持硬件光标PDEV_SOFTWARE_POINTER--- 软件光标PDEV_GOTFONTS--- 已加载字体驱动PDEV_PRINTER--- 打印设备PDEV_DISABLED--- 设备已禁用PDEV_SYNCHRONIZE_ENABLED--- 启用同步PDEV_CLONE_DEVICE--- 克隆设备
GDIPOINTER 结构 --- 管理指针(光标)信息,包括颜色表面、掩码表面、保存表面、热区位置等。
GRAPHICS_DEVICE 结构 --- 描述图形设备,包括 NT 设备名、Win32 设备名、设备对象、视频驱动信息、显示模式列表等。
LDEVOBJ (逻辑设备对象) --- ldevobj.h(file:///d:/reactos/win32ss/gdi/eng/ldevobj.h)
c
typedef struct _LDEVOBJ
{
LIST_ENTRY leLink;
SYSTEM_GDI_DRIVER_INFORMATION *pGdiDriverInfo;
LDEVTYPE ldevtype; // 设备类型
ULONG cRefs; // 引用计数
ULONG ulDriverVersion; // 驱动版本
union {
PVOID apfn[INDEX_LAST]; // 函数指针数组
DRIVER_FUNCTIONS pfn; // DDI 函数表
};
} LDEVOBJ, *PLDEVOBJ;
LDEV 类型(LDEVTYPE):
LDEV_DEVICE_DISPLAY--- 显示设备LDEV_DEVICE_PRINTER--- 打印设备LDEV_DEVICE_META--- 元文件设备LDEV_DEVICE_MIRROR--- 镜像设备LDEV_IMAGE--- 图像设备LDEV_FONT--- 字体内核
LDEV 维护一个 DDI 函数表(DRIVER_FUNCTIONS),包含所有显示驱动需要实现的回调函数,如 DrvEnablePDEV、DrvEnableSurface、DrvBitBlt、DrvTextOut 等。
核心函数:
LDEVOBJ_pLoadDriver--- 加载指定名称的驱动LDEVOBJ_pLoadInternal--- 加载内部驱动(如 DIB 引擎)LDEVOBJ_bBuildDevmodeList--- 构建设备模式列表LDEVOBJ_bProbeAndCaptureDevmode--- 选择最佳设备模式
MDEVOBJ (映射设备对象) --- mdevobj.h(file:///d:/reactos/win32ss/gdi/eng/mdevobj.h)
c
typedef struct _MDEVOBJ
{
ULONG cDev; // 设备数量
PPDEVOBJ ppdevGlobal; // 全局 PDEV
MDEVDISPLAY dev[0]; // 设备数组
} MDEVOBJ, *PMDEVOBJ;
MDEV 管理多个物理设备,支持多显示器配置。MDEVOBJ_Create 创建新的 MDEV,MDEVOBJ_vEnable 启用所有设备。
设备交互流程:
LDEV (逻辑设备) → 加载驱动 → 获取 DDI 函数表
↓
PDEV (物理设备) → DrvEnablePDEV → 初始化硬件
↓
SURFACE (表面) → DrvEnableSurface → 创建可绘制表面
↓
MDEV (映射设备) → 管理多个 PDEV(多显示器)
4. 内核模式 GDI (ntgdi/)
ntgdi 位于 win32ss/gdi/ntgdi/,是 GDI 的内核模式实现部分,处理所有 NtGdi* 系统调用,实现 GDI 对象管理、DC 管理、图形操作的实际执行。
4.1 GDI 对象管理
句柄表 --- gdiobj.h(file:///d:/reactos/win32ss/gdi/ntgdi/gdiobj.h)
GDI 使用一个全局句柄表管理所有 GDI 对象:
c
typedef struct _GDI_HANDLE_TABLE
{
GDI_TABLE_ENTRY Entries[GDI_HANDLE_COUNT]; // 句柄条目
DEVCAPS DevCaps; // 设备能力
FLONG flDeviceUniq; // 设备唯一性
PVOID pvLangPack; // 语言包
CFONT cfPublic[GDI_CFONT_MAX]; // 公共字体
DWORD dwCFCount;
} GDI_HANDLE_TABLE, *PGDI_HANDLE_TABLE;
BASEOBJECT --- 所有 GDI 对象的基类
c
typedef struct _BASEOBJECT
{
HGDIOBJ hHmgr; // 对象句柄
union {
ULONG ulShareCount; // 无句柄对象的共享计数
DWORD dwThreadId; // 排他锁拥有者线程 ID
};
USHORT cExclusiveLock; // 排他锁计数
USHORT BaseFlags; // 标志位
EX_PUSH_LOCK pushlock; // 推送锁(用于同步)
} BASEOBJECT, *POBJ;
对象锁定机制:
GDI 对象支持三种锁定方式:
- 共享锁(读锁) --- 多个线程可同时获取
- 排他锁(写锁) --- 只有一个线程可获取
- 无锁 --- 任何线程可访问
对象有内存引用计数,通过 gpaulRefCount 全局数组管理。句柄的最高位包含有效位和重用计数,支持原子操作。
对象类型枚举: GDI_OBJECT_TYPE_* 包括 DC、位图、画刷、画笔、调色板、区域、字体等。
核心对象管理函数:
GDIOBJ_AllocObjWithHandle--- 分配带句柄的对象GDIOBJ_ShareLockObj--- 锁定对象GDIOBJ_vUnlockObject--- 解锁对象GreDeleteObject--- 删除对象GreIsHandleValid--- 验证句柄有效性GDIOBJ_bLockMultipleObjects--- 批量锁定对象
GDI 池 --- gdipool.c(file:///d:/reactos/win32ss/gdi/ntgdi/gdipool.c)
GDI 使用内存池(GdiPool)高效管理对象属性内存,每个进程有独立的 DC 属性池、画刷属性池和区域属性池:
c
ppiCurrent->pPoolDcAttr = GdiPoolCreate(sizeof(DC_ATTR), 'acdG');
ppiCurrent->pPoolBrushAttr = GdiPoolCreate(sizeof(BRUSH_ATTR), 'arbG');
ppiCurrent->pPoolRgnAttr = GdiPoolCreate(sizeof(RGN_ATTR), 'agrG');
GDI 批处理 --- gdibatch.c(file:///d:/reactos/win32ss/gdi/ntgdi/gdibatch.c)
GDI 批处理机制将多个 GDI 调用合并为一次内核调用,减少用户态/内核态切换开销。批处理缓冲区由用户模式的 GDI32 管理,当缓冲区满时调用 NtGdiFlushUserBatch 刷新。
4.2 设备上下文 (DC)
DC 是 GDI 绘图操作的核心对象,在 dc.h(file:///d:/reactos/win32ss/gdi/ntgdi/dc.h) 中定义:
c
typedef struct _DC
{
BASEOBJECT BaseObject; // GDI 对象头
DHPDEV dhpdev; // 设备句柄
DCTYPE dctype; // DC 类型
INT fs; // DC 标志
PPDEVOBJ ppdev; // 物理设备对象
PVOID hsem; // 同步信号量
FLONG flGraphicsCaps; // 图形能力
FLONG flGraphicsCaps2;
PDC_ATTR pdcattr; // DC 属性指针
DCLEVEL dclevel; // DC 级别(当前状态)
DC_ATTR dcattr; // DC 属性(内联)
HDC hdcNext, hdcPrev; // DC 链表指针
RECTL erclClip; // 裁剪矩形
POINTL ptlDCOrig; // DC 原点
RECTL erclWindow; // 窗口矩形
RECTL erclBounds; // 边界矩形
PREGION prgnAPI; // API 裁剪区域
PREGION prgnVis; // 可见区域
PREGION prgnRao; // 相对可见区域
EBRUSHOBJ eboFill; // 填充画刷
EBRUSHOBJ eboLine; // 线条画刷
EBRUSHOBJ eboText; // 文本画刷
EBRUSHOBJ eboBackground; // 背景画刷
HFONT hlfntCur; // 当前字体
XCLIPOBJ co; // 扩展裁剪对象
// ... 更多字段
} DC;
DC 类型(DCTYPE):
DCTYPE_DIRECT--- 普通设备上下文(屏幕设备)DCTYPE_MEMORY--- 内存设备上下文(兼容位图)DCTYPE_INFO--- 信息上下文(只查询,不输出)
DC 标志(DCFLAGS):
DC_DISPLAY--- 显示设备DC_DIRECT--- 直接 DCDC_CANCELED--- 已取消DC_ACCUM_WMGR--- 窗口管理器累积DC_ACCUM_APP--- 应用程序累积DC_TEMPINFODC--- 临时信息 DCDC_REDIRECTION--- 重定向 DC
DCLEVEL 结构 --- 包含 DC 的当前绘图状态:
- 调色板 (
hpal,ppal) - 画刷 (
pbrFill,pbrLine) - 字体 (
plfnt) - 路径 (
hPath) - 裁剪区域 (
prgnClip) - 颜色调整 (
ca) - 世界坐标变换矩阵 (
mxWorldToDevice,mxDeviceToWorld等) - 当前表面 (
pSurface)
DC 生命周期管理 --- dclife.c(file:///d:/reactos/win32ss/gdi/ntgdi/dclife.c):
GreCreateDC--- 创建设备上下文GreCreateCompatibleDC--- 创建兼容 DCGreDeleteDC--- 删除 DCDC_vSetDcUndeletable--- 设置不可删除
DC 属性管理 --- dcattr.c(file:///d:/reactos/win32ss/gdi/ntgdi/dcattr.c):
- 管理 DC 的各种属性设置
- 使用
DC_ATTR结构存储属性
DC 对象选择 --- dcobjs.c(file:///d:/reactos/win32ss/gdi/ntgdi/dcobjs.c):
DC_hSelectFont--- 选择字体GdiSelectPalette--- 选择调色板DC_vUpdateFillBrush--- 更新填充画刷DC_vUpdateLineBrush--- 更新线条画刷DC_vUpdateTextBrush--- 更新文本画刷DC_vUpdateBackgroundBrush--- 更新背景画刷
4.3 图形对象类型
ntgdi 实现的所有 GDI 对象类型:
| 对象类型 | 文件 | 说明 |
|---|---|---|
| 位图 (Bitmap) | bitmaps.c(file:///d:/reactos/win32ss/gdi/ntgdi/bitmaps.c), bitmaps.h(file:///d:/reactos/win32ss/gdi/ntgdi/bitmaps.h) | 位图创建、删除、Get/SetBitmapBits |
| 画刷 (Brush) | brush.cpp(file:///d:/reactos/win32ss/gdi/ntgdi/brush.cpp), brush.hpp(file:///d:/reactos/win32ss/gdi/ntgdi/brush.hpp) | 纯色、图案、空心画刷 |
| 画笔 (Pen) | pen.c(file:///d:/reactos/win32ss/gdi/ntgdi/pen.c), pen.h(file:///d:/reactos/win32ss/gdi/ntgdi/pen.h) | 几何画笔、装饰画笔 |
| 区域 (Region) | region.c(file:///d:/reactos/win32ss/gdi/ntgdi/region.c), region.h(file:///d:/reactos/win32ss/gdi/ntgdi/region.h) | 矩形、多边形、椭圆区域 |
| 调色板 (Palette) | palette.c(file:///d:/reactos/win32ss/gdi/ntgdi/palette.c), palette.h(file:///d:/reactos/win32ss/gdi/ntgdi/palette.h) | 系统调色板、逻辑调色板 |
| 字体 (Font) | font.c(file:///d:/reactos/win32ss/gdi/ntgdi/font.c), font.h(file:///d:/reactos/win32ss/gdi/ntgdi/font.h) | 字体创建、选择、度量 |
| 路径 (Path) | path.c(file:///d:/reactos/win32ss/gdi/ntgdi/path.c), path.h(file:///d:/reactos/win32ss/gdi/ntgdi/path.h) | 路径创建、绘制、填充 |
| 裁剪区域 (Clip Region) | cliprgn.c(file:///d:/reactos/win32ss/gdi/ntgdi/cliprgn.c), cliprgn.h(file:///d:/reactos/win32ss/gdi/ntgdi/cliprgn.h) | 裁剪区域管理 |
| 库存对象 (Stock Object) | stockobj.c(file:///d:/reactos/win32ss/gdi/ntgdi/stockobj.c) | 默认画笔、画刷、字体等 |
| DIB 对象 | dibobj.c(file:///d:/reactos/win32ss/gdi/ntgdi/dibobj.c) | DIB 相关对象管理 |
| 坐标变换 (Xform) | xformobj.c(file:///d:/reactos/win32ss/gdi/ntgdi/xformobj.c), xformobj.h(file:///d:/reactos/win32ss/gdi/ntgdi/xformobj.h) | 世界坐标到设备坐标变换 |
4.4 绘图操作
ntgdi 实现的核心绘图操作:
| 操作 | 文件 | 说明 |
|---|---|---|
| BitBlt | bitblt.c(file:///d:/reactos/win32ss/gdi/ntgdi/bitblt.c) | 位块传输(含 AlphaBlend、TransparentBlt) |
| 线条绘制 | line.c(file:///d:/reactos/win32ss/gdi/ntgdi/line.c) | LineTo、MoveToEx、Polyline、PolyBezier |
| 弧线 | arc.c(file:///d:/reactos/win32ss/gdi/ntgdi/arc.c) | Arc、ArcTo、Chord、Pie |
| 贝塞尔曲线 | bezier.c(file:///d:/reactos/win32ss/gdi/ntgdi/bezier.c) | PolyBezier |
| 矩形/形状 | fillshap.c(file:///d:/reactos/win32ss/gdi/ntgdi/fillshap.c) | Rectangle、Ellipse、RoundRect |
| 多边形填充 | polyfill.c(file:///d:/reactos/win32ss/gdi/ntgdi/polyfill.c) | Polygon、PolyPolygon、PolyPolyline |
| 绘图操作 | drawing.c(file:///d:/reactos/win32ss/gdi/ntgdi/drawing.c) | 基础绘图函数 |
| 文本输出 | text.c(file:///d:/reactos/win32ss/gdi/ntgdi/text.c) | TextOut、ExtTextOut、GetTextExtentPoint |
| 坐标变换 | coord.c(file:///d:/reactos/win32ss/gdi/ntgdi/coord.c) | LPtoDP、DPtoLP、坐标空间转换 |
| 颜色管理 | icm.c(file:///d:/reactos/win32ss/gdi/ntgdi/icm.c) | ICM(图像颜色管理) |
| 元文件 | metafile.c(file:///d:/reactos/win32ss/gdi/ntgdi/metafile.c) | 元文件回放 |
| 打印 | print.c(file:///d:/reactos/win32ss/gdi/ntgdi/print.c) | 打印支持 |
系统调用入口:
ntgdi 通过 NtGdi* 前缀的系统调用函数处理用户模式请求,例如:
NtGdiAlphaBlend--- Alpha 混合NtGdiBitBlt--- 位块传输NtGdiCreateCompatibleBitmap--- 创建兼容位图NtGdiDeleteObjectApp--- 删除对象NtGdiExtTextOutW--- 文本输出NtGdiSelectObject--- 选择对象NtGdiGetStockObject--- 获取库存对象
5. 用户模式 GDI32 (gdi32/)
5.1 架构概览
GDI32 位于 win32ss/gdi/gdi32/,是用户模式的 GDI 动态链接库,导出所有 Win32 GDI API。它被编译为 gdi32.dll,是应用程序与内核 GDI 之间的桥梁。
目录结构:
gdi32/
├── include/ # 内部头文件(gdi32p.h, precomp.h)
├── main/ # DLL 入口(dllmain.c)
├── misc/ # 杂项功能(gdientry.c, heap.c, misc.c)
├── objects/ # GDI 对象实现(bitmap.c, brush.c, dc.c, font.c 等)
└── wine/ # Wine 兼容层(元文件、增强元文件驱动)
├── enhmfdrv/ # 增强元文件驱动
└── mfdrv/ # 元文件驱动
5.2 用户模式对象封装
GDI32 的用户模式代码封装了各种 GDI 对象的操作,通过系统调用委托给内核执行:
| 对象类型 | 文件 | 关键函数 |
|---|---|---|
| DC | objects/dc.c(file:///d:/reactos/win32ss/gdi/gdi32/objects/dc.c) | CreateDCW、CreateCompatibleDC、DeleteDC、GetDC |
| 位图 | objects/bitmap.c(file:///d:/reactos/win32ss/gdi/gdi32/objects/bitmap.c) | CreateBitmap、CreateCompatibleBitmap、GetBitmapBits |
| 画刷 | objects/brush.c(file:///d:/reactos/win32ss/gdi/gdi32/objects/brush.c) | CreateSolidBrush、CreateHatchBrush、CreatePatternBrush |
| 画笔 | objects/pen.c(file:///d:/reactos/win32ss/gdi/gdi32/objects/pen.c) | CreatePen、CreatePenIndirect |
| 区域 | objects/region.c(file:///d:/reactos/win32ss/gdi/gdi32/objects/region.c) | CreateRectRgn、CreatePolygonRgn、CombineRgn |
| 字体 | objects/font.c(file:///d:/reactos/win32ss/gdi/gdi32/objects/font.c) | CreateFontIndirect、GetTextMetrics |
| 调色板 | objects/palette.c(file:///d:/reactos/win32ss/gdi/gdi32/objects/palette.c) | CreatePalette、SelectPalette、RealizePalette |
| 路径 | objects/path.c(file:///d:/reactos/win32ss/gdi/gdi32/objects/path.c) | BeginPath、EndPath、FillPath、StrokePath |
| 绘图 | objects/painting.c(file:///d:/reactos/win32ss/gdi/gdi32/objects/painting.c) | Rectangle、Ellipse、FillRect、DrawEdge |
| 弧线 | objects/arc.c(file:///d:/reactos/win32ss/gdi/gdi32/objects/arc.c) | Arc、Chord、Pie、ArcTo |
| 坐标 | objects/coord.c(file:///d:/reactos/win32ss/gdi/gdi32/objects/coord.c) | SetMapMode、SetViewportExt、LPtoDP、DPtoLP |
| 文本 | objects/text.c(file:///d:/reactos/win32ss/gdi/gdi32/objects/text.c) | TextOutW、ExtTextOutW、GetTextExtentPoint32W |
| GDI 对象 | objects/gdiobj.c(file:///d:/reactos/win32ss/gdi/gdi32/objects/gdiobj.c) | SelectObject、DeleteObject、GetObject |
| 引擎 | objects/eng.c(file:///d:/reactos/win32ss/gdi/gdi32/objects/eng.c) | 引擎接口函数 |
| 打印 | objects/printdrv.c(file:///d:/reactos/win32ss/gdi/gdi32/objects/printdrv.c) | 打印驱动支持 |
| 颜色空间 | objects/colorspace.c(file:///d:/reactos/win32ss/gdi/gdi32/objects/colorspace.c) | 颜色空间管理 |
| 增强元文件 | objects/enhmfile.c(file:///d:/reactos/win32ss/gdi/gdi32/objects/enhmfile.c) | 增强元文件支持 |
| 元文件 | objects/metafile.c(file:///d:/reactos/win32ss/gdi/gdi32/objects/metafile.c) | 元文件支持 |
| 颜色管理 | objects/icm.c(file:///d:/reactos/win32ss/gdi/gdi32/objects/icm.c) | ICM 支持 |
5.3 系统调用接口
GDI32 通过 NtGdi* 系统调用进入内核模式。典型的调用流程如下:
应用程序调用 GDI32 API (如 BitBlt)
↓
GDI32 函数封装参数,调用系统调用 (NtGdiBitBlt)
↓
ntoskrnl 分发系统调用到 win32k.sys
↓
ntgdi 处理系统调用 (NtGdiBitBlt)
↓
调用 GDI 引擎 (EngBitBlt → IntEngBitBlt)
↓
DIB 引擎或显示驱动执行实际渲染
GDI 批处理机制 --- 为了提高性能,GDI32 实现了用户态批处理(gdibatch.c(file:///d:/reactos/win32ss/gdi/ntgdi/gdibatch.c))。多个 GDI 调用被缓存在用户态缓冲区中,当缓冲区满或调用 GdiFlush 时,一次性通过 NtGdiFlushUserBatch 发送到内核。
共享句柄表 --- 内核将 GDI 句柄表映射到用户进程的地址空间(通过 GdiSharedHandleTable),允许用户模式直接读取句柄信息,减少系统调用。
关键头文件:
- gdi32p.h(file:///d:/reactos/win32ss/gdi/gdi32/include/gdi32p.h) --- GDI32 私有头文件,定义内部数据类型、宏和函数声明
- gdi_private.h(file:///d:/reactos/win32ss/gdi/gdi32/wine/gdi_private.h) --- Wine 兼容层私有头文件
6. DIB 引擎 (dib/ 和 diblib/)
DIB(Device Independent Bitmap)引擎是 GDI 的软件渲染核心,实现所有位图格式的像素操作。
6.1 DIB 引擎架构
DIB 引擎位于 win32ss/gdi/dib/,为每个支持的位图格式提供独立的渲染函数:
支持的位图格式(色深):
| 格式 | 文件 | 说明 |
|---|---|---|
| BMF_1BPP | dib1bpp.c(file:///d:/reactos/win32ss/gdi/dib/dib1bpp.c) | 1 位/像素,黑白 |
| BMF_4BPP | dib4bpp.c(file:///d:/reactos/win32ss/gdi/dib/dib4bpp.c) | 4 位/像素,16 色 |
| BMF_8BPP | dib8bpp.c(file:///d:/reactos/win32ss/gdi/dib/dib8bpp.c) | 8 位/像素,256 色 |
| BMF_16BPP | dib16bpp.c(file:///d:/reactos/win32ss/gdi/dib/dib16bpp.c) | 16 位/像素,高彩色 |
| BMF_24BPP | dib24bpp.c(file:///d:/reactos/win32ss/gdi/dib/dib24bpp.c) | 24 位/像素,真彩色 |
| BMF_32BPP | dib32bpp.c(file:///d:/reactos/win32ss/gdi/dib/dib32bpp.c) | 32 位/像素,真彩色 |
| BMF_24BPP (彩色) | dib24bppc.c(file:///d:/reactos/win32ss/gdi/dib/dib24bppc.c) | 24 位彩色优化 |
| BMF_32BPP (彩色) | dib32bppc.c(file:///d:/reactos/win32ss/gdi/dib/dib32bppc.c) | 32 位彩色优化 |
汇编优化: i386 目录包含针对 x86 平台的汇编优化实现:
dib24bpp_hline.s--- 24 位水平线dib32bpp_colorfill.s--- 32 位颜色填充dib32bpp_hline.s--- 32 位水平线
6.2 DIB 函数表
DIB 引擎使用函数指针表(DIB_FUNCTIONS)为每个色深分发渲染操作,定义在 dib.h(file:///d:/reactos/win32ss/gdi/dib/dib.h):
c
typedef struct
{
PFN_DIB_PutPixel DIB_PutPixel; // 设置像素
PFN_DIB_GetPixel DIB_GetPixel; // 获取像素
PFN_DIB_HLine DIB_HLine; // 水平线
PFN_DIB_VLine DIB_VLine; // 垂直线
PFN_DIB_BitBlt DIB_BitBlt; // 位块传输
PFN_DIB_BitBlt DIB_BitBltSrcCopy; // SRCCOPY 优化
PFN_DIB_StretchBlt DIB_StretchBlt; // 拉伸块传输
PFN_DIB_TransparentBlt DIB_TransparentBlt; // 透明混合
PFN_DIB_ColorFill DIB_ColorFill; // 颜色填充
PFN_DIB_AlphaBlend DIB_AlphaBlend; // Alpha 混合
} DIB_FUNCTIONS;
函数表初始化在 dib.c(file:///d:/reactos/win32ss/gdi/dib/dib.c) 中,为每种格式分配对应的函数指针:
c
DIB_FUNCTIONS DibFunctionsForBitmapFormat[] =
{
/* 0: 无效格式 */
{ Dummy_... },
/* BMF_1BPP */
{ DIB_1BPP_PutPixel, DIB_1BPP_GetPixel, ... },
/* BMF_4BPP */
{ DIB_4BPP_PutPixel, DIB_4BPP_GetPixel, ... },
/* ... 直到 BMF_32BPP */
};
6.3 DIB 库 (diblib)
DIB 库位于 win32ss/gdi/diblib/,是一个基于 C 预处理器的模板化渲染库,通过宏实现在编译时生成针对不同位深和光栅操作(ROP)的优化代码。
关键文件:
- DibLib.h(file:///d:/reactos/win32ss/gdi/diblib/DibLib.h) --- 主头文件,定义宏和函数签名
- DibLib.c(file:///d:/reactos/win32ss/gdi/diblib/DibLib.c) --- 核心实现
- DibLib_interface.h(file:///d:/reactos/win32ss/gdi/diblib/DibLib_interface.h) --- 接口定义
- DibLib_BitBlt.h(file:///d:/reactos/win32ss/gdi/diblib/DibLib_BitBlt.h) --- BitBlt 模板
支持的 BitBlt 操作(每个一个独立文件):
BitBlt_SRCCOPY.c--- 源拷贝BitBlt_SRCAND.c--- 源与BitBlt_SRCINVERT.c--- 源异或BitBlt_SRCPAINT.c--- 源或BitBlt_SRCERASE.c--- 源擦除BitBlt_NOTSRCCOPY.c--- 非源拷贝BitBlt_PATCOPY.c--- 图案拷贝- 等 16 种标准 ROP 操作
BLTINFO 结构:
c
typedef struct _BLTINFO
{
SURFOBJ *DestSurface; // 目标表面
SURFOBJ *SourceSurface; // 源表面
SURFOBJ *PatternSurface; // 图案表面
XLATEOBJ *XlateSourceToDest; // 颜色转换
XLATEOBJ *XlatePatternToDest;
RECTL DestRect; // 目标矩形
POINTL SourcePoint; // 源点
BRUSHOBJ *Brush; // 画刷
POINTL BrushOrigin; // 画刷原点
ROP4 Rop4; // 光栅操作码
} BLTINFO, *PBLTINFO;
7. 显示驱动模型
7.1 显示驱动架构
ReactOS 的显示驱动实现 DDI(Device Driver Interface)接口,遵循 Windows 2000/XP 的显示驱动模型。显示驱动是内核模式 DLL,通过 eng/ 引擎的 DDI 函数表注册回调。
显示驱动目录:
win32ss/drivers/displays/
├── framebuf/ # 通用 Framebuffer 显示驱动(主要)
├── vga/ # VGA 兼容显示驱动
└── vga_new/ # 新版 VGA 显示驱动
字体驱动目录:
win32ss/drivers/font/
├── bmfd/ # 位图字体驱动
└── ftfd/ # FreeType 字体驱动
MiniPort 驱动目录:
win32ss/drivers/miniport/
├── bochs/ # Bochs/QEMU 显示 Miniport
├── vbe/ # VBE 显示 Miniport
├── vga/ # VGA 显示 Miniport
├── vga_new/ # 新版 VGA Miniport
├── vmx_svga/ # VMware SVGA Miniport
└── xboxvmp/ # Xbox 视频 Miniport
7.2 Framebuffer 显示驱动
Framebuffer 驱动是 ReactOS 的主要显示驱动,使用统一帧缓冲架构,支持多种色深。
PDEV 结构 --- framebuf.h(file:///d:/reactos/win32ss/drivers/displays/framebuf/framebuf.h):
c
typedef struct _PDEV
{
HANDLE hDriver; // 驱动句柄
HDEV hDevEng; // 引擎设备句柄
HSURF hSurfEng; // 引擎表面句柄
ULONG ModeIndex; // 当前模式索引
ULONG ScreenWidth; // 屏幕宽度
ULONG ScreenHeight; // 屏幕高度
ULONG ScreenDelta; // 每行字节数
BYTE BitsPerPixel; // 每像素位数
ULONG RedMask, GreenMask, BlueMask; // 颜色掩码
BYTE PaletteShift;
PVOID ScreenPtr; // 帧缓冲指针
HPALETTE DefaultPalette; // 默认调色板
PALETTEENTRY *PaletteEntries; // 调色板条目
// ... DirectX 支持字段
} PDEV, *PPDEV;
DrvEnablePDEV --- 驱动初始化入口:
c
DHPDEV APIENTRY DrvEnablePDEV(
DEVMODEW *pdm, // 设备模式
LPWSTR pwszLogAddress, // 逻辑地址
ULONG cPat, // 图案数量
HSURF *phsurfPatterns, // 图案表面
ULONG cjCaps, // 能力大小
ULONG *pdevcaps, // 设备能力
ULONG cjDevInfo, // 设备信息大小
DEVINFO *pdi, // 设备信息
HDEV hdev, // 引擎设备句柄
LPWSTR pwszDeviceName, // 设备名
HANDLE hDriver); // 驱动句柄
DrvEnableSurface --- 创建显示表面:
通过 EngCreateDeviceSurface 或 EngModifySurface 创建引擎管理的表面,支持 1/4/8/16/24/32 bpp。
核心 DDI 回调:
DrvEnablePDEV--- 启用物理设备DrvCompletePDEV--- 完成设备初始化DrvDisablePDEV--- 禁用物理设备DrvEnableSurface--- 启用绘制表面DrvDisableSurface--- 禁用绘制表面DrvAssertMode--- 断言显示模式DrvBitBlt--- 位块传输DrvTextOut--- 文本输出DrvStrokePath--- 描边路径DrvFillPath--- 填充路径DrvCopyBits--- 复制位DrvSetPalette--- 设置调色板DrvGetModes--- 获取显示模式DrvSetPointerShape--- 设置指针形状DrvMovePointer--- 移动指针
7.3 VGA 显示驱动
VGA 显示驱动位于 win32ss/drivers/displays/vga/,提供对传统 VGA 兼容硬件的支持。VGA 驱动使用 VGA 特有的寄存器编程方式来控制显示硬件,支持 4 位(16 色)模式。
8. 字体内核 (freetype)
ReactOS 使用 FreeType 库进行字体渲染,字体驱动位于 win32ss/drivers/font/。
字体驱动架构:
GDI 引擎 (EngTextOut, EngGetGlyphOutline)
↓
ftfd (FreeType 字体驱动) --- 矢量字体渲染
↓
bmfd (位图字体驱动) --- 点阵字体渲染
↓
FreeType 库 --- 字体文件解析和字形渲染
ftfd (FreeType 字体驱动) --- ftfd/(file:///d:/reactos/win32ss/drivers/font/ftfd/):
- 使用 FreeType 库渲染 TrueType、OpenType 等矢量字体
- 实现
DrvEnableFont、DrvGetGlyphMode等 DDI 字体回调 - 实现
FONTOBJ相关接口
bmfd (位图字体驱动) --- bmfd/(file:///d:/reactos/win32ss/drivers/font/bmfd/):
- 渲染点阵位图字体(FON 格式)
- 用于系统启动时的基本字体显示
9. DirectX 支持 (reactx/)
ReactOS 的 DirectX 支持位于 win32ss/reactx/,提供 DirectDraw 和 Direct3D 的基本支持。
目录结构:
reactx/
├── dxapi/ # DirectX API 传输层
├── dxg/ # DirectX 图形核心
├── dxgthk/ # DirectX 图形 Thunk 层
├── ntddraw/ # 内核模式 DirectDraw 实现
└── ntdxvista/ # Vista+ DirectX 私有接口
ntddraw 核心文件:
- ddraw.c(file:///d:/reactos/win32ss/reactx/ntddraw/ddraw.c) --- DirectDraw 核心
- dd.c(file:///d:/reactos/win32ss/reactx/ntddraw/dd.c) --- DirectDraw 设备
- ddsurf.c(file:///d:/reactos/win32ss/reactx/ntddraw/ddsurf.c) --- DirectDraw 表面
- d3d.c(file:///d:/reactos/win32ss/reactx/ntddraw/d3d.c) --- Direct3D 支持
- dxeng.c(file:///d:/reactos/win32ss/reactx/ntddraw/dxeng.c) --- DirectX 引擎接口
- eng.c(file:///d:/reactos/win32ss/reactx/ntddraw/eng.c) --- 引擎集成
10. 打印子系统 (printing/)
打印子系统位于 win32ss/printing/,实现 Windows 打印架构。
组件结构:
printing/
├── base/ # 基础打印组件
│ ├── ntprint/ # 打印 ticket/features 支持
│ ├── printui/ # 打印用户界面
│ ├── spoolss/ # 打印后台处理程序接口
│ ├── spoolsv/ # 打印后台处理服务
│ └── winspool/ # Win32 打印 API
├── drivers/ # 打印驱动
│ ├── tty/ # TTY 打印驱动
│ └── unidrv/ # 通用打印驱动
├── monitors/ # 打印监视器
│ ├── localmon/ # 本地端口监视器
│ ├── pjlmon/ # PJL 监视器
│ ├── tcpmon/ # TCP/IP 端口监视器
│ └── usbmon/ # USB 监视器
├── processors/ # 打印处理器
│ └── winprint/ # Windows 打印处理器
├── providers/ # 打印提供程序
│ ├── localspl/ # 本地打印提供程序
│ └── win32spl/ # Win32 打印提供程序
└── include/ # 共享头文件
11. 图形输出管线
完整的图形输出管线从应用程序到显示硬件:
应用程序 (Application)
│
│ 调用 GDI32 API (如 TextOut, BitBlt, Rectangle)
▼
GDI32 (用户模式)
│
│ 封装参数,可选的批处理缓冲
│ 通过系统调用进入内核 (NtGdi*)
▼
ntgdi (内核模式)
│
│ 解析句柄,锁定对象 (DC, 位图等)
│ 坐标变换 (世界空间 → 页面空间 → 设备空间)
│ 裁剪 (可见区域、API 裁剪区域)
│ 调用 GDI 引擎
▼
GDI Engine (eng/)
│
│ 检查设备能力 (flGraphicsCaps)
│ 决定使用硬件加速还是软件渲染
│ 如果驱动支持 → 调用 DDI 回调 (DrvBitBlt 等)
│ 否则 → 使用 DIB 引擎软件渲染
▼
┌──────────────────────────────────────────────────┐
│ 软件渲染路径: │
│ DIB 引擎 (dib/) │
│ ↓ │
│ DIB 函数表查找 (按位图格式) │
│ ↓ │
│ 对应色深的渲染函数 (DIB_32BPP_BitBlt 等) │
│ ↓ │
│ 写入像素数据到表面 │
│ │
│ 硬件加速路径: │
│ DDI 回调 (DrvBitBlt) │
│ ↓ │
│ 显示驱动 (framebuf/vga) │
│ ↓ │
│ 直接操作帧缓冲或硬件寄存器 │
└──────────────────────────────────────────────────┘
│
▼
显示设备 (屏幕/打印机)
12. 构建系统结构
GDI 子系统被编译为 win32k.sys(内核模式)和 gdi32.dll(用户模式)。
win32k.sys 构成(来自 win32ss/CMakeLists.txt(file:///d:/reactos/win32ss/CMakeLists.txt)):
GDI 引擎 (eng/):
bitblt.c, bitblt_new.c, clip.c, device.c, driverobj.c,
engbrush.c, engevent.c, engmisc.c, engwindow.c, error.c,
float.c, gradient.c, ldevobj.c, lineto.c, mapping.c,
math.c, mdevobj.c, mem.c, mouse.c, multidisp.c,
paint.c, pandisp.c, pathobj.c, pdevobj.c, perfcnt.c,
rlecomp.c, semaphor.c, sort.c, stretchblt.c, string.c,
surface.c, transblt.c, xlateobj.c, debug.c, copybits.c,
alphablend.c, stubs.c, umpdstubs.c, drvdbg.c
DIB 引擎 (dib/):
alphablend.c, dib.c, dib1bpp.c, dib4bpp.c, dib8bpp.c,
dib16bpp.c, dib24bpp.c, dib32bpp.c, dib_new.c, floodfill.c,
stretchblt.c, dib24bppc.c, dib32bppc.c
DIB 库 (diblib/):
DibLib.c (条件编译 USE_DIBLIB)
ntgdi (内核 GDI):
arc.c, bezier.c, bitblt.c, bitmaps.c, brush.cpp, cliprgn.c,
coord.c, d3dkmt.c, dcattr.c, dclife.c, dcobjs.c, dcstate.c,
dcutil.c, device.c, dibobj.c, drawing.c, fillshap.c, font.c,
freetype.c, gdibatch.c, gdidbg.c, gdiobj.c, gdipool.c, icm.c,
init.c, line.c, metafile.c, palette.c, path.c, pen.c,
polyfill.c, print.c, rect.c, region.c, stockobj.c, text.c,
utils.c, wingl.c, xformobj.c, gdikdbgext.c
DirectX (reactx/):
ntddraw/ddraw.c, dd.c, ddsurf.c, d3d.c, d3dkmt.c, dvp.c,
mocomp.c, eng.c, dxeng.c
gdi32.dll 构成:
objects/: dc.c, bitmap.c, brush.c, pen.c, region.c, font.c,
palette.c, path.c, painting.c, arc.c, coord.c, text.c,
gdiobj.c, eng.c, printdrv.c, colorspace.c, enhmfile.c,
metafile.c, icm.c, clientobj.c, efloat.c, linedda.c,
utils.c
misc/: gdientry.c, heap.c, misc.c, historic.c, wingl.c
wine/: emfdc.c, emfdrv.c, enhmetafile.c, metadc.c, metafile.c,
path.c, rosglue.c
enhmfdrv/: bitblt.c, dc.c, graphics.c, init.c, objects.c
mfdrv/: bitblt.c, dc.c, graphics.c, init.c, objects.c, text.c
附录:关键文件索引
GDI 引擎 (eng/)
| 文件 | 功能 |
|---|---|
| eng.h(file:///d:/reactos/win32ss/gdi/eng/eng.h) | 引擎核心 API 声明 |
| surface.h(file:///d:/reactos/win32ss/gdi/eng/surface.h) | SURFACE 结构定义 |
| surface.c(file:///d:/reactos/win32ss/gdi/eng/surface.c) | 表面管理实现 |
| engobjects.h(file:///d:/reactos/win32ss/gdi/eng/engobjects.h) | 扩展 GDI 对象(XCLIPOBJ、EWNDOBJ) |
| pdevobj.h(file:///d:/reactos/win32ss/gdi/eng/pdevobj.h) | PDEVOBJ 结构定义 |
| pdevobj.c(file:///d:/reactos/win32ss/gdi/eng/pdevobj.c) | 物理设备对象管理 |
| ldevobj.h(file:///d:/reactos/win32ss/gdi/eng/ldevobj.h) | LDEVOBJ 结构定义 |
| ldevobj.c(file:///d:/reactos/win32ss/gdi/eng/ldevobj.c) | 逻辑设备对象管理 |
| mdevobj.h(file:///d:/reactos/win32ss/gdi/eng/mdevobj.h) | MDEVOBJ 结构定义 |
| mdevobj.c(file:///d:/reactos/win32ss/gdi/eng/mdevobj.c) | 映射设备对象管理 |
| driverobj.h(file:///d:/reactos/win32ss/gdi/eng/driverobj.h) | 驱动对象结构 |
| driverobj.c(file:///d:/reactos/win32ss/gdi/eng/driverobj.c) | 驱动对象管理 |
| bitblt.c(file:///d:/reactos/win32ss/gdi/eng/bitblt.c) | BitBlt 核心实现 |
| bitblt_new.c(file:///d:/reactos/win32ss/gdi/eng/bitblt_new.c) | 新版 BitBlt(DIB 库接口) |
| clip.c(file:///d:/reactos/win32ss/gdi/eng/clip.c) | 裁剪管理 |
| device.c(file:///d:/reactos/win32ss/gdi/eng/device.c) | 设备管理 |
| inteng.h(file:///d:/reactos/win32ss/gdi/eng/inteng.h) | 内部引擎接口 |
内核模式 GDI (ntgdi/)
| 文件 | 功能 |
|---|---|
| intgdi.h(file:///d:/reactos/win32ss/gdi/ntgdi/intgdi.h) | ntgdi 内部接口 |
| gdiobj.h(file:///d:/reactos/win32ss/gdi/ntgdi/gdiobj.h) | GDI 对象管理(句柄表、BASEOBJECT) |
| gdiobj.c(file:///d:/reactos/win32ss/gdi/ntgdi/gdiobj.c) | GDI 对象操作实现 |
| dc.h(file:///d:/reactos/win32ss/gdi/ntgdi/dc.h) | DC 结构定义 |
| dcattr.c(file:///d:/reactos/win32ss/gdi/ntgdi/dcattr.c) | DC 属性管理 |
| dclife.c(file:///d:/reactos/win32ss/gdi/ntgdi/dclife.c) | DC 生命周期 |
| dcobjs.c(file:///d:/reactos/win32ss/gdi/ntgdi/dcobjs.c) | DC 对象选择 |
| init.c(file:///d:/reactos/win32ss/gdi/ntgdi/init.c) | GDI 初始化 |
| bitblt.c(file:///d:/reactos/win32ss/gdi/ntgdi/bitblt.c) | BitBlt 系统调用 |
| drawing.c(file:///d:/reactos/win32ss/gdi/ntgdi/drawing.c) | 绘图操作 |
| gdipool.c(file:///d:/reactos/win32ss/gdi/ntgdi/gdipool.c) | GDI 内存池 |
| gdibatch.c(file:///d:/reactos/win32ss/gdi/ntgdi/gdibatch.c) | GDI 批处理 |
| baseobj.hpp(file:///d:/reactos/win32ss/gdi/ntgdi/baseobj.hpp) | 基对象 C++ 封装 |
用户模式 GDI32 (gdi32/)
| 文件 | 功能 |
|---|---|
| gdi32p.h(file:///d:/reactos/win32ss/gdi/gdi32/include/gdi32p.h) | GDI32 私有头文件 |
| gdientry.c(file:///d:/reactos/win32ss/gdi/gdi32/misc/gdientry.c) | DirectX 入口点 |
| dc.c(file:///d:/reactos/win32ss/gdi/gdi32/objects/dc.c) | DC 对象 |
| bitmap.c(file:///d:/reactos/win32ss/gdi/gdi32/objects/bitmap.c) | 位图对象 |
| brush.c(file:///d:/reactos/win32ss/gdi/gdi32/objects/brush.c) | 画刷对象 |
| pen.c(file:///d:/reactos/win32ss/gdi/gdi32/objects/pen.c) | 画笔对象 |
| region.c(file:///d:/reactos/win32ss/gdi/gdi32/objects/region.c) | 区域对象 |
| font.c(file:///d:/reactos/win32ss/gdi/gdi32/objects/font.c) | 字体对象 |
| gdiobj.c(file:///d:/reactos/win32ss/gdi/gdi32/objects/gdiobj.c) | GDI 对象管理 |
共享头文件
| 文件 | 功能 |
|---|---|
| ntgdityp.h(file:///d:/reactos/win32ss/include/ntgdityp.h) | GDI 系统调用类型定义 |
| ntgdihdl.h(file:///d:/reactos/win32ss/include/ntgdihdl.h) | GDI 句柄管理 |
| callback.h(file:///d:/reactos/win32ss/include/callback.h) | 回调定义 |
| ntwin32.h(file:///d:/reactos/win32ss/include/ntwin32.h) | Win32 内核类型定义 |
| gdi_driver.h(file:///d:/reactos/win32ss/gdi/gdi32/include/wine/gdi_driver.h) | GDI 驱动接口 |
显示驱动
| 文件 | 功能 |
|---|---|
| framebuf.h(file:///d:/reactos/win32ss/drivers/displays/framebuf/framebuf.h) | Framebuffer PDEV 结构 |
| enable.c(file:///d:/reactos/win32ss/drivers/displays/framebuf/enable.c) | 驱动初始化 |
| screen.c(file:///d:/reactos/win32ss/drivers/displays/framebuf/screen.c) | 屏幕操作 |
| surface.c(file:///d:/reactos/win32ss/drivers/displays/framebuf/surface.c) | 表面管理 |
本文档基于 ReactOS 源代码分析,涵盖截至 2026 年 8 月的代码结构。
主要分析目录:
win32ss/gdi/、win32ss/drivers/、win32ss/reactx/、win32ss/printing/