阅读:1269回复:3
如何分配两个中断给驱动程序?
偶在写一个驱动程序(win98 wdm),需要两个中断。俺在调试一个中断的时候,没有问题。
俺用的是ds2.5,他的wizard只能生成一个中断服务程序,我用了,没有问题,但我需要两个中断,我在inf文件中设置: IRQCONGIF=10 IRQCONFIG=11 在设备管理->系统中也都识别出来了,系统给驱动分配了两个中断,而且没有冲突。 在设备驱动中是这样处理的,所有ds2.5中生成的关于中断的语句,我都仿照着写了一便给另一个中断: m_Get_Data 是ds2.5生成的,m_Circle是我自己仿照写的: device.h 中 KInterrupt m_Get_Data; KInterrupt m_Circle; KDeferredCall m_DpcFor_Get_Data; KDeferredCall m_DpcFor_Circle; 。。。。。 。。。。。 BOOLEAN Isr_Get_Data(void); // COMMENT_ONLY BOOLEAN Isr_Circle(void); 。。。。。 。。。。。 MEMBER_ISR(CounterDevice, Isr_Get_Data); MEMBER_ISR(CounterDevice,Isr_Circle); 在device.cpp中的OnStartDevice中 NTSTATUS CounterDevice::OnStartDevice(KIrp I) { t << \"Entering CounterDevice::OnStartDevice\\n\"; NTSTATUS status = STATUS_SUCCESS; I.Information() = 0; // Get the list of raw resources from the IRP PCM_RESOURCE_LIST pResListRaw = I.AllocatedResources(); // Get the list of translated resources from the IRP PCM_RESOURCE_LIST pResListTranslated = I.TranslatedResources(); // Initialize and connect the interrupt status = m_Get_Data.InitializeAndConnect( pResListTranslated, LinkTo(Isr_Get_Data), this ); if (!NT_SUCCESS(status)) { Invalidate(); return status; } status = m_Circle.InitializeAndConnect( pResListTranslated, LinkTo(Isr_Circle), this ); if (!NT_SUCCESS(status)) { Invalidate(); return status; } // Setup the DPC to be used for interrupt processing m_DpcFor_Get_Data.Setup(LinkTo(DpcFor_Get_Data), this); m_DpcFor_Circle.Setup(LinkTo(DpcFor_Circle),this); // TODO: Add device-specific code to start your device. // The base class will handle completion return status; } 用SoftIce跟踪的时候,两个InitializeAndConnect都没有出错。 我觉的是资源分配有问题,两个InitializeAndConnect函数得到的参数都是一样的,他怎么知道如何把哪个中断分配给相应的ISR,也就是把中断10分配给m_Get_Data,把中断11分配给m_Circle。 问题是我也不知道怎么分配两个中断,有那为DX 知道吗,请不吝赐教。谢谢! |
|
沙发#
发布于:2004-05-13 12:11
用另一个初始化函数Initlize();应该就可以了,那里第二个参数可以选择资源的偏移.
|
|
|
板凳#
发布于:2004-05-14 16:37
各位大侠,能不能说得细一点.
w我也要做个挂在 中断8上的中断驱动与win32控制台通信. 请各位指点啊!!! |
|
地板#
发布于:2004-05-18 09:32
采用下面的方法可以试试:
NTSTATUS CounterDevice::OnStartDevice(KIrp I) { t << \"Entering CounterDevice::OnStartDevice\\n\"; NTSTATUS status = STATUS_SUCCESS; I.Information() = 0; // Get the list of raw resources from the IRP PCM_RESOURCE_LIST pResListRaw = I.AllocatedResources(); // Get the list of translated resources from the IRP PCM_RESOURCE_LIST pResListTranslated = I.TranslatedResources(); // Initialize and connect the interrupt status = m_Get_Data.Initialize(pResListTranslated,0,FALSE); if (!NT_SUCCESS(status)) { Invalidate(); return status; } status = m_Circle.Initialize( pResListTranslated, 1, FALSE ); if (!NT_SUCCESS(status)) { Invalidate(); return status; } // Setup the DPC to be used for interrupt processing m_DpcFor_Get_Data.Setup(LinkTo(DpcFor_Get_Data), this); m_DpcFor_Circle.Setup(LinkTo(DpcFor_Circle),this); // TODO: Add device-specific code to start your device. m_Get_Data.connect(LinkTo(Isr_Get_Data),this); m_Circle.connect(LinkTo(Isr_Circle),this); // The base class will handle completion return status; } 我在2000下试过可以,不知道在98下如何。估计没有问题,微软不是号称WDM在98和2000下是源码级通用的嘛 :D :D :D |
|
|