whistlezl
驱动小牛
驱动小牛
  • 注册日期2003-01-28
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2085回复:2

IRP_MN_START_DEVICE的处理程序的疑问?

楼主#
更多 发布于:2003-07-12 14:00

   以下是Walter Oney书中的处理IRP_MN_START_DEVICE请求的代码(第六章的第二部分):
NTSTATUS HandleStartDevice(PDEVICE_OBJECT fdo, PIRP Irp)
{
  Irp->IoStatus.Status = STATUS_SUCCESS;
  NTSTATUS status = ForwardAndWait(fdo, Irp);
  if (!NT_SUCCESS(status))
    return CompleteRequest(Irp, status, Irp->IoStatus.Information);
  PIO_STACK_LOCATION stack = IoGetCurrentIrpStackLocation(Irp);
  status = StartDevice(fdo, <additional args>);
  return CompleteRequest(Irp, status, Irp->IoStatus.Information);
}

   为什么在StartDevice()调用前必须要调用ForwardAndWait()?
   也就是说为什么要先让低层驱动程序完成,才处理这个IRP呢?然后才处理StartDevice()?
cjunzzy
驱动牛犊
驱动牛犊
  • 注册日期2002-11-15
  • 最后登录2005-11-12
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-07-23 16:50
forwardandwait历程不是完成这个irp,而是将设备堆栈复制到下一层,并且将irp传给下一层驱动来处理,这是必要的,因为:

如果底层驱动没有返回成功,有可能该irp已经被标志为取消,或者处于deletepending状态,此时就没有必要做startdevice的工作了。
qingwen
驱动牛犊
驱动牛犊
  • 注册日期2009-02-20
  • 最后登录2010-07-11
  • 粉丝0
  • 关注0
  • 积分43分
  • 威望381点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2010-07-01 15:36
哦,学习了
游客

返回顶部