redberries
驱动牛犊
驱动牛犊
  • 注册日期2008-01-19
  • 最后登录2008-10-28
  • 粉丝0
  • 关注0
  • 积分32分
  • 威望7点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
阅读:1090回复:0

【求助】看《Windows驱动开发技术详解》 上面碰到的几个问题

楼主#
更多 发布于:2008-10-27 22:01
看《Windows驱动开发技术详解》 上面碰到的几个问题想不明白,希望高手指点,谢谢

1.书上说 IRP结构中的AssociatedIrp.SystemBuffe即是输出缓冲区地址也是输入缓冲区的地址,那如果IRP请求中即有输出地址又有输出地址怎么办?难道是分成两个IRP?

2.关于startIo例程,书上说如果派遣例程想要将IRP串行化,只要调用IoStartPacket就行了,书中给出的IoStartPacket示例代码如下:
void IoStartPacket(PDEVICE_OBJECT pDevObj, PIRP pIrp, PULONG key, PDRIVER_CANCEL cancel)
{
   //获取锁
  .....
  //设置取消例程
  ....
  //设置IRP
  pDevObj->CurrentIrp = pIrp;
  //释放自锁
  ...
  //
 pDevObj->DriverObject->DriverStartIo(pDevObj, pIrp);
}

这里我不明白的是为什么会在IoStartPacket里面调用StartIo例程,既然StartIo例程是串行的,那就应该是不可重入的,如果由IoStartPacket来调用那是不是就会出现StartIo并行执行呢?
另外,根据书上给出的StartIo例程,在其结束时调用了函数IoStartNextPacket,而它给出的IoStartNextPacket示例子函数中又显示调用了StartIo例程,那这样不是递归调用了吗?为什么要这样做呢?我个人的理解应该是IoStartPacket只是将IRP入队列,而对于StartIo的例程的调用应该是系统发现队列不空时调用的,调用完成时将对应的IRP出队列即可,不明白为什么IoStartNextPacket也要由驱动程序自己调用。
初学驱动,理解不正之处请多多请教。
游客

返回顶部