明輝手游網(wǎng)中心:是一個免費提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺!

讓自己編寫的DLL加載到Slot1

[摘要]將自己編寫的DLL包含到內(nèi)核當(dāng)中并不是難事,但是這并不意味著你的DLL能夠加載到Slot 1。可能細心的你已經(jīng)發(fā)現(xiàn),當(dāng)你用應(yīng)用程序加載你自己手工包含到內(nèi)核中的DLL時,這個DLL一定是加載到調(diào)用進程的地址空間中,而不是系統(tǒng)DLL的特有的地址空間Slot1,即使你在project.bib文件中加了文...
  將自己編寫的DLL包含到內(nèi)核當(dāng)中并不是難事,但是這并不意味著你的DLL能夠加載到Slot 1。可能細心的你已經(jīng)發(fā)現(xiàn),當(dāng)你用應(yīng)用程序加載你自己手工包含到內(nèi)核中的DLL時,這個DLL一定是加載到調(diào)用進程的地址空間中,而不是系統(tǒng)DLL的特有的地址空間Slot1,即使你在project.bib文件中加了文件屬性NK或者S。也許你不會介意,認為只要能運行就OK。但是如果DLL加載到Slot 1,那么可用的進程地址空間就節(jié)省了。這對于本來就擁擠的進程地址空間來說是個好事。我早就注意這個問題了,可是最近才在MSDN的Knowledge Base中發(fā)現(xiàn)一篇文章,介紹如何將DLL加載到Slot 1。

  只要符合下面兩個條件,DLL就可以加載到Slot 1:

  1、這個DLL包含在*.bib文件的MODULES中,且不能具有壓縮屬性。

  2、在內(nèi)核編譯期間,一定要存在一個和DLL同名的.rel文件,且處于同一個目錄下。

  對于第一個條件,很容易實現(xiàn),在PB中包含的模塊默認就是不壓縮的。如果你不會加入DLL到.bib中,可以參考我以前寫的文章。對于第二個條件,也容易實現(xiàn),只要在編譯前在鏈接選項中加入一個選項和修改一個選項即可。如果是EVC,在“l(fā)ink”-“project options”中找到“/incremental”,改為“/incremental:no”,如果原來是就不用改了。接著添加一個選項“/savebaserelocations:filename.rel”,其中filename指的是你編譯的DLL的主文件名。比如我要編譯的DLL為abc.dll,那么在此添加“/savebaserelocations:abc.rel”。編譯后就能找到這個文件。記住一定要把這個文件和DLL放在同一個目錄下,這樣PB才能找到這個DLL對應(yīng)的.rel文件。至于.rel文件的內(nèi)容,用記事本就能查看,也能看的懂。

  到此這篇文章的內(nèi)容就講完了。另外我遇到一個問題,想麻煩所有正從事CE開發(fā)的網(wǎng)友,問題如下:

  Windows CE允許PB開發(fā)者創(chuàng)建一個可信任的環(huán)境。其中有一種機制:在定制的內(nèi)核啟動后,只允許加密過的EXE、DLL運行,而非加密的EXE、DLL運行會失敗。簡略的說明這種機制原理,就是利用內(nèi)核在加載EXE、DLL之前,先運行驗證函數(shù)來驗證EXE、DLL是否具有數(shù)字簽名,并且簽名是否合法。如果合法就可以運行了,不合法就不加載執(zhí)行。驗證函數(shù)能夠訪問一個全局Public Key,在EXE、DLL中包含Private Key。其中PB工具“signfile.exe”用于將數(shù)字簽名附加到符合PE格式的EXE、DLL上。

  這種機制正是我需要的,我想它也是很多PB開發(fā)者非常感興趣的?墒俏也榭戳藥椭臋n,卡在了最后一個環(huán)節(jié)“signfile.exe”上。需要了解加密的基本知識,而幫助文檔在加密方面講的不細致,我又不了解,所以在此請了解這方面的網(wǎng)友指教,大家可以在CE的幫助文檔中搜索標(biāo)題為“signfile.exe”的文章,如果您了解,希望能夠發(fā)郵件賜教,本人不勝感激。