簡體   English   中英

奇怪的函數調用約定

[英]Weird function calling convention

我正在調試windbg中的x86 DLL,特別是一個應該具有以下簽名的函數:

bool __cdecl func(LPVOID p1, LPVOID p2, wchar_t* p3, size_t p4, LPVOID p5)

該功能未導出。 AFAIK __cdecl應該接收堆棧上的所有參數, 調用者應該清除堆棧。

但事情並非如此。 Windbg說調用約定是__cdecl但前兩個參數是在ecxedx上傳遞的,就像__fastcall函數一樣。 函數本身也在清除堆棧,我認為不應該由__cdecl函數完成。

我試圖掛鈎該功能但沒有成功。 我試圖將繞行函數設為__cdecl__fastcall ,兩者都會導致崩潰。

有什么建議?

如果函數在可執行文件(不是庫)中或僅在同一DLL中調用,則編譯器可以根據需要優化調用約定。

如果編譯器知道兩端(調用者和被調用者),並且知道該函數不會被導出到另一個單元(就像它與庫一樣),那么它可以以任何方式進行優化。

那么:函數是完成的可執行文件的一部分嗎? 你有優化嗎?

我建議關閉優化,然后重試。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM