Reactos 显示驱动层详细分析

显示驱动层详细分析

1. 概述

显示驱动层(win32ss/drivers/)是 ReactOS Win32 子系统的底层图形基础设施,负责将 GDI 图形命令转换为硬件操作。该层采用 DDI(Device Driver Interface) 架构,遵循 Windows NT Display Driver Model(DDM)规范。

核心职责

  • 管理显示硬件资源(帧缓冲、调色板、显示模式)
  • 将 GDI 绘图命令转换为硬件操作
  • 处理鼠标指针显示
  • 管理字体渲染

架构分层

复制代码
┌─────────────────────────────────────────────────────────────┐
│                      GDI Engine (内核态)                     │
│              win32ss/gdi/eng/device.c                       │
├─────────────────────────────────────────────────────────────┤
│              DDI Interface (设备驱动接口)                     │
│    DrvEnablePDEV / DrvEnableSurface / DrvBitBlt / ...       │
├─────────────────────────────────────────────────────────────┤
│              Display Drivers (显示驱动)                       │
│    ┌──────────┐  ┌──────────┐  ┌──────────┐                 │
│    │  framebuf │  │   vga    │  │  vga_new │                 │
│    └──────────┘  └──────────┘  └──────────┘                 │
├─────────────────────────────────────────────────────────────┤
│              Miniport Drivers (微型端口驱动)                   │
│    ┌──────────┐  ┌──────────┐  ┌──────────┐                 │
│    │   vga    │  │   vbe    │  │  bochs   │                 │
│    └──────────┘  └──────────┘  └──────────┘                 │
├─────────────────────────────────────────────────────────────┤
│                      Video Port Driver                       │
│              win32ss/drivers/videoprt/                       │
└─────────────────────────────────────────────────────────────┘

2. 目录结构

复制代码
drivers/
├── displays/                  # 显示驱动(用户态/内核态 DLL)
│   ├── framebuf/              # 通用帧缓冲驱动
│   │   ├── enable.c           # 驱动入口、PDEV 管理
│   │   ├── ddenable.c         # DirectDraw 启用
│   │   ├── dd.c               # DirectDraw 实现
│   │   ├── screen.c           # 屏幕模式、初始化
│   │   ├── surface.c          # 表面管理
│   │   ├── palette.c          # 调色板管理
│   │   ├── pointer.c          # 鼠标指针
│   │   └── framebuf.h         # 驱动数据结构定义
│   ├── vga/                   # 传统 VGA 驱动
│   │   ├── main/enable.c      # 驱动入口
│   │   ├── objects/           # 绘图对象实现
│   │   │   ├── screen.c       # 屏幕初始化
│   │   │   ├── bitblt.c       # 位图块传输
│   │   │   ├── copybits.c     # 位复制
│   │   │   ├── lineto.c       # 画线
│   │   │   ├── offscreen.c    # 屏幕外内存
│   │   │   ├── paint.c        # 绘制
│   │   │   ├── pointer.c      # 指针
│   │   │   └── transblt.c     # 透明传输
│   │   ├── vgavideo/          # VGA 视频接口
│   │   ├── vgaddi.h           # 驱动数据结构定义
│   │   └── vgaddi.rc          # 资源文件
│   └── vga_new/               # 新版 VGA 驱动
│       ├── enable.c           # 驱动入口
│       ├── screen.c           # 屏幕管理
│       ├── palette.c          # 调色板
│       ├── debug.c            # 调试支持
│       └── driver.h           # 驱动定义
├── font/                      # 字体驱动
│   ├── bmfd/                  # 位图字体驱动
│   │   ├── enable.c           # 驱动入口
│   │   ├── font.c             # 字体管理
│   │   ├── glyph.c            # 字形处理
│   │   └── bmfd.h             # 数据结构定义
│   └── ftfd/                  # FreeType 字体驱动
│       ├── enable.c           # 驱动入口(初始化 FreeType)
│       ├── font.c             # 字体管理
│       ├── glyph.c            # 字形处理
│       ├── rosglue.c          # ReactOS 粘合层
│       ├── sprintf.c          # 字符串格式化
│       └── ftfd.h             # 数据结构定义
├── miniport/                  # 显示微型端口驱动(内核态)
│   ├── vga/                   # VGA 微型端口
│   ├── vga_new/               # 新版 VGA 微型端口
│   ├── vbe/                   # VBE (VESA BIOS Extensions)
│   ├── bochs/                 # Bochs 仿真器显示
│   ├── vmx_svga/              # VMware SVGA
│   ├── pc98vid/               # PC-98 显示
│   └── xboxvmp/               # Xbox 显示
├── videoprt/                  # 视频端口驱动框架
└── watchdog/                  # 显示看门狗驱动

