cybercat
驱动牛犊
驱动牛犊
  • 注册日期2001-03-27
  • 最后登录2005-07-29
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1269回复:3

如何分配两个中断给驱动程序?

楼主#
更多 发布于:2003-05-18 21:07
偶在写一个驱动程序(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 知道吗,请不吝赐教。谢谢!
barton
驱动牛犊
驱动牛犊
  • 注册日期2003-06-10
  • 最后登录2008-12-18
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望52点
  • 贡献值0点
  • 好评度17点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-05-13 12:11
用另一个初始化函数Initlize();应该就可以了,那里第二个参数可以选择资源的偏移.
清风拂柳
zhaojun1a
驱动牛犊
驱动牛犊
  • 注册日期2002-10-31
  • 最后登录2012-02-21
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望21点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-05-14 16:37
各位大侠,能不能说得细一点.
w我也要做个挂在
中断8上的中断驱动与win32控制台通信.
请各位指点啊!!!
barton
驱动牛犊
驱动牛犊
  • 注册日期2003-06-10
  • 最后登录2008-12-18
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望52点
  • 贡献值0点
  • 好评度17点
  • 原创分0分
  • 专家分0分
地板#
发布于: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
清风拂柳
游客

返回顶部