显示驱动层详细分析
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)):
- 通过
EngDeviceIoControl()发送IOCTL_VIDEO_QUERY_NUM_AVAIL_MODES获取模式数量 - 分配缓冲区存储模式信息
- 通过
EngDeviceIoControl()发送IOCTL_VIDEO_QUERY_AVAIL_MODES获取完整模式列表 - 返回模式数量
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 设计优势
- 硬件抽象:通过 DDI 接口隔离硬件差异,上层代码无需关心具体硬件
- 模块化:显示驱动和字体驱动独立,可独立更新和替换
- 兼容性:遵循 Windows 标准,支持现有 Windows 驱动程序
- 可扩展性:通过微型端口驱动框架支持新硬件