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

我用这样的方法能否将PC机中原有的中断 换成我自己的中断啊,

楼主#
更多 发布于:2007-04-23 22:37
  ///////////////////////////////////
#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
}
游客

返回顶部