tianyu1977
驱动小牛
驱动小牛
  • 注册日期2007-03-10
  • 最后登录2011-01-29
  • 粉丝0
  • 关注0
  • 积分1003分
  • 威望121点
  • 贡献值0点
  • 好评度100点
  • 原创分0分
  • 专家分0分
阅读:2385回复:1

_asm iretd 返回错误

楼主#
更多 发布于:2007-05-27 15:38
我在驱动程序中将pc机种的8号中断挂接到自己的中断服务程序上,中断服务程序只有一条返回指令:_asm iretd;可是中断执行到这条指令总是出错不能正确返回,这是为什么啊,我需要有什么主意的吗。错误大概是这样的,:Access Violation :0xc000005,Unhandled exception
reayi
驱动牛犊
驱动牛犊
  • 注册日期2002-11-06
  • 最后登录2010-03-30
  • 粉丝0
  • 关注0
  • 积分83分
  • 威望9点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2007-08-23 10:34
中断服务程序可不是随便改写的,一般要遵循一定的规则:
下面给出一个中断服务程序的简单示例,可以参考,所以远不是一条iretd指令这么简单:
void __declspec (naked) InterruptHandler()  
{
    _asm
    {
        PUSHAD
        PUSHFD
        PUSH FS
    
        MOV     EBX,00000030h
        MOV     FS,BX
        SUB     ESP, 50h        
        MOV     EBP,ESP
    
        ;Setup the exception frame to NULL
        MOV     EBX,DWORD PTR CS:[0FFDFF000h]
        MOV     DWORD PTR DS:[0FFDFF000h], 0FFFFFFFFh
        MOV     DWORD PTR [EBP],EBX
    
        ;Save away the existing KSS EBP
        MOV     ESI, DWORD PTR CS:[0FFDFF124h]
        MOV     EBX,DWORD PTR [ESI+00000128h]
        MOV     DWORD PTR [EBP+4h],EBX
        MOV     DWORD PTR [ESI+00000128h],EBP
    
        ;Save away  the thread mode (kernel/user)
        MOV     EDI,DWORD PTR [ESI+00000134h]
        MOV     DWORD PTR [EBP+8h],EDI
    
        ;Set the thread mode (kernel/user) based on the code selector
        MOV     EBX,DWORD PTR [EBP+7Ch]
        AND     EBX,01
        MOV     BYTE PTR [ESI+00000134h],BL
    
        STI    
    }
    
    DbgPrint("%S:Test Call\n",DRIVER_DEVICE_NAME);
        
    
    _asm
    {
        MOV     ESI,DWORD PTR CS:[0FFDFF124h]
        MOV     EBX,DWORD PTR [EBP+4]
        MOV     DWORD PTR [ESI+00000128h],EBX
    
        ;Restore the exception frame
        MOV     EBX,DWORD PTR [EBP]
        MOV     DWORD PTR FS:[00000000],EBX
    
        ;Restore the thread mode
        MOV     EBX,DWORD PTR [EBP+8h]
        MOV     ESI,DWORD PTR FS:[00000124h]
        MOV     BYTE PTR [ESI+00000134h],BL
        ADD     ESP, 50h
        POP     FS
        POPFD
        POPAD
    }
    
    _asm iretd
    
}

DbgPrint前面和后面的语句不是一定要这样实现,但是建议这样做,因为这是系统实现服务程序的一般做法
游客

返回顶部