我还注意到,当有两个线程时,还会有另一个这样的隐藏区域,所以它可能是每个线程的。 >
任何有关Windows标准内存布局的文档都很棒。
#1 楼
在系统调用期间不会发生这种情况。它发生在用户模式下。WOW64进程具有两个用户模式堆栈-一个32位堆栈(通常使用的堆栈)和一个64位堆栈。 WOW64 ntdll不会进行系统调用。在本地32位ntdll将
sysenter
(通过间接调用SharedUserData!SystemCallStub
)的地方,WOW64 ntdll具有对wow64cpu!X86SwitchTo64BitMode
(call dword ptr fs:[0C0h]
)的间接调用。此函数与一个特殊的选择器相差很远,导致从32位模式切换到64位模式。然后,WOW64层将复制参数,扩展所有必要内容,等等,然后进行真正的系统调用。
我敢打赌,您使用了32位调试器来调试您的WOW64进程和32位调试器未显示模式转换。不可以但这仍然在用户模式下发生。
WOW64上任何最基本的资源都可以告诉您这一点,并且您应该能够自行猜测。用户模式组件负责模式转换并仅将内核保持在64位,而不是让内核处理来自32位和64位模式的系统调用,这是更为合理的。
MSDN页面WOW64实现细节实际上说明了这两个方面:自定义调用顺序。对于WOW64而言,此调用序列是廉价的,因为它完全处于用户模式。当检测到自定义调用顺序时,WOW64 CPU会转换回本机64位模式并调用Wow64.dll。在用户模式下执行thunk,以减少对64位内核的影响,并减少thunk中可能导致内核模式崩溃,数据损坏或安全漏洞的bug的风险。 thunk从32位堆栈中提取参数,将其扩展到64位,然后进行本机系统调用。
最后一句话是我的。它没有明确指出参数的提取和扩展是在单独的堆栈上完成的,但这并不是一个疯狂的猜测。
评论
是的,我使用的是32位调试器。我一直以为WOW64开关是一个非常薄的包装器,因此它具有64位堆栈的概念似乎很陌生,但是显然还有更多的方法。现在,我已经使用64位调试器进行了验证,您的建议已得到体现。谢谢,真的很有帮助!
– Mikubyte
17年3月15日在8:31
评论
您能否更具体一点?您是怎么看的?内容是什么?怎么改变?您能否在图像中包含某种内存映射?