阅读:1200回复:2
超难的问题~~~~~~~~~~~~~~~~~~~~~~~~~~~
首先,本人以前没有做过任何驱动代码,但是为了生计,不得不就犯
用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] |
|
沙发#
发布于:2005-08-03 11:51
你和别人共享中断资源的啊
|
|
板凳#
发布于:2005-08-03 13:44
不是啊,每个设备都有自已的资源。
我就是奇怪,为什么IoConnectInterrupt得出来的中断值出,SERVICE_ROUITE函数里的中断值不一样. |
|