众所周知,ATL 通过 thunking 将一个窗口挂接到它的 wndproc,它实际上用 this 指针替换 hwnd 并跳转到 wndproc,因此对 wndproc(hwnd, ...) 的调用实际上是 wndproc(this, .. .) .
下面是 thunk 构造的汇编代码:
mov dword ptr [esp+0x4], pThis (esp+0x4 is hWnd)
我的问题是,由于这个 thunk 只执行一次,我们如何确保 [esp+0x4] 不会被 CPU 覆盖以调用另一个过程,并且下次调用 wndproc(...) 时,再次传入 hwnd ? 我的理解是 [esp+0x4] 是一个可重用的通用寄存器,用于存储任何过程的第一个参数。
这里有什么问题?如何保证 hwnd 的修改是永久的?
谢谢。