阅读:2385回复:1
_asm iretd 返回错误
我在驱动程序中将pc机种的8号中断挂接到自己的中断服务程序上,中断服务程序只有一条返回指令:_asm iretd;可是中断执行到这条指令总是出错不能正确返回,这是为什么啊,我需要有什么主意的吗。错误大概是这样的,:Access Violation :0xc000005,Unhandled exception
|
|
沙发#
发布于: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前面和后面的语句不是一定要这样实现,但是建议这样做,因为这是系统实现服务程序的一般做法 |
|