zhenlongyang
驱动小牛
驱动小牛
  • 注册日期2004-10-28
  • 最后登录2010-07-26
  • 粉丝1
  • 关注0
  • 积分729分
  • 威望100点
  • 贡献值0点
  • 好评度66点
  • 原创分0分
  • 专家分0分
阅读:1307回复:3

这算不算一个高难的问题呀?新手区无人回答,拜托高手们了!

楼主#
更多 发布于:2005-06-23 13:48
  能给我一个能正确、安全编译运行的、通过直接修改中断描述符表加载中断的驱动程序源代码么?最好是调试通过可跟踪IRQ0(实模式下的INT 8时钟中断)中断的例子。另外,驱动程序最好是NT模式的,不要使用WDM的电源管理及即插即用功能。
还有一个小但却“难”的问题:在驱动程序中,如何能知道Windows2000下,某个IRQ所对应的中断号呢?使用HalGetInterruptVector()函数不能对某些IRQ(比如IRQ0和IRQ1等)进行操作,还望高手们不吝赐教,谢谢!
liuge
驱动牛犊
驱动牛犊
  • 注册日期2004-06-02
  • 最后登录2005-07-06
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望4点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于: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 );
...
wonder_2001
驱动小牛
驱动小牛
  • 注册日期2002-07-02
  • 最后登录2010-12-03
  • 粉丝0
  • 关注0
  • 积分452分
  • 威望96点
  • 贡献值0点
  • 好评度36点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2005-06-24 12:51
请问楼上大哥这代码的编译连接环境是什么?
liuge
驱动牛犊
驱动牛犊
  • 注册日期2004-06-02
  • 最后登录2005-07-06
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望4点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2005-06-24 13:52
就是驱动程序的一般编译环境。你把代码嵌到任何一个驱动程序中都可以。
游客

返回顶部