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

如何理解中断与分发例程

楼主#
更多 发布于:2002-01-05 11:50
作为一个初学者,我深深感到如何写好驱动程序里中断例程非常重要.
但是我偏偏没有很好的理解中断与分发例程的关系,在这里希望各位前辈给我指点.

我现在列举一个简单的模型:

1.应用程序产生的IRP(如读.写)通过分发例程发送给标准设备的StartIo串行处理;

2.从驱动程序写数据到设备时,需要一个写中断..从设备读数据到驱动程序时,需要一个读中断.

我现在不是很明白IRP如何在这种模型中,是如何处理的,是怎样个流程.
是不是在AddDevice例程中,使用了IoConnectInterrupt例程链接到中断以后,在处理IRP的时候,必须等待到中断,标准设备的StartIo例程才开始处理IRP?


 
jeosph
驱动中牛
驱动中牛
  • 注册日期2001-04-19
  • 最后登录2006-08-08
  • 粉丝0
  • 关注0
  • 积分96分
  • 威望11点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-01-11 10:36
非常感谢jeosph。
现在我的困惑就是如何在什么地方进行处理IRP。

比如说现在我的程序中有一个Read和Write函数,对设备进行读和写。如果没有中断时,这些函数是在StartIo中进行处理。

VOID StartIo(IN PDEVICE_OBJECT fdo,IN PIRP Irp)
{  
PWDM_DEVICE_EXTENSION dx = (PWDM1_DEVICE_EXTENSION)fdo->DeviceExtension;
PIO_STACK_LOCATION IrpStack = IoGetCurrentIrpStackLocation(Irp);

NTSTATUS status = STATUS_SUCCESS;

switch( IrpStack->MajorFunction)
{
case IRP_MJ_WRITE:
Write(dx,Irp);    (***)
break;

case IRP_MJ_READ:
Read(dx,Irp);
break;

default:
status = STATUS_NOT_SUPPORTED;
break;
}

IoStartNextPacket( fdo, TRUE);
}
如果是中断驱动的驱动程序中该如何调用这些函数来正确处理?比如DpcForIsr中该如何做?
 



在你创建设备时同时:IoInitializeTimer()

在(***) IoStartTimer()

(***)  处不要处理Write(dx,Irp); 到必要的信息必须保留(放在dx中)

等待设备中断

中断服务处理,申请DPC,在DPC中处理Write(dx,Irp),

处理完毕后
iostartNextPacket() 启动下一个IRP
IoCompleteRequest()完成刚才被处理的IRP

Timer的目的就是防止长时间没有中断,比如10秒,没有中断,可以失败此IRP。
另外,在ISR,DPC中就射击到判断fdo->CurrentIrp是否为当前IRP的问题,不要错误地处理了不存在的,或别人的IRP。





 :P
zh_zh_y
驱动牛犊
驱动牛犊
  • 注册日期2001-10-19
  • 最后登录2005-03-16
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-01-10 16:32
非常感谢jeosph。
现在我的困惑就是如何在什么地方进行处理IRP。

比如说现在我的程序中有一个Read和Write函数,对设备进行读和写。如果没有中断时,这些函数是在StartIo中进行处理。

VOID StartIo(IN PDEVICE_OBJECT fdo,IN PIRP Irp)
{  
PWDM_DEVICE_EXTENSION dx = (PWDM1_DEVICE_EXTENSION)fdo->DeviceExtension;
PIO_STACK_LOCATION IrpStack = IoGetCurrentIrpStackLocation(Irp);

NTSTATUS status = STATUS_SUCCESS;

switch( IrpStack->MajorFunction)
{
case IRP_MJ_WRITE:
Write(dx,Irp);
break;

case IRP_MJ_READ:
Read(dx,Irp);
break;

default:
status = STATUS_NOT_SUPPORTED;
break;
}

IoStartNextPacket( fdo, TRUE);
}
如果是中断驱动的驱动程序中该如何调用这些函数来正确处理?比如DpcForIsr中该如何做?
jeosph
驱动中牛
驱动中牛
  • 注册日期2001-04-19
  • 最后登录2006-08-08
  • 粉丝0
  • 关注0
  • 积分96分
  • 威望11点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-01-09 17:06
[quote]作为一个初学者,我深深感到如何写好驱动程序里中断例程非常重要.
但是我偏偏没有很好的理解中断与分发例程的关系,在这里希望各位前辈给我指点.

我现在列举一个简单的模型:

1.应用程序产生的IRP(如读.写)通过分发例程发送给标准设备的StartIo串行处理;

2.从驱动程序写数据到设备时,需要一个写中断..从设备读数据到驱动程序时,需要一个读中断.

我现在不是很明白IRP如何在这种模型中,是如何处理的,是怎样个流程.
是不是在AddDevice例程中,使用了IoConnectInterrupt例程链接到中断以后,在处理IRP的时候,必须等待到中断,标准设备的StartIo例程才开始处理IRP?

1)IoConnectInterrupt只是表明你的驱动程序挂接了一个硬件中断

2)只要你调用IoStartPacket ,就会将一个IRP发到将IRP发IoStartIO

3)IRP被发到IOSTARTIO里后,因为,这个IRP的完成是要靠中断驱动的,也就是说,此IRP的完成在DPC里,在DPC的最后,会有一个IoStartNextPacket,这个函数就会将另一个在队列中的IRP发送到IoStartIO里(如果有IRP在排队的话)





游客

返回顶部