下面是32位编程实现/
// 关闭写保护
#pragma PAGEDCODE
void OpenGate()
{
__asm
{
cli;//将处理器标志寄存器的中断标志位清0,不允许中断
mov eax, cr0
and eax, not 0x10000
mov cr0, eax
}
}
// 恢复写保护
#pragma PAGEDCODE
void CloseGate()
{
__asm
{
mov eax, cr0
or eax, 0x10000
mov cr0, eax
sti;//将处理器标志寄存器的中断标志置1,允许中断
}
}
下面是64位编程实现/
注意:cli与sti之后一定要有“;”,如果没有分号则蓝屏
// 关闭写保护
#pragma PAGEDCODE
void OpenGate()
{
__asm
{
cli; //将处理器标志寄存器的中断标志位清0,不允许中断
mov rax,cr0
and rax, not 0x10000
mov cr0, rax
}
}
// 恢复写保护
#pragma PAGEDCODE
void CloseGate()
{
__asm
{
mov rax, cr0
or rax, 0x10000
mov cr0, rax
sti; //将处理器标志寄存器的中断标志置1,允许中断
}
}