#include <windows.h>
#include <stdio.h>
// 存放idtr寄存器的值
char sz[6];
// 声明一个全局变量 存放IDT表中的第二项的值
LONGLONG IdtSecond;
// 用于间接获取IDT表第二项的地址
DWORD* MyFirst;
// 存放IDT表第二项的地址
DWORD MySecond;
VOID _declspec(naked) MyCAll()
{
// 将IDTR寄存器的值放入数组
_asm
{
sidt sz;
}
// IDT表的地址存放于第二个位置
// 获得的是IDT表基址的地址
MyFirst = (DWORD*)&sz[2];
// 获得IDT表第二项的值
MySecond = (*MyFirst) + 8;
// 获取IDT表第二项的值
IdtSecond = *(LONGLONG*)(MySecond);
// 从中断处理函数返回
_asm
{
iretd;
}
}
int main()
{
// 产生异常,进入相应的中断处理函数
_asm
{
int 0x20;
}
printf("%llx\n", IdtSecond);
system("pause");
return 0;
}