我正在调试windbg中的x86 DLL,特别是一个假定具有以下签名的函数:
bool __cdecl func(LPVOID p1, LPVOID p2, wchar_t* p3, size_t p4, LPVOID p5)
Run Code Online (Sandbox Code Playgroud)
该功能未导出.AFAIK __cdecl
应该接收堆栈上的所有参数,并且调用者应该清除堆栈.
但事情并非如此.WinDBG的说,调用约定__cdecl
,但第2个参数的传递ecx
和edx
,就像一个__fastcall
功能.函数本身也正在清理堆栈,我认为不应该由__cdecl
函数完成.
我试图挂钩该功能但没有成功.我试图做一个绕行功能__cdecl
,__fastcall
并且都会导致崩溃.
有什么建议?
如果函数在可执行文件(不是库)中或仅在同一DLL中调用,则编译器可以根据需要优化调用约定.
如果编译器知道两端(调用者和被调用者),并且知道该函数不会被导出到另一个单元(就像它与库一样),那么它可以以任何方式进行优化.
那么:函数是完成的可执行文件的一部分吗?你有优化吗?
我建议关闭优化,然后重试.