我想用Windows API's PatchAPI來應用一些補丁。 補丁的應用在mspatcha.dll中實現,它應該位於system32文件夾中。鏈接到Windows API的PatchAPI
在閱讀過各種地方,如他們的參考和谷歌搜索,我還沒有找到正確的方式來鏈接到這個DLL。我想靜態鏈接,處理LoadLibrary似乎很麻煩,有點挫敗了他們patchapi.h頭文件的用途。因爲我沒有發現任何的.lib文件,我鏈接到,我用下面的命令創建了自己:
1)DUMPBIN /出口C:\ WINDOWS \ SYSTEM32 \ mspatcha.dll
2)創建mspatcha.def文件,寫入一個「出口」行,其後是一個線出現在輸出每個函數名DUMPBIN
3)LIB /def:mspatcha.def /out:mspatcha.lib
雖然我確定這不是與patchapi靜態鏈接的正確方法,但我還沒有找到正確的方式來做到這一點。 無論如何,在遵循這些步驟並編寫一個簡單的測試用例(ApplyPatchToFileExA())後,我仍然在符號_ApplyPatchToFileA @ 16上發生鏈接器錯誤。 考慮看看我的新創建mspatcha.lib的導出的符號,看來該函數使用了錯誤的命名慣例
d:\ tmp目錄\ mspatcha> DUMPBIN /出口mspatcha.lib |找到「ApplyPatchToFileExA」
_ApplyPatchToFileExA
除非我錯了,這表示,而該DLL使用STDCALL(或至少被宣佈功能_stdcall)使用的cdecl的lib導出的函數。參見:C name decoration in Microsoft Windows。
我的問題是:在我的應用程序中使用mspatcha.dll的正確方法是什麼以及我從dll創建lib的過程出了什麼問題,以便我可以進行靜態鏈接?
我的終端的詳細輸出可以在這裏找到:http://pastebin.com/q4FV4Se6
請區分「靜態導入」和「靜態鏈接」。前者意味着加載器將在二進制獲得控制權之前解析任何導入的函數(可能會失敗)。後者意味着實際的目標代碼被鏈接到最終的二進制圖像中。 – 0xC0000022L 2011-04-18 23:58:37
我有點困惑,'lib.exe'應該從你給的DEF文件中創建裝飾名稱。你有沒有試圖鏈接到這一點。lib,然後檢查生成的二進制文件的導入目錄? – 0xC0000022L 2011-04-19 00:03:23
嘗試使用這個小工具:http://vortex.masmcode.com/files/def2lib11.zip - 它需要.def文件中的裝飾名稱,以便鏈接器和加載器都很高興。 – 0xC0000022L 2011-04-19 01:07:51