系统调用
系统调用
知识点
自己实现NtOpenProcess
在Ring3的代码下调用了sysenter指令之后, CPU会做出如下操作
- 将
SYSENTER_CS_MSR
的值装载到cs
寄存器; // rdmsr 174 - 将
SYSENTER_EIP_MSR
的值装载到eip
寄存器; // rdmsr 176 - 将
SYSENTER_CS_MSR
的值加8(Ring0的堆栈段描述符)装载到ss
寄存器; - 将
SYSENTER_ESP_MSR
的值装载到esp
寄存器; // rdmsr 175 - 将特权级别切换到Ring0;
- 如果
EFLAGS
寄存器的VM
标志被置位, 则清除该标志; - 开始执行指定的Ring0代码;
在Ring0代码执行完毕, 调用SYEXIT指令退回Ring3时, CPU会做出如下操作
- 将
SYSENTER_CS_MSR
的值加16(Ring3的代码段描述符)装载到cs
寄存器; - 将寄存器
edx
的值装载到eip寄存器; - 将
SYSENTER_CS_MSR
的值加24(Ring3的堆栈段描述符)装载到ss
寄存器; - 将寄存器
ecx
的值装载到esp
寄存器; - 将特权等级切换到Ring3;
- 继续执行Ring3的代码
rdmsr用法
- 读取msr寄存器
1 | __asm |
- 写入msr寄存器
1 | __asm |
_KTRAP_FRAME
内核下的
CONTEXT