在用户模式下调用时是
mov edx,esp
sysener
edx指向 用户空间堆栈栈顶
然后到创建自陷框架时
nt!KiFastCallEntry:
804de89f b923000000 mov ecx,23h
804de8a4 6a30 push 30h
804de8a6 0fa1 pop fs ;RING0下 FS=0x30
804de8a8 8ed9 mov ds,cx ;RING3下 0x20 数据段
804de8aa 8ec1 mov es,cx ;RING3下 0x20 数据段
804de8ac 648b0d40000000 mov ecx,dword ptr fs:[40h] ;TSS
804de8b3 8b6104 mov esp,dword ptr [ecx+4]
804de8b6 6a23 push 23h
804de8b8 52 push edx
804de8b9 9c pushfd
804de8ba 6a02 push 2
804de8bc 83c208 add edx,8
这句为什么是add edx,8 而不是add edx,4 ??
比如如果在函数里调用sysenter
用户空间堆栈里样子应该是
| 参数 | 高地址
| 参数 | ←add后edx指向
| 参数 |
| 返回地址 | ←mov edx,esp 后edx指向
低地址
再 add edx,8 使edx 向高地址移动8字节 岂不是损失了一个参数?? 还是说用户空间堆栈里还有什么东西?
------解决方案--------------------