首页
社区
课程
招聘
[求助]看《Windows驱动开发技术详解》 上面碰到的几个问题
发表于: 2008-10-26 16:15 6495

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

2008-10-26 16:15
6495
看《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也要由驱动程序自己调用。
初学驱动,理解不正之处请多多请教。

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (9)
雪    币: 296
活跃值: (20)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
1 先读后写

2 在调用历程中这样处理:

   初始化事件,一般防到OBJECT中
   设置回调
   调用下一层处理
   if(调用正确)
     {
          返回
     }
   else if(pending)
     {
          等待事件
      }

    回调函数:

    设置事件

这样达到穿性话。此类问题建议到驱网去问问比较好
2008-10-27 17:23
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
谢谢楼上,我到那去看看,不过你说的我还不太明白
1.先读后写,是指先发个读的IRP再发一个写的IRP吗?
2.这个完全没看明白,你说的好像是客户实现串行的过程,我想明白的是驱动内部实现串行的过程,也就是IoStartPacket和IoStartNextPacket的简单原理
2008-10-27 19:59
0
雪    币: 3
活跃值: (28)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
AssociatedIrp.SystemBuffe    并不是你说的: 先发个读的IRP再发一个写的IRP;

是一个IRP;

你用 DeviceIoControl 向驱动提供输入和输出缓冲区, 然后在驱动里获得输入与输出缓冲区的大小, 你就知道了;

第二个问题没看明白,可能是我莱;
2008-10-28 03:29
0
雪    币: 3
活跃值: (28)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
发觉我乱说了, 输入与输出缓冲区的大小又说明什么问题呢? 什么都说明不了, 最多是可以说明是同一个IRP的;

晕, 我才发觉, 这个问题我也不理解得很透彻, 应该是这样的:

设 DeviceIoControl 同时提供了输入与输出缓冲区, I/O管理器产生IRP, 记录了用户程序提供的输入与输出缓冲区的大小, 并根据此要素来找到一片空白内存区域(这个就是AssociatedIrp.SystemBuffe), 然后把用户程序提供的输入数据复制进去, 告诉驱动程序这片内存区域的指针, 驱动程序先把数据读出来, 如果需要, 再向这片内存区域写入数据(控制长度是不是必要的?我也没试过,当然还是控制好), IRP返回, I/O管理器再把这片内存区域的数据复制到用户程序的输出缓冲区里;    ->  这个过程只适合"缓冲区读写方式"
2008-10-28 03:56
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
谢谢楼上,"缓冲区读写方式"是明白了,那如果是直接读取方式估计应该是要发两次IRP了,IRP结构中的MdlAddress只有一份,并且MdlAddress传进来时标识的就是用户地址,
2008-10-28 21:58
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
两次??
读的时候,I/O管理器创建一个MDL来描述用户模式缓冲区的锁定内存页,然后往下层驱动发送,
下层返回时会把数据拷贝到此内存中,然后I/O管理器会把这些数据复制到用户空间的buffer中;
写的时候过程是类似的。

不知道你说的两次是什么意思?
2008-10-28 22:56
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
读的时候,I/O管理器创建一个MDL来描述用户模式缓冲区的锁定内存页,然后往下层驱动发送,
下层返回时会把数据拷贝到此内存中,然后I/O管理器会把这些数据复制到用户空间的buffer中;
写的时候过程是类似的。
=============================================
你为全上只有输出缓冲区,如果同时有输入缓冲区怎么办?
2008-10-29 21:35
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
有这本书的电子图书吗....我只有源代码,没有书,郁闷.....
2008-10-29 22:53
0
雪    币: 3
活跃值: (28)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
很明显, 楼主你没有认真读书, 不认真读书, 碰上一点不明白的就上网问是不行的, 认真读读书,多思考一下, 其实《Windows驱动开发技术详解》这本书都说得很明白, 只是你不够认真, 不留意;
2008-10-31 15:09
0
游客
登录 | 注册 方可回帖
返回
//