ReactOS 图形系统架构分析

ReactOS 图形系统架构分析

目录

  1. 概述
  2. 整体架构分层
  3. [GDI 引擎 (eng/)](#GDI 引擎 (eng/))
  4. [内核模式 GDI (ntgdi/)](#内核模式 GDI (ntgdi/))
  5. [用户模式 GDI32 (gdi32/)](#用户模式 GDI32 (gdi32/))
  6. [DIB 引擎 (dib/ 和 diblib/)](#DIB 引擎 (dib/ 和 diblib/))
    • 6.1 [DIB 引擎架构](#DIB 引擎架构)
    • 6.2 [DIB 库 (diblib)](#DIB 库 (diblib))
    • 6.3 [DIB 函数表](#DIB 函数表)
  7. 显示驱动模型
    • 7.1 显示驱动架构
    • 7.2 [Framebuffer 显示驱动](#Framebuffer 显示驱动)
    • 7.3 [VGA 显示驱动](#VGA 显示驱动)
  8. 字体内核 (freetype)
  9. [DirectX 支持 (reactx/)](#DirectX 支持 (reactx/))
  10. 打印子系统 (printing/)
  11. 图形输出管线
  12. 构建系统结构

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_SURFACEMIRROR_SURFACEDIRECTDRAW_SURFACEDRIVER_CREATED_SURFACEDDB_SURFACEAPI_BITMAPPDEV_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)):

  • 位块传输EngBitBltIntEngBitBltIntEngMaskBltIntEngStretchBlt
  • 裁剪管理EngCreateClip、裁剪区域枚举
  • 表面管理EngCreateSurfaceEngModifySurface、表面锁定
  • 调色板EngCreatePalette
  • 设备管理:设备锁定、PDEV 管理
  • 同步原语EngAcquireSemaphoreEngAcquireSemaphoreShared
  • 内存管理EngSecureMemForReadEngAllocMemEngFreeMem
  • 事件EngCreateEventEngWaitForSingleObject
  • 坐标变换EngLineToEngStrokePathEngFillPath
  • 文本输出EngTextOutEngGetGlyphOutline
  • 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),包含所有显示驱动需要实现的回调函数,如 DrvEnablePDEVDrvEnableSurfaceDrvBitBltDrvTextOut 等。

核心函数:

  • 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 --- 直接 DC
  • DC_CANCELED --- 已取消
  • DC_ACCUM_WMGR --- 窗口管理器累积
  • DC_ACCUM_APP --- 应用程序累积
  • DC_TEMPINFODC --- 临时信息 DC
  • DC_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 --- 创建兼容 DC
  • GreDeleteDC --- 删除 DC
  • DC_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 --- 创建显示表面:

通过 EngCreateDeviceSurfaceEngModifySurface 创建引擎管理的表面,支持 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 等矢量字体
  • 实现 DrvEnableFontDrvGetGlyphMode 等 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/

相关推荐
黄俊懿17 小时前
【架构师从入门到进阶】第五章:DNS&CDN&网关优化思路——第三节:CDN扩展-多地址直连
网络·计算机网络·架构·系统架构·cdn·dns·架构设计
微三云 - 廖会灵 (私域系统开发)2 天前
抖店 OPC 自动化运营系统架构与商业代理分控体系完整解析
运维·系统架构·自动化
沫璃染墨2 天前
《Qt从零入门系列(一):Qt框架初识——从发展历史到跨平台开发》
c++·qt·系统架构·gui
微三云 - 廖会灵 (私域系统开发)2 天前
高并发私域团购系统架构实践:拆解良久团购模式下的五级分销与合规结算引擎
系统架构
youngerwang3 天前
【软件系统架构案例分析 Day 8】可用性战术:双活数据中心设计
系统架构·可用性战术·双活数据中心
youngerwang3 天前
【软件系统架构案例分析 Day 10】安全性战术:零信任架构在企业内网的应用
系统架构·零信任架构·安全性战术·企业内网intranet
ai_coder_ai3 天前
大模型应用系统架构设计及其应用
系统架构
郑州光合科技余经理3 天前
代驾系统架构拆解:订单链路、权限组织与私有化源码交付
开发语言·后端·算法·架构·系统架构·uni-app·php
BerryS3N3 天前
大模型 (LLM) 全栈技术深度解析与实战指南:从 Transformer 底层原理、三阶段训练范式到 RAG 与 Agent 系统架构
深度学习·系统架构·transformer