|
今天简单写了一段代码- void ShowIDTInfo()
- {
- IDTINFOR idt_info;
- IDTENTRY* idt_entries;
- unsigned long count;
- __asm sidt idt_info;
- idt_entries = (IDTENTRY*)MAKELONG(idt_info.LowIDTbase, idt_info.HiIDTbase);
- KdPrint(("interrupt idt_entries 0x%08X\n", idt_entries));
- for (count = 0; count <= MAX_IDT_ENTRIES; count++)
- {
- IDTENTRY *cur_idt = &idt_entries[count];
- unsigned long addr = 0;
- addr = MAKELONG(cur_idt->LowOffset, cur_idt->HiOffset);
- KdPrint(("Interrupt %d: ISR is 0x%08X\n", count, addr));
- }
- }
复制代码
想输出ISR地址看看 然而发现一点问题 还请大牛指点一二
win7 32位ISR地址
比如为什么序号为2的ISR地址在PCHUNT中有地址 而我写的代码打印出来地址是0x00000000
通过windbg查看IDT地址0x80b95400中ISR描述符发现序号2的对应内容00580000 00008500
按照- typedef struct
- {
- unsigned short LowOffset;
- unsigned short selector;
- unsigned char unused_Io;
- unsigned char segment_type : 4;
- unsigned char system_segment_flag : 1;
- unsigned char DPL : 2;
- unsigned char P : 1;
- unsigned short HiOffset;
- }IDTENTRY;
复制代码 结构解析也确实地址为0,那么我的程序显示应该是正确的。
那么问题来了 为什么会和PCHUNT不一样呢 他那个地址又是什么?怎么得到的?
另通过对比 发现凡是短选择子不是0x01的在我的程序里显示地址都是0
还请大牛指点迷津!!! |
|