當前位置:
首頁 > 最新 > DLL與UEFI的故事之二:通過實例觀察DLL與EFI文件的關係

DLL與UEFI的故事之二:通過實例觀察DLL與EFI文件的關係

DLL和EFI文件在本質上一樣的。事實上,Visual Studio編譯工具鏈編譯efi模塊首先就是生成的dll文件,再被處理成了efi文件。它們都是符合PE/COFF格式的文件。本文在簡單介紹PE/COFF的歷史和格式後,通過一個實用的Explorer擴展例子,結合實際情況,介紹efi文件中某些有趣的細節。該Explorer擴展也許對大家將來使用/調試efi驅動能夠有所幫助。

PE/COFF歷史

最早的COFF文件出現在Unix系統中,著名的「a.out」已經能夠支持各種section和重定位操作。在它的基礎上,各種操作系統擴展了它的結構,Windows世界的擴展就叫做PE/COFF。微軟在Windows NT 3.1引入了PE(Portable Executable)格式,並在此後做過多次擴展,例如加入了64位的支持和各種X86之外的arch。即使在今天看來,PE格式仍然十分健康。

PE格式一瞥

我們來詳細了解一下PE格式的內容:

灰色部分是COFF原有的內容,白色部分是微軟PE擴展的部分。文件的最開始是「MZ」打頭的DOS頭,主要是為了和DOS時代的程序兼容;接下來是「PE」開始的PE頭;緊接著是Optional header,其包含的directory非常重要;在section table之後就是各種section了,包括代碼段.text,數據段.data、.rdata、xdata等等,重定位段.reloc,調試符號段.debug,等等很多:

EFI文件

EFI文件完全符合PE/COFF格式,我們舉個常見的EFI驅動:SmartTimer.efi

我們可以看到,DOS頭和PE頭完全一樣,事實上EFI文件完全符合PE/COFF格式。我們可以用Visual Studio的dumpbin來觀看EFI文件:

大家可以看出來這是個64 bit的boot service driver。UEFI EDKII的PE格式定義在MdePkgIncludeIndustryStandardPeImage.h,它也被用來處理efi文件。

實用的Explorer UEFI驅動擴展

前文介紹了Explorer利用「COM Surrogate」來容納它的擴展addins。這些addins統稱ShellExt,它們基於COM介面,功能十分豐富,可以顯示縮略圖、顯示詳細內容、預覽、添加特殊右鍵菜單等等。為了方便大家深入理解efi文件的結構,我特別製作了一個Explorer的Hover擴展,即滑鼠懸浮在.efi文件上之後會顯示efi文件中有用的信息。我把文件共享在百度網盤中(鏈接:http://pan.baidu.com/s/1qXU3zmk 密碼:td56)。大家可以把它copy到某個本地目錄中,並用管理員模式打開一個命令行窗口,輸入:

Regsvr32 RomHover.dll

一切正常後會彈出成功信息。

我在該擴展中更改了.efi文件對應的圖標,不再是原始的白板:

而是換成了「漂亮」的彩色圖標:

該圖標有很多解析度,用大圖示也不會變形。把滑鼠放在efi驅動上面,過一會會顯示efi文件內容:

我做了很多精簡,沒有用的信息基本不顯示,其中不少信息對於大家使用efi驅動還是比較有幫助的:

Machine:是32位、64位X86、64位IPF還是EBC?一看便知。

ImageType:是application、Boot Service Driver還是Runtime Driver? 不用再看.inf文件了。

Debug PDB:調試文件在哪裡,是不是放錯地方了?這下source level debug沒有source code知道哪裡去找了。

使用注意:本擴展僅支持64位的Windows(Vista, Win7, Win8, Win10),regsver32後應該重啟動一次(或者logout),保證explorer被重啟。

Look into the code

擴展基於ATL,Explorer擴展採用多繼承,必須繼承:

COM_INTERFACE_ENTRY(IShellExt)

COM_INTERFACE_ENTRY(IDispatch)

COM_INTERFACE_ENTRY(IPersistFile)

COM_INTERFACE_ENTRY(IQueryInfo)

主體代碼如下:

部分代碼採取簡化處理,主要為了功能說明。

其他

有同學也許注意到了,代碼裡面對debug directory做了單獨處理,是為了取出PDB文件的路徑。其實relocation directory同樣重要,我們可以通過它方便的取出重定位信息,這也是下篇文章的重點。另外Cert directory指向UEFI數字簽名:

有興趣的同學可以找個簽過名的.efi文件跟蹤一下,也可以補充一下本文中的explorer addins,使之能夠讀取簽名。

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 UEFI社區 的精彩文章:

TAG:UEFI社區 |