3. Framebuf 显示驱动

3.1 概述

framebuf 是一个通用帧缓冲显示驱动,实现了最基本的显示功能,适用于任何提供线性帧缓冲的显示硬件。它是 ReactOS 默认使用的显示驱动之一。

3.2 核心数据结构

PDEV 结构framebuf.h:33-68(file:///d:/reactos/win32ss/drivers/displays/framebuf/framebuf.h#L33-L68)):

c 复制代码
typedef struct _PDEV
{
   HANDLE hDriver;              // 微型端口驱动句柄
   HDEV hDevEng;                // GDI 引擎句柄
   HSURF hSurfEng;              // 表面句柄
   ULONG ModeIndex;             // 当前显示模式索引
   ULONG ScreenWidth;           // 屏幕宽度(像素)
   ULONG ScreenHeight;          // 屏幕高度(像素)
   ULONG ScreenDelta;           // 行间距(字节)
   BYTE BitsPerPixel;           // 每像素位数
   ULONG RedMask;               // 红色通道掩码
   ULONG GreenMask;             // 绿色通道掩码
   ULONG BlueMask;              // 蓝色通道掩码
   BYTE PaletteShift;           // 调色板移位
   PVOID ScreenPtr;             // 帧缓冲指针
   HPALETTE DefaultPalette;     // 默认调色板句柄
   PALETTEENTRY *PaletteEntries;// 调色板条目数组

   /* DirectX Support */
   DWORD iDitherFormat;         // 抖动格式
   ULONG MemHeight;             // 显存高度
   ULONG MemWidth;              // 显存宽度
   DWORD dwHeap;                // DirectDraw 堆
   VIDEOMEMORY* pvmList;        // 显存列表
   BOOL bDDInitialized;         // DirectDraw 是否已初始化
   DDPIXELFORMAT ddpfDisplay;   // 显示像素格式
} PDEV, *PPDEV;

3.3 驱动函数表

DRVFN 表enable.c:23-38(file:///d:/reactos/win32ss/drivers/displays/framebuf/enable.c#L23-L38)):

索引 函数名 功能描述
INDEX_DrvEnablePDEV DrvEnablePDEV 创建并初始化物理设备描述符
INDEX_DrvCompletePDEV DrvCompletePDEV 完成 PDEV 初始化,保存 GDI 句柄
INDEX_DrvDisablePDEV DrvDisablePDEV 释放 PDEV 资源
INDEX_DrvEnableSurface DrvEnableSurface 启用显示表面
INDEX_DrvDisableSurface DrvDisableSurface 禁用显示表面
INDEX_DrvAssertMode DrvAssertMode 切换显示模式
INDEX_DrvGetModes DrvGetModes 获取支持的显示模式列表
INDEX_DrvSetPalette DrvSetPalette 设置调色板
INDEX_DrvSetPointerShape DrvSetPointerShape 设置鼠标指针形状
INDEX_DrvMovePointer DrvMovePointer 移动鼠标指针
INDEX_DrvEnableDirectDraw DrvEnableDirectDraw 启用 DirectDraw 支持
INDEX_DrvDisableDirectDraw DrvDisableDirectDraw 禁用 DirectDraw 支持

3.4 初始化流程

复制代码
DrvEnableDriver()
    ├── 填写 DRVENABLEDATA(驱动版本、函数表)
    └── 返回 TRUE

DrvEnablePDEV()
    ├── EngAllocMem() 分配 PDEV 结构
    ├── IntInitScreenInfo() 初始化屏幕信息
    ├── IntInitDefaultPalette() 初始化默认调色板
    ├── 返回 DHPDEV(PDEV 指针)
    └── 失败则 EngFreeMem() 释放并返回 NULL

DrvCompletePDEV()
    └── 保存 GDI 引擎句柄到 PDEV->hDevEng

3.5 显示模式获取

GetAvailableModes()screen.c:34-80(file:///d:/reactos/win32ss/drivers/displays/framebuf/screen.c#L34-L80)):

  1. 通过 EngDeviceIoControl() 发送 IOCTL_VIDEO_QUERY_NUM_AVAIL_MODES 获取模式数量
  2. 分配缓冲区存储模式信息
  3. 通过 EngDeviceIoControl() 发送 IOCTL_VIDEO_QUERY_AVAIL_MODES 获取完整模式列表
  4. 返回模式数量

4. VGA 显示驱动

4.1 概述

vga 是传统的 VGA 显示驱动,支持标准 VGA 硬件特性,包括:

  • 平面模式(Planar)显示(4 个 64KB 平面)
  • 调色板管理
  • 硬件鼠标指针
  • 屏幕外内存管理
  • 复杂的 BitBlt 操作

4.2 核心数据结构

PDEV 结构vgaddi.h:103-144(file:///d:/reactos/win32ss/drivers/displays/vga/vgaddi.h#L103-L144)):

c 复制代码
typedef struct _PDEV
{
  ULONG fl;                         // 驱动标志
  HANDLE KMDriver;                  // 内核模式驱动句柄
  HDEV GDIDevHandle;                // GDI 引擎句柄
  HSURF SurfHandle;                 // 表面句柄
  PVOID AssociatedSurf;             // 关联表面

  // 光标相关
  XYPAIR xyHotSpot;                 // 光标热点
  PVIDEO_POINTER_ATTRIBUTES pPointerAttributes; // 硬件指针属性
  PSAVED_SCREEN_BITS ImageBehindCursor; // 光标背后保存的屏幕数据
  ULONG XorMaskStartOffset;         // 硬件指针 XOR 掩码偏移

  // 显示模式
  ULONG ModeNum;                    // 当前 VGA 模式索引
  SIZEL sizeSurf;                   // 表面显示尺寸
  PBYTE fbScreen;                   // 帧缓冲指针
  RECTL SavedBitsRight;             // 屏幕右侧不可见区域
  RECTL SavedBitsBottom;            // 屏幕底部不可见区域
  BOOL BitsSaved;                   // 是否已保存屏幕数据
  SIZEL sizeMem;                    // 实际显存尺寸(像素)
  LONG NumScansUsedByPointer;       // 指针使用的扫描线数
} PDEV, *PPDEV;

DEVSURF 结构vgaddi.h:163-228(file:///d:/reactos/win32ss/drivers/displays/vga/vgaddi.h#L163-L228)):

VGA 驱动特有的表面结构,支持内存分页(Banking)机制:

c 复制代码
typedef struct _DEVSURF
{
  IDENT ident;                      // 调试标识符
  ULONG flSurf;                     // 表面标志(DS_SOLIDBRUSH, DS_BRUSH, DS_DIB 等)
  BYTE Color;                       // 纯色表面颜色
  BYTE Format;                      // BMF_*, BMF_PHYSDEVICE
  PPDEV ppdev;                      // 关联的 PDEV
  SIZEL sizeSurf;                   // 表面尺寸
  ULONG NextScan;                   // 扫描线间距
  ULONG NextPlane;                  // 平面间距
  PVOID Scan0;                      // 扫描线 0 指针
  PVOID StartBmp;                   // 位图起始指针

  // 分页变量(仅用于分页 VGA 表面)
  PVIDEO_BANK_SELECT BankSelectInfo; // 分页选择信息
  ULONG Bank2RWSkip;                // 双读写窗口分页偏移
  VIDEO_BANK_TYPE BankingType;      // 分页类型
  ULONG BitmapSize;                 // 位图大小
  PFN_BankControl pfnBankControl;   // 分页控制函数指针
  PBANK_INFO BankInfo;              // 分页信息数组

  // 临时缓冲区(用于分页操作)
  PVOID BankBufferPlane0;           // 平面 0 临时缓冲区
  PVOID BankBufferPlane1;           // 平面 1 临时缓冲区
  PVOID BankBufferPlane2;           // 平面 2 临时缓冲区
  PVOID BankBufferPlane3;           // 平面 3 临时缓冲区
} DEVSURF, *PDEVSURF;

4.3 分页机制

VGA 硬件的显存通常通过内存分页访问,因为早期 VGA 只有 256KB 显存,但地址空间只有 64KB。驱动通过切换不同的内存页来访问全部显存。

分页模式

  • 单窗口模式:使用一个 64KB 窗口访问显存
  • 双窗口模式:使用两个 64KB 窗口,支持同时访问不同区域

4.4 绘图对象实现

VGA 驱动提供了完整的绘图原语实现:

文件 功能
bitblt.c(file:///d:/reactos/win32ss/drivers/displays/vga/objects/bitblt.c) 位图块传输,支持源/目标裁剪、颜色转换
copybits.c(file:///d:/reactos/win32ss/drivers/displays/vga/objects/copybits.c) 位复制操作
lineto.c(file:///d:/reactos/win32ss/drivers/displays/vga/objects/lineto.c) 画线算法实现
offscreen.c(file:///d:/reactos/win32ss/drivers/displays/vga/objects/offscreen.c) 屏幕外内存管理,用于存储光标背后的数据
paint.c(file:///d:/reactos/win32ss/drivers/displays/vga/objects/paint.c) 填充和绘制操作
transblt.c(file:///d:/reactos/win32ss/drivers/displays/vga/objects/transblt.c) 透明块传输

4.5 默认调色板

VGA 16 色调色板screen.c:11-36(file:///d:/reactos/win32ss/drivers/displays/vga/objects/screen.c#L11-L36)):

索引 RGB 值 颜色
0 0x000000 黑色
1 0x2A0015 红色
2 0x002A15 绿色
3 0x2A2A15 棕色
4 0x00002A 蓝色
5 0x2A152A 品红
6 0x152A2A 青色
7 0x212223 深灰
8 0x303132 浅灰
9 0x3F0000 亮红
10 0x003F00 亮绿
11 0x3F3F00 亮黄
12 0x00003F 亮蓝
13 0x3F003F 亮品红
14 0x003F3F 亮青
15 0x3F3F3F 白色

5. VGA_New 显示驱动

5.1 概述

vga_new 是 VGA 驱动的现代化重写版本,提供更清晰的代码结构和更好的硬件支持。

5.2 核心特点

  • 支持 VBE(VESA BIOS Extensions)模式设置
  • 支持多种显示分辨率和颜色深度
  • 简化的代码结构
  • 更好的调试支持

5.3 文件结构

文件 功能
enable.c(file:///d:/reactos/win32ss/drivers/displays/vga_new/enable.c) 驱动入口和初始化
screen.c(file:///d:/reactos/win32ss/drivers/displays/vga_new/screen.c) 屏幕模式管理
palette.c(file:///d:/reactos/win32ss/drivers/displays/vga_new/palette.c) 调色板管理
debug.c(file:///d:/reactos/win32ss/drivers/displays/vga_new/debug.c) 调试输出支持
driver.h(file:///d:/reactos/win32ss/drivers/displays/vga_new/driver.h) 数据结构定义

6. 字体驱动

6.1 BMFD - 位图字体驱动

6.1.1 概述

bmfd(Bitmap Font Driver)是 GDI 字体驱动,用于处理位图字体 格式(.FON.FNT 文件)。

6.1.2 支持的字体格式
  • FON:字体资源 DLL,包含多个字体
  • FNT:单个字体文件
6.1.3 核心数据结构

BMFD_FACE 结构bmfd.h:206-231(file:///d:/reactos/win32ss/drivers/font/bmfd/bmfd.h#L206-L231)):

c 复制代码
typedef struct
{
    PFONTDIRENTRY pFontDirEntry;   // 字体目录条目
    PFONTINFO16 pFontInfo;          // 字体信息
    PBYTE pCharTable;               // 字符表
    ULONG cjEntrySize;              // 条目大小
    ULONG ulVersion;                // 版本号
    PCHAR pszFaceName;              // 字体名称
    PCHAR pszCopyright;             // 版权信息
    ULONG cGlyphs;                  // 字形数量
    CHAR chFirstChar;               // 首字符(ANSI)
    CHAR chLastChar;                // 末字符(ANSI)
    WCHAR wcFirstChar;              // 首字符(Unicode)
    WCHAR wcLastChar;               // 末字符(Unicode)
    WORD wPixHeight;                // 像素高度
    WORD wPixWidth;                 // 像素宽度
    WORD wWidthBytes;               // 每行字节数
    WORD wA, wB, wC;                // ABC 字符间距
    WORD wAscent;                   // 上升高度
    WORD wDescent;                  // 下降高度
    FLONG flInfo;                   // 字体标志
} BMFD_FACE, *PBMFD_FACE;

BMFD_FILE 结构bmfd.h:233-241(file:///d:/reactos/win32ss/drivers/font/bmfd/bmfd.h#L233-L241)):

c 复制代码
typedef struct
{
    PVOID pvView;                   // 文件映射视图
    ULONG_PTR iFile;                // 文件索引
    PFONTGROUPHDR pFontDir;         // 字体组头
    FONTTYPE ulFontType;            // 字体类型(FON/FNT)
    ULONG cNumFaces;                // 字体数量
    BMFD_FACE aface[1];             // 字体数组
} BMFD_FILE, *PBMFD_FILE;
6.1.4 驱动函数表

DRVFN 表enable.c:10-25(file:///d:/reactos/win32ss/drivers/font/bmfd/enable.c#L10-L25)):

索引 函数名 功能描述
INDEX_DrvEnablePDEV BmfdEnablePDEV 创建 PDEV
INDEX_DrvCompletePDEV BmfdCompletePDEV 完成 PDEV 初始化
INDEX_DrvDisablePDEV BmfdDisablePDEV 释放 PDEV
INDEX_DrvLoadFontFile BmfdLoadFontFile 加载字体文件
INDEX_DrvUnloadFontFile BmfdUnloadFontFile 卸载字体文件
INDEX_DrvQueryFontFile BmfdQueryFontFile 查询字体文件信息
INDEX_DrvQueryFontCaps BmfdQueryFontCaps 查询字体能力
INDEX_DrvQueryFontTree BmfdQueryFontTree 查询字体树
INDEX_DrvQueryFont BmfdQueryFont 查询字体信息
INDEX_DrvFree BmfdFree 释放资源
INDEX_DrvQueryGlyphAttrs BmfdQueryGlyphAttrs 查询字形属性
INDEX_DrvQueryFontData BmfdQueryFontData 查询字体数据
INDEX_DrvDestroyFont BmfdDestroyFont 销毁字体
6.1.5 字体加载流程
复制代码
BmfdLoadFontFile()
    ├── 解析字体文件格式(FON/FNT)
    ├── 映射文件到内存
    ├── 解析字体目录和字体信息
    ├── 创建 BMFD_FILE 结构
    ├── 返回文件索引
    └── 失败返回 0

BmfdQueryFont()
    ├── 根据文件索引和字体索引查找 BMFD_FACE
    ├── 构建 IFIMETRICS 结构
    ├── 返回字体指标信息
    └── 失败返回 NULL

BmfdQueryFontData()
    ├── 根据字体对象和字形句柄获取字形数据
    ├── 返回字形位图
    └── 失败返回错误码

6.2 FTFD - FreeType 字体驱动

6.2.1 概述

ftfd(FreeType Font Driver)是基于 FreeType 2 库的字体驱动,支持 TrueType、OpenType、Type 1 等矢量字体格式。

6.2.2 核心数据结构

FTFD_FILE 结构ftfd.h:32-39(file:///d:/reactos/win32ss/drivers/font/ftfd/ftfd.h#L32-L39)):

c 复制代码
typedef struct
{
    PVOID pvView;                   // 文件映射视图
    ULONG cjView;                   // 视图大小
    ULONG_PTR iFile;                // 文件索引
    ULONG cNumFaces;                // 字体数量
    FT_Face aftface[1];             // FreeType Face 对象数组
} FTFD_FILE, *PFTFD_FILE;

FTFD_IFIMETRICS 结构ftfd.h:43-51(file:///d:/reactos/win32ss/drivers/font/ftfd/ftfd.h#L43-L51)):

c 复制代码
typedef struct
{
    IFIMETRICS ifim;                // GDI 字体指标
    BYTE ajCharSet[16];             // 字符集
    FONTSIM fontsim;                // 字体模拟(加粗/倾斜)
    WCHAR wszFamilyName[LF_FACESIZE]; // 字体族名
    WCHAR wszFaceName[LF_FACESIZE];   // 字体名称
    WCHAR wszStyleName[MAX_STYLESIZE]; // 样式名称
} FTFD_IFIMETRICS, *PFTFD_IFIMETRICS;
6.2.3 初始化流程

FtfdEnableDriver()enable.c:29-61(file:///d:/reactos/win32ss/drivers/font/ftfd/enable.c#L29-L61)):

c 复制代码
BOOL APIENTRY FtfdEnableDriver(
    ULONG iEngineVersion,
    ULONG cj,
    PDRVENABLEDATA pded)
{
    FT_Error fterror;

    // 初始化 FreeType 库
    fterror = FT_Init_FreeType(&gftlibrary);
    if (fterror) {
        return FALSE;
    }

    // 填写驱动信息
    pded->c = sizeof(gadrvfn) / sizeof(DRVFN);
    pded->pdrvfn = gadrvfn;
    pded->iDriverVersion = DDI_DRIVER_VERSION_NT5;

    return TRUE;
}
6.2.4 关键组件
文件 功能
enable.c(file:///d:/reactos/win32ss/drivers/font/ftfd/enable.c) 驱动入口,初始化 FreeType 库
font.c(file:///d:/reactos/win32ss/drivers/font/ftfd/font.c) 字体文件加载、查询和管理
glyph.c(file:///d:/reactos/win32ss/drivers/font/ftfd/glyph.c) 字形渲染和数据提取
rosglue.c(file:///d:/reactos/win32ss/drivers/font/ftfd/rosglue.c) ReactOS 与 FreeType 之间的粘合层
sprintf.c(file:///d:/reactos/win32ss/drivers/font/ftfd/sprintf.c) 轻量级字符串格式化(避免依赖标准库)
6.2.5 字形渲染流程
复制代码
FtfdQueryFontData()
    ├── 获取 FONTOBJ 关联的 FT_Face
    ├── 使用 FT_Load_Glyph() 加载字形
    ├── 使用 FT_Render_Glyph() 渲染到位图
    ├── 将 FreeType 位图转换为 GDI GLYPHDATA
    └── 返回字形数据

FtfdQueryGlyphAttrs()
    ├── 获取字形属性(宽度、高度、间距等)
    ├── 构建 FD_GLYPHATTR 结构
    └── 返回属性信息

7. 显示驱动架构设计

7.1 DDI 接口标准

显示驱动遵循 Windows NT DDI(Device Driver Interface) 标准:

核心接口函数

类别 函数 用途
设备管理 DrvEnableDriver, DrvEnablePDEV, DrvDisablePDEV 驱动加载/卸载、设备创建/销毁
表面管理 DrvEnableSurface, DrvDisableSurface 显示表面创建/销毁
显示模式 DrvGetModes, DrvAssertMode 获取/设置显示模式
调色板 DrvSetPalette, DrvRealizePalette 调色板管理
指针 DrvSetPointerShape, DrvMovePointer 鼠标指针管理
绘图 DrvBitBlt, DrvStretchBlt, DrvLineTo 图形绘制原语
字体 DrvLoadFontFile, DrvQueryFont, DrvQueryFontData 字体管理和渲染

7.2 驱动加载流程

复制代码
GDI Engine
    ├── 读取注册表获取驱动列表
    ├── 调用 DrvEnableDriver() 加载驱动
    ├── 调用 DrvEnablePDEV() 创建物理设备
    ├── 调用 DrvEnableSurface() 创建显示表面
    ├── 调用 DrvAssertMode() 设置显示模式
    └── 驱动就绪,开始处理绘图命令

7.3 绘图命令处理流程

复制代码
应用程序
    ├── 调用 GDI API(如 BitBlt)
    └── GDI32.DLL 打包命令并发送到内核

GDI Engine (内核态)
    ├── 接收批处理命令
    ├── 解析命令参数
    ├── 调用驱动对应的 DDI 函数
    └── 驱动执行实际硬件操作

Display Driver
    ├── 接收 DDI 调用
    ├── 执行绘图操作(写入帧缓冲)
    └── 返回结果

8. 微型端口驱动层

8.1 概述

微型端口驱动(miniport/)是内核态驱动,直接与显示硬件交互,提供底层硬件访问能力。

8.2 支持的硬件

驱动 目标硬件 特点
vgamp(file:///d:/reactos/win32ss/drivers/miniport/vga) 标准 VGA 硬件 支持 VGA 文本和图形模式
vgamp_new(file:///d:/reactos/win32ss/drivers/miniport/vga_new) 新版 VGA 硬件 支持 VBE 模式设置
vbemp(file:///d:/reactos/win32ss/drivers/miniport/vbe) VESA 兼容显卡 支持高分辨率模式
bochsmp(file:///d:/reactos/win32ss/drivers/miniport/bochs) Bochs 仿真器 使用 Bochs 显示接口
vmx_svga(file:///d:/reactos/win32ss/drivers/miniport/vmx_svga) VMware SVGA 虚拟机加速显示
pc98vid(file:///d:/reactos/win32ss/drivers/miniport/pc98vid) PC-98 兼容机 日本 PC-98 架构
xboxvmp(file:///d:/reactos/win32ss/drivers/miniport/xboxvmp) Xbox 游戏主机 Xbox 显示硬件

8.3 视频端口驱动框架

videoprt/ 提供了微型端口驱动的基础设施:

文件 功能
videoprt.c(file:///d:/reactos/win32ss/drivers/videoprt/videoprt.c) 视频端口驱动主入口
dispatch.c(file:///d:/reactos/win32ss/drivers/videoprt/dispatch.c) IOCTL 分发处理
services.c(file:///d:/reactos/win32ss/drivers/videoprt/services.c) 服务例程
resource.c(file:///d:/reactos/win32ss/drivers/videoprt/resource.c) 资源管理
int10.c(file:///d:/reactos/win32ss/drivers/videoprt/int10.c) BIOS INT10 调用支持
event.c(file:///d:/reactos/win32ss/drivers/videoprt/event.c) 事件处理
timer.c(file:///d:/reactos/win32ss/drivers/videoprt/timer.c) 定时器支持
agp.c(file:///d:/reactos/win32ss/drivers/videoprt/agp.c) AGP 支持

9. 总结

9.1 显示驱动层架构特点

特点 说明
DDI 标准兼容 遵循 Windows NT DDI 接口规范,与 Windows 驱动兼容
分层设计 显示驱动(用户态)→ 微型端口驱动(内核态)→ 硬件
多驱动支持 支持 framebuf、vga、vga_new 等多种驱动
分页机制 VGA 驱动支持内存分页访问,突破 64KB 地址限制
DirectDraw 支持 framebuf 驱动提供基础 DirectDraw 支持

9.2 字体驱动层架构特点

特点 说明
双驱动架构 BMFD(位图字体)+ FTFD(矢量字体)
FreeType 集成 FTFD 基于 FreeType 2,支持多种矢量字体格式
FON/FNT 支持 BMFD 支持传统 Windows 位图字体格式
GDI 兼容 通过 DDI 接口与 GDI 引擎无缝集成

9.3 关键数据结构对比

结构 驱动 核心用途
PDEV framebuf 物理设备描述,包含屏幕参数和 DirectDraw 信息
PDEV vga 物理设备描述,支持分页和硬件指针
DEVSURF vga 设备表面描述,支持平面模式和分页
BMFD_FACE bmfd 位图字体面描述
FTFD_FILE ftfd FreeType 字体文件描述

9.4 设计优势

  1. 硬件抽象:通过 DDI 接口隔离硬件差异,上层代码无需关心具体硬件
  2. 模块化:显示驱动和字体驱动独立,可独立更新和替换
  3. 兼容性:遵循 Windows 标准,支持现有 Windows 驱动程序
  4. 可扩展性:通过微型端口驱动框架支持新硬件