阅读:1307回复:3
这算不算一个高难的问题呀?新手区无人回答,拜托高手们了!
能给我一个能正确、安全编译运行的、通过直接修改中断描述符表加载中断的驱动程序源代码么?最好是调试通过可跟踪IRQ0(实模式下的INT 8时钟中断)中断的例子。另外,驱动程序最好是NT模式的,不要使用WDM的电源管理及即插即用功能。
还有一个小但却“难”的问题:在驱动程序中,如何能知道Windows2000下,某个IRQ所对应的中断号呢?使用HalGetInterruptVector()函数不能对某些IRQ(比如IRQ0和IRQ1等)进行操作,还望高手们不吝赐教,谢谢! |
|
沙发#
发布于:2005-06-24 12:17
这是改IDT的源代码:
typedef enum { X86_IntGate_Interrupt = 6, X86_IntGate_Trap = 7 }Eu_X86_IntGateType; #pragma pack( push, 1 ) typedef struct { unsigned Offset_0_15: 16; unsigned Selector: 16; unsigned Unused: 8; unsigned GateID :3; unsigned is32bit :1; unsigned _0 :1; unsigned DPL :2; unsigned isPresent :1; unsigned Offset_16_31:16; }St_X86_InterruptGate; typedef struct { unsigned short Limit; St_X86_InterruptGate * pBase; }St_X86_IDT_Register; #pragma pack( pop ) typedef unsigned short UINT16; void IntVector_Set(int iInterruptIndex, int eGateType, int iDPL, UINT16 u16Selector, PVOID pIsr) { St_X86_IDT_Register stIDT; St_X86_InterruptGate *pDes; __asm lea eax, stIDT __asm sidt [eax] pDes = &stIDT.pBase[iInterruptIndex]; pDes->Offset_0_15 = (UINT16)pIsr; pDes->Selector = u16Selector; pDes->Unused = 0; pDes->GateID = eGateType; pDes->is32bit = 1; pDes->_0 = 0; pDes->DPL = iDPL; pDes->isPresent = 1; pDes->Offset_16_31 = (UINT16)((unsigned)pIsr >> 16); } Sample: ... // Attach a clock ISR to vector 0x50. // The interrupt gate is an interrupt gate but not a trap gate. (X86 distinguishes interrupt gate and trap gate) // The ISR runs on DPL 0, i.e. ring 0 // The CS selector of the ISR is 8. The value of the CS in NT/2000 is 8 IntVector_Set( 0x50, X86_IntGate_Interrupt, 0, 8, (PVOID)ClockIsr ); ... |
|
板凳#
发布于:2005-06-24 12:51
请问楼上大哥这代码的编译连接环境是什么?
|
|
地板#
发布于:2005-06-24 13:52
就是驱动程序的一般编译环境。你把代码嵌到任何一个驱动程序中都可以。
|
|