奇怪的函数调用约定

时间:2016-07-08 01:48:10

标签: c++ hook windbg

我正在调试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,两者都会导致崩溃。

有什么建议吗?

1 个答案:

答案 0 :(得分:6)

如果函数在可执行文件(不是库)中或仅在同一个DLL中调用,则编译器可以根据需要优化调用约定。

如果编译器知道两端(调用者和被调用者),并且知道该函数不会被导出到另一个单元(就像它与库一样),那么它可以在任何方向上进行优化。

那么:函数是完成的可执行文件的一部分吗?你有优化吗?

我建议关闭优化功能,然后再试一次。