分析(28):工具與收尾模塊 — rlecomp.c / sort.c / engevent.c / stubs.c / umpdstubs.c / eng.h / inten)
ReactOS 圖形系統(tǒng)分析28工具與收尾模塊 — rlecomp.c / sort.c / engevent.c / stubs.c / umpdstubs.c / eng.h / inteng.h / engobjects.h1. 概述《分析_4》模塊表的最后一批條目第 50~56 行是引擎的工具類/支撐類文件。它們體積小但各有明確職責(zé)本分析一并收尾文件角色核心內(nèi)容[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)事件對(duì)象ENG_EVENTKEVENT 封裝 8 個(gè)事件服務(wù)[stubs.c](file:///d:/reactos/win32ss/gdi/eng/stubs.c)未實(shí)現(xiàn)函數(shù)樁EngTextOut/EngStrokePath/EngFillPath等引擎 DDI 樁[umpdstubs.c](file:///d:/reactos/win32ss/gdi/eng/umpdstubs.c)UMPD 系統(tǒng)調(diào)用樁NtGdi*系列用戶模式打印驅(qū)動(dòng)路徑[eng.h](file:///d:/reactos/win32ss/gdi/eng/eng.h)引擎內(nèi)部 API 聲明頭MIX_TO_ROP4、信號(hào)量、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)內(nèi)部對(duì)象頭XCLIPOBJ/EWNDOBJ/RWNDOBJ、FONTGDI 等2. RLE 位圖解壓 — rlecomp.c背景BMP 的BI_RLE4/BI_RLE8壓縮格式在 GDI 創(chuàng)建 RLE 位圖BMF_4RLE/BMF_8RLE表面時(shí)像素?cái)?shù)據(jù)是運(yùn)行長(zhǎng)度編碼的壓縮流必須先解壓成普通位圖才能被 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 個(gè)重復(fù)像素 */for(i0;ilength;i)寫入 c4bpp 時(shí)高/低半字節(jié)交替;else/* 編碼形式 2轉(zhuǎn)義碼length 0 */{length*bits;switch(length){caseRLE_EOL:x0;y--;/* 行結(jié)束 */caseRLE_END:return;/* 位圖結(jié)束 */caseRLE_DELTA:x*bits;y-*bits;/* 跳到新位置 */default:逐字節(jié)寫 length 個(gè)絕對(duì)像素4bpp 半字節(jié)處理奇數(shù)對(duì)齊*/}}}}要點(diǎn)只支持 4/8bppBMF_4RLE/BMF_8RLE或普通 4/8bpp其他格式直接返回4bpp 時(shí)每個(gè)字節(jié)含兩個(gè)像素高/低半字節(jié)交替并按x1決定寫入目標(biāo)字節(jié)的高/低 4 位三種轉(zhuǎn)義碼EOL行結(jié)束、END位圖結(jié)束、DELTA跳到偏移坐標(biāo)絕對(duì)模式length2且非轉(zhuǎn)義碼逐字節(jié)拷貝4bpp 每?jī)上袼厝∫蛔止?jié)奇數(shù)長(zhǎng)度末尾對(duì)齊填充全程 SEH 保護(hù)解壓越界返回Decoding error。消費(fèi)者[ntgdi/bitmaps.c](file:///d:/reactos/win32ss/gdi/ntgdi/bitmaps.c#L152)——?jiǎng)?chuàng)建/加載 RLE 壓縮位圖SetDIBits/CreateDIBSection的 BI_RLE 路徑時(shí)解壓。聲明于 [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);}要點(diǎn)就是標(biāo)準(zhǔn)庫(kù)qsort的引擎包裝win32k 導(dǎo)出DDI 服務(wù)——驅(qū)動(dòng)也可用。樹內(nèi)消費(fèi)者[clip.c](file:///d:/reactos/win32ss/gdi/eng/clip.c#L299)——枚舉出的裁剪矩形列表排序EngSort(Clip-Rects, sizeof(RECTL), RectCount, CompareFunc)保證枚舉順序確定。4. 事件對(duì)象 — engevent.c/h4.1 數(shù)據(jù)結(jié)構(gòu)/* engevent.hENG_EVENT 標(biāo)志 */enum_EVENTFLAGS{ENG_EVENT_USERMAPPED0x01};/* ENG_EVENT 標(biāo)志 內(nèi)嵌 KEVENT分配于 NonPagedPoolGDITAG_ENG_EVENT */typedefstruct_ENG_EVENT{FLONG fFlags;PKEVENT pKEvent;/* 指向緊隨結(jié)構(gòu)的 KEVENT或用戶映射的 KEVENT */}ENG_EVENT,*PEVENT;4.2 函數(shù)族函數(shù)行為要點(diǎn)EngCreateEvent分配ENG_EVENTKEVENTNonPagedPoolKeInitializeEvent(SynchronizationEvent, FALSE)win32k 導(dǎo)出失敗返回 FALSEEngDeleteEvent釋放事件用戶映射事件禁止刪除返回 FALSEEngClearEventKeClearEvent置非信號(hào)態(tài)EngSetEventKeSetEvent(IO_NO_INCREMENT, FALSE)返回前狀態(tài)LONGEngReadStateEventKeReadStateEvent查詢信號(hào)態(tài)EngMapEvent把用戶模式 KEVENTObReferenceObjectByHandleEVENT_ALL_ACCESS映射為引擎事件KePulseEvent激活置ENG_EVENT_USERMAPPEDReserved1支持舊接口回填失敗返回 NULLEngUnmapEvent解除用戶映射ObDereferenceObject 釋放僅限用戶映射事件EngWaitForSingleObjectKeWaitForSingleObject(Executive, KernelMode, TimeOut)用戶映射事件禁止等待EventNULL返回 FALSE超時(shí)也返回 FALSE設(shè)計(jì)語(yǔ)義引擎事件 內(nèi)核 KEVENT 的輕量封裝用戶映射事件驅(qū)動(dòng)把用戶態(tài)事件交給引擎被設(shè)計(jì)成只能 Set/Read不能 Delete/Wait源碼 DPRINT1 注釋明確避免內(nèi)核等待用戶事件造成掛起。消費(fèi)者顯示/字體驅(qū)動(dòng)可用EngMapEvent把應(yīng)用事件接入設(shè)備完成通知win32k.spec 導(dǎo)出EngCreateEvent/EngMapEvent/EngSetEvent/EngWaitForSingleObject等。5. 樁函數(shù) — stubs.c / umpdstubs.c5.1 stubs.c引擎 DDI 樁見《分析_16/18》未實(shí)現(xiàn)的引擎級(jí) DDI 服務(wù)全部TRACE(... stub) 返回失敗值類別樁函數(shù)文本/路徑EngTextOut、CLIPOBJ_ppoGetPath、EngStrokePath、EngFillPath、EngStrokeAndFillPath、PATHOBJ_*相關(guān)字體FONTOBJ_cGetGlyphs/pifi/vGetInfo/pfdg/pjOpenTypeTablePointer/pQueryGlyphAttrs/pwszFontFilePaths、EngFntCache*部分實(shí)現(xiàn)打印/設(shè)備EngWritePrinter、EngEnumForms、EngGetPrinterData、EngSetPrinterData、EngGetPrinterDriver、EngInitSpool等其他EngCheckAbort、EngDitherColor恒 DCR_SOLID、EngNineGrid、HT_*半調(diào)色注意EngFntCacheAlloc字體緩存分配與EngQueryLocalTime/EngGetPrinterDataFileName等為真實(shí)實(shí)現(xiàn)——stubs.c 是以樁為主、少量實(shí)現(xiàn)的混合文件。5.2 umpdstubs.cUMPD 系統(tǒng)調(diào)用樁NtGdi*系列如NtGdiEngTextOut、NtGdiPATHOBJ_bEnum、NtGdiSTROBJ_bEnum、NtGdiXLATEOBJ_iXlate等——UMPD用戶模式打印/顯示驅(qū)動(dòng)經(jīng) gdi32 → win32u 進(jìn)入內(nèi)核的入口當(dāng)前多為UNIMPLEMENTED。這些樁與《分析_16/18/19》中DDI 服務(wù)預(yù)留層一一對(duì)應(yīng)用戶態(tài)驅(qū)動(dòng)路徑尚未接線。6. 內(nèi)部頭文件 — eng.h / inteng.h / engobjects.h頭文件關(guān)鍵內(nèi)容[eng.h](file:///d:/reactos/win32ss/gdi/eng/eng.h)MIX_TO_ROP4《分析_17》、gajRop2ToRop3、EngAcquireSemaphoreShared《分析_20》、DecompressBitmap、EngGetTickCount32、各種引擎內(nèi)部函數(shù)聲明[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結(jié)構(gòu)、IntEng*內(nèi)部接口聲明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等內(nèi)部對(duì)象這三個(gè)頭是前面所有《分析_4~27》文件共用的引擎內(nèi)部契約層——ROP4 宏、內(nèi)部對(duì)象、IntEng 接口都在此統(tǒng)一聲明。7. 與《分析_4》標(biāo)注對(duì)照標(biāo)注核對(duì)第 50 行rlecomp.c 「RLE 壓縮」準(zhǔn)確實(shí)際是解壓DecompressBitmapRLE4/RLE8第 51 行sort.c 「排序工具」準(zhǔn)確EngSort qsort 包裝clip.c 用第 52 行engevent.c/h 「事件對(duì)象」準(zhǔn)確ENG_EVENT KEVENT 封裝用戶映射事件禁刪/禁等第 53 行stubs.c/umpdstubs.c 「樁函數(shù)」準(zhǔn)確引擎 DDI 樁 UMPD 系統(tǒng)調(diào)用樁第 54~56 行eng.h/inteng.h/engobjects.h頭文件聲明層內(nèi)部 API/IntEng 接口/內(nèi)部對(duì)象描述準(zhǔn)確8. 源碼索引文件關(guān)鍵內(nèi)容[rlecomp.c](file:///d:/reactos/win32ss/gdi/eng/rlecomp.c)DecompressBitmapRLE4/RLE8EOL/END/DELTA 轉(zhuǎn)義[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 系統(tǒng)調(diào)用樁[eng.h](file:///d:/reactos/win32ss/gdi/eng/eng.h)MIX_TO_ROP4、內(nèi)部 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 調(diào)用方RLE 位圖加載[clip.c](file:///d:/reactos/win32ss/gdi/eng/clip.c#L299)EngSort 調(diào)用方裁剪矩形排序關(guān)聯(lián)模塊樁函數(shù)對(duì)應(yīng)的預(yù)留服務(wù)層《分析_16》STROBJ、《分析_18》PATHOBJ、《分析_19》XLATEOBJROP4 宏消費(fèi)方《分析_4》3.1BitBlt、《分析_26/27》AlphaBlend/StretchBlt內(nèi)部對(duì)象消費(fèi)方《分析_4》2.2、[《分析_15》EWNDOBJ](file:///d:/reactos/doc/GDI/ReactOS%20圖形系統(tǒng)分析_15.md)本文檔基于 ReactOS 源代碼win32ss/gdi/eng/收尾模塊分析2026 年 8 月