2011-03-18 74 views
1

我目前正在研究一個DLL,這是一個封閉的工作項目的擴展。覆蓋CRT的執行_purecall

我想抓住每一個純粹的通話錯誤,所以我把它搜索起來,並發現了關於_purecall處理程序。我的問題是關於它的實現。幕後發生了什麼?編譯器本身需要我的處理程序函數地址(如果我定義了一個),並在它被類函數地址本身(初始化後)覆蓋之前將其默認值寫入v表中的每一行,或者它更復雜一些CRT和全局指針?

我在問這個,因爲我不希望我的插件DLL覆蓋整個應用程序_purecall處理程序,當然。我可以確定我的purecall處理程序只處理模塊中的純調用嗎?

謝謝!

回答

1

答案在很大程度上取決於您的編譯器如何實現purecall處理程序。如果編譯器只是替換虛函數表中的「純」函數指針,那麼您可以安全地修改父進程的行爲。

但是一些編譯器通過從CRT的處理程序中調用你的處理程序來實現自定義的purecall處理程序。在這種情況下,行爲將取決於您如何構建DLL。如果你已經靜態鏈接到CRT,那麼你的DLL將擁有它自己的所有CRT狀態的實例。在這種情況下,編譯器的實現是不相關的。您的purecall處理程序不會干擾父進程。另一方面,如果您已經動態鏈接到CRT,則行爲將取決於主機進程的構建方式。如果它是動態鏈接到與您的DLL相同版本的CRT,那麼您的purecall處理程序可能確實會發生干擾。但是,這又取決於編譯器的實現。即使它正在從CRT上調用你的鉤子,如果CRT爲每個模塊維持不同的鉤子,你也可以安全地使用。在任何情況下,如果你想確保安全,那麼你必須靜態鏈接你的DLL到CRT或避免使用purecall處理器(另一種方法是使用具體的基類而不是抽象的)。

+0

除非您動態鏈接到CRT,在這種情況下,它可以在多個模塊之間共享。 – 2011-03-18 19:27:11

+0

是的,你是對的。我混淆了多個模塊動態加載CRT以及動態加載不同版本CRT的情況。我會讚揚我的回答。 – 2011-03-18 19:47:01

+0

謝謝!我解開了使用VC2010編譯的應用程序,它似乎只是簡單地替換純函數指針... – MindBlower 2011-03-19 06:06:41