找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 3992|回复: 1

关于win7 32位输出IDT中断服务描述表的疑问

[复制链接]

8

主题

51

回帖

0

精华

银牌会员

积分
369
发表于 2016-8-5 23:05:24 | 显示全部楼层 |阅读模式
今天简单写了一段代码
  1. void ShowIDTInfo()
  2. {
  3.         IDTINFOR idt_info;
  4.         IDTENTRY* idt_entries;
  5.         unsigned long count;
  6.         __asm sidt  idt_info;
  7.         idt_entries = (IDTENTRY*)MAKELONG(idt_info.LowIDTbase, idt_info.HiIDTbase);
  8.         KdPrint(("interrupt idt_entries 0x%08X\n", idt_entries));
  9.         for (count = 0; count <= MAX_IDT_ENTRIES; count++)
  10.         {
  11.                 IDTENTRY *cur_idt = &idt_entries[count];
  12.                 unsigned long addr = 0;
  13.                 addr = MAKELONG(cur_idt->LowOffset, cur_idt->HiOffset);
  14.                 KdPrint(("Interrupt %d: ISR is 0x%08X\n", count, addr));
  15.         }
  16. }
复制代码

想输出ISR地址看看 然而发现一点问题 还请大牛指点一二

win7 32位ISR地址

win7 32位ISR地址

比如为什么序号为2的ISR地址在PCHUNT中有地址 而我写的代码打印出来地址是0x00000000
通过windbg查看IDT地址0x80b95400中ISR描述符发现序号2的对应内容00580000 00008500
按照
  1. typedef struct
  2. {
  3.         unsigned short LowOffset;
  4.         unsigned short selector;
  5.         unsigned char  unused_Io;
  6.         unsigned char  segment_type : 4;
  7.         unsigned char  system_segment_flag : 1;
  8.         unsigned char  DPL : 2;
  9.         unsigned char  P : 1;
  10.         unsigned short HiOffset;
  11. }IDTENTRY;
复制代码
结构解析也确实地址为0,那么我的程序显示应该是正确的。
那么问题来了 为什么会和PCHUNT不一样呢 他那个地址又是什么?怎么得到的?
另通过对比 发现凡是短选择子不是0x01的在我的程序里显示地址都是0
还请大牛指点迷津!!!

857

主题

2632

回帖

2

精华

管理员

此生无悔入华夏,  长居日耳曼尼亚。  

积分
36130
发表于 2016-8-6 07:48:20 | 显示全部楼层
XT不一定是对的,结果以WINDBG为准。
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

快速回复 返回顶部 返回列表