讓自己編寫的DLL加載到Slot1
發表時間:2024-01-10 來源:明輝站整理相關軟件相關文章人氣:
[摘要]將自己編寫的DLL包含到內核當中并不是難事,但是這并不意味著你的DLL能夠加載到Slot 1。可能細心的你已經發現,當你用應用程序加載你自己手工包含到內核中的DLL時,這個DLL一定是加載到調用進程的地址空間中,而不是系統DLL的特有的地址空間Slot1,即使你在project.bib文件中加了文...
將自己編寫的DLL包含到內核當中并不是難事,但是這并不意味著你的DLL能夠加載到Slot 1。可能細心的你已經發現,當你用應用程序加載你自己手工包含到內核中的DLL時,這個DLL一定是加載到調用進程的地址空間中,而不是系統DLL的特有的地址空間Slot1,即使你在project.bib文件中加了文件屬性NK或者S。也許你不會介意,認為只要能運行就OK。但是如果DLL加載到Slot 1,那么可用的進程地址空間就節省了。這對于本來就擁擠的進程地址空間來說是個好事。我早就注意這個問題了,可是最近才在MSDN的Knowledge Base中發現一篇文章,介紹如何將DLL加載到Slot 1。
只要符合下面兩個條件,DLL就可以加載到Slot 1:
1、這個DLL包含在*.bib文件的MODULES中,且不能具有壓縮屬性。
2、在內核編譯期間,一定要存在一個和DLL同名的.rel文件,且處于同一個目錄下。
對于第一個條件,很容易實現,在PB中包含的模塊默認就是不壓縮的。如果你不會加入DLL到.bib中,可以參考我以前寫的文章。對于第二個條件,也容易實現,只要在編譯前在鏈接選項中加入一個選項和修改一個選項即可。如果是EVC,在“link”-“project options”中找到“/incremental”,改為“/incremental:no”,如果原來是就不用改了。接著添加一個選項“/savebaserelocations:filename.rel”,其中filename指的是你編譯的DLL的主文件名。比如我要編譯的DLL為abc.dll,那么在此添加“/savebaserelocations:abc.rel”。編譯后就能找到這個文件。記住一定要把這個文件和DLL放在同一個目錄下,這樣PB才能找到這個DLL對應的.rel文件。至于.rel文件的內容,用記事本就能查看,也能看的懂。
到此這篇文章的內容就講完了。另外我遇到一個問題,想麻煩所有正從事CE開發的網友,問題如下:
Windows CE允許PB開發者創建一個可信任的環境。其中有一種機制:在定制的內核啟動后,只允許加密過的EXE、DLL運行,而非加密的EXE、DLL運行會失敗。簡略的說明這種機制原理,就是利用內核在加載EXE、DLL之前,先運行驗證函數來驗證EXE、DLL是否具有數字簽名,并且簽名是否合法。如果合法就可以運行了,不合法就不加載執行。驗證函數能夠訪問一個全局Public Key,在EXE、DLL中包含Private Key。其中PB工具“signfile.exe”用于將數字簽名附加到符合PE格式的EXE、DLL上。
這種機制正是我需要的,我想它也是很多PB開發者非常感興趣的。可是我查看了幫助文檔,卡在了最后一個環節“signfile.exe”上。需要了解加密的基本知識,而幫助文檔在加密方面講的不細致,我又不了解,所以在此請了解這方面的網友指教,大家可以在CE的幫助文檔中搜索標題為“signfile.exe”的文章,如果您了解,希望能夠發郵件賜教,本人不勝感激。