• 1472阅读
  • 1回复

VmxVmexitHandler(sub    rsp, 28h的作用) [复制链接]

上一主题 下一主题
离线天道酬勤
 

只看楼主 倒序阅读 使用道具 楼主  发表于: 2016-02-10
— 本帖被 天道酬勤 从 驱动保护 移动到本区(2016-05-19) —
前期的准备是为调用HvmEventCallback而做的,由于HvmEventCallback的参数为:PCPU Cpu,  PGUEST_REGS GuestRegs。在64位系统中,由调用规范,可以看到,

Cpu指针被赋给了rcx,GuestRegs指针被赋给了rdx(这里我的理解是,VmxVmexitHandler首先执行了HVM_SAVE_ALL_NOSEGREGS, 此后rsp指向栈中保存的所有寄存器

值的首地址,这样栈内的参数就等于自动与GuestRegs中的变量绑定,然后在trap方法中通过修改GuestRegs中相应变量的值,就相当于修改了栈中对应保存的寄存器

的值,然后退出VmxVmexitHandler 之前会调用HVM_RESTORE_ALL_NOSEGREGS来恢复寄存器,此时用来恢复的值已经由于保存在栈中已经被修改,也就达到了对输出结

果的修改。  sub rsp,28h,这句根据x64调用规范,为调用函数为被调用函数分配参数在栈中的空间,然后被调用函数会在调用时把参数放到之前保留的空间中。由

于必须至少保留4个寄存器参数的空间,因此至少要空出20H的空间(经测试,改为20H也可跑通)。  执行完HvmEventCallback后,把之前分配的空间取消也就是add

rsp, 28h。然后恢复寄存器(HVM_RESTORE_ALL_NOSEGREGS),然后通过vmx_resume把控制权交还给VM。
离线v2680267313

只看该作者 沙发  发表于: 2016-04-30
用户被禁言,该主题自动屏蔽!
快速回复
限100 字节
如果您在写长篇帖子又不马上发表,建议存为草稿
 
上一个 下一个