ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

ReactOS 图形系统分析(28):工具与收尾模块 — rlecomp.c / sort.c / engevent.c / stubs.c / umpdstubs.c / eng.h / inten

ReactOS 图形系统分析(28):工具与收尾模块 — rlecomp.c / sort.c / engevent.c / stubs.c / umpdstubs.c / eng.h / inten ReactOS 图形系统分析28工具与收尾模块 — rlecomp.c / sort.c / engevent.c / stubs.c / umpdstubs.c / eng.h / inteng.h / engobjects.h1. 概述《分析_4》模块表的最后一批条目第 50~56 行是引擎的工具类/支撑类文件。它们体积小但各有明确职责本分析一并收尾文件角色核心内容[rlecomp.c](file:///d:/reactos/win32ss/gdi/eng/rlecomp.c)RLE 位图解压DecompressBitmapBI_RLE4/RLE8 解码[sort.c](file:///d:/reactos/win32ss/gdi/eng/sort.c)排序工具EngSortqsort 包装裁剪矩形排序用[engevent.c](file:///d:/reactos/win32ss/gdi/eng/engevent.c) / [engevent.h](file:///d:/reactos/win32ss/gdi/eng/engevent.h)事件对象ENG_EVENTKEVENT 封装 8 个事件服务[stubs.c](file:///d:/reactos/win32ss/gdi/eng/stubs.c)未实现函数桩EngTextOut/EngStrokePath/EngFillPath等引擎 DDI 桩[umpdstubs.c](file:///d:/reactos/win32ss/gdi/eng/umpdstubs.c)UMPD 系统调用桩NtGdi*系列用户模式打印驱动路径[eng.h](file:///d:/reactos/win32ss/gdi/eng/eng.h)引擎内部 API 声明头MIX_TO_ROP4、信号量、DecompressBitmap 等[inteng.h](file:///d:/reactos/win32ss/gdi/eng/inteng.h)IntEng接口头*ROP4 宏族、RECT_ENUM/SPAN、IntEng* 声明[engobjects.h](file:///d:/reactos/win32ss/gdi/eng/engobjects.h)内部对象头XCLIPOBJ/EWNDOBJ/RWNDOBJ、FONTGDI 等2. RLE 位图解压 — rlecomp.c背景BMP 的BI_RLE4/BI_RLE8压缩格式在 GDI 创建 RLE 位图BMF_4RLE/BMF_8RLE表面时像素数据是运行长度编码的压缩流必须先解压成普通位图才能被 DIB 引擎使用。enumRle_EscapeCodes{RLE_EOL0,RLE_END1,RLE_DELTA2};VOIDDecompressBitmap(SIZEL Size,BYTE*CompressedBits,BYTE*UncompressedBits,LONG Delta,ULONG Format,ULONG cjSizeImage){/* 从底向上逐行解码y Size.cy - 1 递减 */while(y0(bits-begin)cjSizeImage){length*bits;if(length)/* 编码形式 1length 个重复像素 */for(i0;ilength;i)写入 c4bpp 时高/低半字节交替;else/* 编码形式 2转义码length 0 */{length*bits;switch(length){caseRLE_EOL:x0;y--;/* 行结束 */caseRLE_END:return;/* 位图结束 */caseRLE_DELTA:x*bits;y-*bits;/* 跳到新位置 */default:逐字节写 length 个绝对像素4bpp 半字节处理奇数对齐*/}}}}要点只支持 4/8bppBMF_4RLE/BMF_8RLE或普通 4/8bpp其他格式直接返回4bpp 时每个字节含两个像素高/低半字节交替并按x1决定写入目标字节的高/低 4 位三种转义码EOL行结束、END位图结束、DELTA跳到偏移坐标绝对模式length2且非转义码逐字节拷贝4bpp 每两像素取一字节奇数长度末尾对齐填充全程 SEH 保护解压越界返回Decoding error。消费者[ntgdi/bitmaps.c](file:///d:/reactos/win32ss/gdi/ntgdi/bitmaps.c#L152)——创建/加载 RLE 压缩位图SetDIBits/CreateDIBSection的 BI_RLE 路径时解压。声明于 [eng.h](file:///d:/reactos/win32ss/gdi/eng/eng.h#L52)。3. 排序工具 — sort.cvoidAPIENTRYEngSort(IN OUT PBYTE Buf,IN ULONG ElemSize,IN ULONG ElemCount,IN SORTCOMP CompFunc){qsort(Buf,ElemCount,ElemSize,CompFunc);}要点就是标准库qsort的引擎包装win32k 导出DDI 服务——驱动也可用。树内消费者[clip.c](file:///d:/reactos/win32ss/gdi/eng/clip.c#L299)——枚举出的裁剪矩形列表排序EngSort(Clip-Rects, sizeof(RECTL), RectCount, CompareFunc)保证枚举顺序确定。4. 事件对象 — engevent.c/h4.1 数据结构/* engevent.hENG_EVENT 标志 */enum_EVENTFLAGS{ENG_EVENT_USERMAPPED0x01};/* ENG_EVENT 标志 内嵌 KEVENT分配于 NonPagedPoolGDITAG_ENG_EVENT */typedefstruct_ENG_EVENT{FLONG fFlags;PKEVENT pKEvent;/* 指向紧随结构的 KEVENT或用户映射的 KEVENT */}ENG_EVENT,*PEVENT;4.2 函数族函数行为要点EngCreateEvent分配ENG_EVENTKEVENTNonPagedPoolKeInitializeEvent(SynchronizationEvent, FALSE)win32k 导出失败返回 FALSEEngDeleteEvent释放事件用户映射事件禁止删除返回 FALSEEngClearEventKeClearEvent置非信号态EngSetEventKeSetEvent(IO_NO_INCREMENT, FALSE)返回前状态LONGEngReadStateEventKeReadStateEvent查询信号态EngMapEvent把用户模式 KEVENTObReferenceObjectByHandleEVENT_ALL_ACCESS映射为引擎事件KePulseEvent激活置ENG_EVENT_USERMAPPEDReserved1支持旧接口回填失败返回 NULLEngUnmapEvent解除用户映射ObDereferenceObject 释放仅限用户映射事件EngWaitForSingleObjectKeWaitForSingleObject(Executive, KernelMode, TimeOut)用户映射事件禁止等待EventNULL返回 FALSE超时也返回 FALSE设计语义引擎事件 内核 KEVENT 的轻量封装用户映射事件驱动把用户态事件交给引擎被设计成只能 Set/Read不能 Delete/Wait源码 DPRINT1 注释明确避免内核等待用户事件造成挂起。消费者显示/字体驱动可用EngMapEvent把应用事件接入设备完成通知win32k.spec 导出EngCreateEvent/EngMapEvent/EngSetEvent/EngWaitForSingleObject等。5. 桩函数 — stubs.c / umpdstubs.c5.1 stubs.c引擎 DDI 桩见《分析_16/18》未实现的引擎级 DDI 服务全部TRACE(... stub) 返回失败值类别桩函数文本/路径EngTextOut、CLIPOBJ_ppoGetPath、EngStrokePath、EngFillPath、EngStrokeAndFillPath、PATHOBJ_*相关字体FONTOBJ_cGetGlyphs/pifi/vGetInfo/pfdg/pjOpenTypeTablePointer/pQueryGlyphAttrs/pwszFontFilePaths、EngFntCache*部分实现打印/设备EngWritePrinter、EngEnumForms、EngGetPrinterData、EngSetPrinterData、EngGetPrinterDriver、EngInitSpool等其他EngCheckAbort、EngDitherColor恒 DCR_SOLID、EngNineGrid、HT_*半调色注意EngFntCacheAlloc字体缓存分配与EngQueryLocalTime/EngGetPrinterDataFileName等为真实实现——stubs.c 是以桩为主、少量实现的混合文件。5.2 umpdstubs.cUMPD 系统调用桩NtGdi*系列如NtGdiEngTextOut、NtGdiPATHOBJ_bEnum、NtGdiSTROBJ_bEnum、NtGdiXLATEOBJ_iXlate等——UMPD用户模式打印/显示驱动经 gdi32 → win32u 进入内核的入口当前多为UNIMPLEMENTED。这些桩与《分析_16/18/19》中DDI 服务预留层一一对应用户态驱动路径尚未接线。6. 内部头文件 — eng.h / inteng.h / engobjects.h头文件关键内容[eng.h](file:///d:/reactos/win32ss/gdi/eng/eng.h)MIX_TO_ROP4《分析_17》、gajRop2ToRop3、EngAcquireSemaphoreShared《分析_20》、DecompressBitmap、EngGetTickCount32、各种引擎内部函数声明[inteng.h](file:///d:/reactos/win32ss/gdi/eng/inteng.h)ROP4 宏族ROP4_USES_DEST/SOURCE/PATTERN/MASK、ROP4_FGND/BKGND、ROP4_NOOP/MASK/MASKPAINT见《分析_4》3.1、RECT_ENUM/SPAN结构、IntEng*内部接口声明IntEngBitBlt/Paint/LineTo/MaskBlt/StretchBlt/GradientFill 等[engobjects.h](file:///d:/reactos/win32ss/gdi/eng/engobjects.h)XCLIPOBJ/EWNDOBJ/RWNDOBJ《分析_4》2.2、《分析_15》、DRVFUNCTIONSGDI、FONTGDI/PATHGDI/XFORMGDI/SHARED_FACE等内部对象这三个头是前面所有《分析_4~27》文件共用的引擎内部契约层——ROP4 宏、内部对象、IntEng 接口都在此统一声明。7. 与《分析_4》标注对照标注核对第 50 行rlecomp.c 「RLE 压缩」准确实际是解压DecompressBitmapRLE4/RLE8第 51 行sort.c 「排序工具」准确EngSort qsort 包装clip.c 用第 52 行engevent.c/h 「事件对象」准确ENG_EVENT KEVENT 封装用户映射事件禁删/禁等第 53 行stubs.c/umpdstubs.c 「桩函数」准确引擎 DDI 桩 UMPD 系统调用桩第 54~56 行eng.h/inteng.h/engobjects.h头文件声明层内部 API/IntEng 接口/内部对象描述准确8. 源码索引文件关键内容[rlecomp.c](file:///d:/reactos/win32ss/gdi/eng/rlecomp.c)DecompressBitmapRLE4/RLE8EOL/END/DELTA 转义[sort.c](file:///d:/reactos/win32ss/gdi/eng/sort.c)EngSortqsort 包装[engevent.c](file:///d:/reactos/win32ss/gdi/eng/engevent.c) / engevent.hENG_EVENT Create/Delete/Clear/Set/ReadState/Map/Unmap/WaitForSingleObject[stubs.c](file:///d:/reactos/win32ss/gdi/eng/stubs.c)EngTextOut/EngStrokePath/EngFillPath/FONTOBJ_*/打印类等桩[umpdstubs.c](file:///d:/reactos/win32ss/gdi/eng/umpdstubs.c)NtGdi* UMPD 系统调用桩[eng.h](file:///d:/reactos/win32ss/gdi/eng/eng.h)MIX_TO_ROP4、内部 API 声明[inteng.h](file:///d:/reactos/win32ss/gdi/eng/inteng.h)ROP4 宏族、RECT_ENUM/SPAN、IntEng* 声明[engobjects.h](file:///d:/reactos/win32ss/gdi/eng/engobjects.h)XCLIPOBJ/EWNDOBJ/RWNDOBJ、FONTGDI 等[ntgdi/bitmaps.c](file:///d:/reactos/win32ss/gdi/ntgdi/bitmaps.c#L152)DecompressBitmap 调用方RLE 位图加载[clip.c](file:///d:/reactos/win32ss/gdi/eng/clip.c#L299)EngSort 调用方裁剪矩形排序关联模块桩函数对应的预留服务层《分析_16》STROBJ、《分析_18》PATHOBJ、《分析_19》XLATEOBJROP4 宏消费方《分析_4》3.1BitBlt、《分析_26/27》AlphaBlend/StretchBlt内部对象消费方《分析_4》2.2、[《分析_15》EWNDOBJ](file:///d:/reactos/doc/GDI/ReactOS%20图形系统分析_15.md)本文档基于 ReactOS 源代码win32ss/gdi/eng/收尾模块分析2026 年 8 月
返回列表