阅读:1262回复:0
我用这样的方法能否将PC机中原有的中断 换成我自己的中断啊,
///////////////////////////////////
#pragma pack(1) //定义 IDTR typedef struct tagIDTR { short Limit; //段界限 unsigned int Base; //段基址 }IDTR, *PIDTR; //////////////////////////////////// //定义 IDT typedef struct tagIDTENTRY { unsigned short OffsetLow; unsigned short Selector; unsigned short Reserved; unsigned char Type:4; unsigned char Always0:1; unsigned char Dpl:2; unsigned char Present:1; unsigned short OffsetHigh; }IDTENTRY, *PIDTENTRY; #pragma pack() ///////////////////////////////////////// // 添加的中断 #define MYINT 0x0e extern VOID _cdecl MyIntFunc(); char IDTBuffer[6]; IDTENTRY OldIdt; PIDTR idtr = (PIDTR)IDTBuffer; ////////////////////////////////////// // 的中断处理函数 VOID _cdecl MyIntFunc() { _asm iretd;//中断返回 } ////////////////////////////////////// //挂接的中断 NTSTATUS AddMyInt() { PIDTENTRY Idt; //得到 IDTR _asm { sidt IDTBuffer } Idt = (PIDTENTRY)idtr->Base;//得到IDT基地址 //保存原有的 IDT RtlCopyMemory(&OldIdt, &Idt[MYINT],sizeof(OldIdt)); //禁止中断 _asm cli //设置 IDT 各项添加我们的中断 Idt[MYINT].OffsetLow =(unsigned short)MyIntFunc;//取中断处理函数低16位 Idt[MYINT].Selector =8; //设置内核段选择子 Idt[MYINT].Reserved =0; //系统保留 Idt[MYINT].Type =0xE; //设置0xE表示是中断门 Idt[MYINT].Always0 =0; //系统保留必须为0 Idt[MYINT].Dpl =3; //描述符权限,设置为允许 RING Idt[MYINT].Present =1; //存在位设置为1表示有效 Idt[MYINT].OffsetHigh =(unsigned short)((unsigned int)MyIntFunc>>16);//取中断处理函数高16位 //开中断 _asm sti return STATUS_SUCCESS; } ///////////////////////////////////////// //删除中断 VOID RemoveMyInt() { PIDTENTRY Idt; Idt =(PIDTENTRY)idtr->Base; _asm cli //恢复 IDT RtlCopyMemory(&Idt[MYINT],&OldIdt, sizeof(OldIdt)); _asm sti } |
|