sjcode
驱动牛犊
驱动牛犊
  • 注册日期2005-05-11
  • 最后登录2011-03-16
  • 粉丝0
  • 关注0
  • 积分15分
  • 威望85点
  • 贡献值0点
  • 好评度19点
  • 原创分0分
  • 专家分0分
阅读:1200回复:2

超难的问题~~~~~~~~~~~~~~~~~~~~~~~~~~~

楼主#
更多 发布于:2005-08-03 10:15
  首先,本人以前没有做过任何驱动代码,但是为了生计,不得不就犯


用IoConnectInterrupt()的时候,Kernel会构造Interrupt Object. 然后Kernel把Interrupt Object的地址放到IDT的相应表项中。

但是,我在处理这个PKINTERRUPT时,出现了以下问题

我是在这里调用IoConnectInterrupt的
Status = SoundConnectInterruptEx(pGDI->lppCardData[Board]->InterruptVector,
                                           pGDI->lppCardData[Board]->InterruptLevel,
                                           pGDI->lppCardData[Board]->InterruptAffinity,                                          
                                           SoundISR,
                                           (PVOID)pGDI,
                                           INTERRUPT_MODE,
                                           TRUE,  // Sharable for SB16
                                           &pGDI->lppCardData[Board]->Interrupt);


NTSTATUS
SoundConnectInterruptEx(
       IN ULONG InterruptVector,
       IN ULONG InterruptRequestLevel,
       IN ULONG Affinity,
       IN PKSERVICE_ROUTINE Isr,
       IN PVOID ServiceContext,
       IN KINTERRUPT_MODE InterruptMode,
       IN BOOLEAN ShareVector,
       OUT PKINTERRUPT *Interrupt
)
{
      
       NTSTATUS Status;

       //
       // Call HalGetInterruptVector to get the interrupt vector,
       // processor affinity and  request level to pass to IoConnectInterrupt
       //
      
       Status = IoConnectInterrupt(Interrupt, Isr, ServiceContext, (PKSPIN_LOCK)NULL, InterruptVector, (KIRQL)InterruptRequestLevel,
                                   (KIRQL)InterruptRequestLevel, InterruptMode, ShareVector, (KAFFINITY)Affinity, FALSE);       // No floating point save
       DOUT(DBG_PRINT,("In SoundCXonnectInterruptEx Interrupt:0x%08X",Interrupt));
       return Status == STATUS_INVALID_PARAMETER ? STATUS_DEVICE_CONFIGURATION_ERROR : Status;
}

但是我在SoundISR中断处理例程里,总是会出现
if(lpCardData->Interrupt != pInterrupt)  //check interrupt object is the one we want
                {
                       DOUT(DBG_PRINT,("In SoundISR lpCardData->Interrupt != pInterrupt"));//adder sj.code  possibility
                     DOUT(DBG_PRINT,("lpCardData->Interrupt:0x%08X     pInterrupt:0x%08X",lpCardData->Interrupt,pInterrupt));
                     continue;
                }

也就是IoConnectInterrupt返回的中断值,与SoundISR中断处理例程里的中断值不一样。



环境:winxp sp2,在intel 915芯片组上跑,是超线程CPU

我怀疑此问题来自于超线程CPU,不知道对不对,望各位大虾指点。
[p:4]
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
沙发#
发布于:2005-08-03 11:51
你和别人共享中断资源的啊
sjcode
驱动牛犊
驱动牛犊
  • 注册日期2005-05-11
  • 最后登录2011-03-16
  • 粉丝0
  • 关注0
  • 积分15分
  • 威望85点
  • 贡献值0点
  • 好评度19点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2005-08-03 13:44
不是啊,每个设备都有自已的资源。

我就是奇怪,为什么IoConnectInterrupt得出来的中断值出,SERVICE_ROUITE函数里的中断值不一样.
游客

返回顶部