如果在DLL中调用函数时没有传递足够的参数,会发生什么情况?
32位
__cdecl
所以在你的情况下,来电者:
- 推b
- 推一个
- 推送返回地址
- 调用函数。
在这一点上堆栈看起来像这样(例如,假设4字节的指针,记住堆栈指针向后移动):
+-----+ <--- this is where esp is after pushing stuff
| ret | [esp]
+-----+
| a | [esp+4]
+-----+
| b | [esp+8]
+-----+ <--- this is where esp was before we started
| ??? | [esp+12 and beyond]
+-----+
太好了。 现在问题发生在被调用方。 被调用者希望参数位于堆栈的某些位置,所以:
a[esp+4]b[esp+8]c[esp+12]
[esp+12]ab[esp+12]c
c
espc
64位
__cdecl
rcxrcxrdxr8r9xmm0xmm1xmm2xmm3esp
所以在你的情况下,来电者:
rcxarcxrdx
但被调用者期待:
rcxbrdxcr8
r8ccrcxrdxr8esp