edust
驱动中牛
驱动中牛
  • 注册日期2002-04-02
  • 最后登录2003-06-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2093回复:17

再问一个关于 Passthru 理解上的问题,会者不难[30 分]

楼主#
更多 发布于:2002-12-10 14:02
以下讨论 XP 版的 Passthru:

如果我们在 PtReceivePacket() 返回了非 0 值,表示我们暂时不释放对包的所有权,等处理结束之后会调用 NdisReturnPacket() 通知刚才指示包的下层 Miniport 我们已经处理完了,可以释放包资源了,可是我在 Passthru 中看到:PtReceivePacket() 有可能返回非 0 值,但它却没有在任何地方调用 NdisReturnPacket() 啊?这是怎么回事?

最新喜欢:

suerdj2ksuerdj...
mikeluo
驱动老牛
驱动老牛
  • 注册日期2001-09-04
  • 最后登录2007-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-12-10 14:19
MPReturnPacket里面调用的
学而不思则罔,思而不学则殆 学而思之,思而学之,岂非圣人乎?
edust
驱动中牛
驱动中牛
  • 注册日期2002-04-02
  • 最后登录2003-06-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-12-10 14:31
我看代码里的意思好象当包状态是 NDIS_STATUS_RESOURCES 的时候指示过程会立即结束,而不是的时候就代表上层协议一定保留了包的所有权,是这样吗?

为什么当包状态不是 NDIS_STATUS_RESOURCES 的时候上层就一定会保留包呢?
mikeluo
驱动老牛
驱动老牛
  • 注册日期2001-09-04
  • 最后登录2007-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-12-10 14:36
NDIS_STATUS_RESOURCES 是没有资源了,就是没有内存来存这些包了,所以就立刻返回了,不然的话不管是什么状态,协议层都把packet留下了(如果他想要的话),或者是丢弃了(如果他不想要),但是已经和你没有关系了
学而不思则罔,思而不学则殆 学而思之,思而学之,岂非圣人乎?
edust
驱动中牛
驱动中牛
  • 注册日期2002-04-02
  • 最后登录2003-06-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-12-10 14:43
 
不然的话不管是什么状态,协议层都把packet留下了(如果他想要的话),或者是丢弃了(如果他不想要),但是已经和你没有关系了


怎么会跟我没关系了呢?我还等着它的通知来释放资源啊!

你的意思它就算是丢掉了也会调用我们的 ReturnPacketHandler?

难道上层协议的行为模式就是这样的吗:一旦收到包就保留其所有权?
edust
驱动中牛
驱动中牛
  • 注册日期2002-04-02
  • 最后登录2003-06-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-12-10 14:50
可是我从 Passthru 注释里看到的意思好象是说我们自己调用 ReturnPacket 啊,好象这样也说的通。
bingjie
驱动小牛
驱动小牛
  • 注册日期2001-08-15
  • 最后登录2007-11-29
  • 粉丝0
  • 关注0
  • 积分36分
  • 威望5点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-12-10 15:06
在Miniport调用NdisIndicateReceivePacket时,需要预先设定packet的status域,当设为STATUS_SUCESS时表示该Packet可以被pending,当设为STATUS_RESOURCES时要求上层的协议必须立即处理该数据。所以在PTReceive里当看到STATUS_RESOURCES时必须立即返回,而不能pending该数据。另外由于是中间层,在PTReceive收到的数据包最终要通过IM的Miniport提交给上层的协议,在上层的协议(TCP/IP)也是同样的处理办法。所以当设为STATUS_SUCCESS时,上层一般总是会返回Pending,最终的返回会调用MiniportReturnPacket表示该Packet已经处理完成。
edust
驱动中牛
驱动中牛
  • 注册日期2002-04-02
  • 最后登录2003-06-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2002-12-10 15:11
PtReceive 跟 ReturnPacket 没关系吧?你说的是 PtReceivePacket ?
mikeluo
驱动老牛
驱动老牛
  • 注册日期2001-09-04
  • 最后登录2007-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2002-12-10 15:17
在Miniport调用NdisIndicateReceivePacket时,需要预先设定packet的status域,当设为STATUS_SUCESS时表示该Packet可以被pending,当设为STATUS_RESOURCES时要求上层的协议必须立即处理该数据。所以在PTReceive里当看到STATUS_RESOURCES时必须立即返回,而不能pending该数据。另外由于是中间层,在PTReceive收到的数据包最终要通过IM的Miniport提交给上层的协议,在上层的协议(TCP/IP)也是同样的处理办法。所以当设为STATUS_SUCCESS时,上层一般总是会返回Pending,最终的返回会调用MiniportReturnPacket表示该Packet已经处理完成。


是的,刚看了以下,xp里面判断的那个Status是从miniport传上来来的packet的状态,
学而不思则罔,思而不学则殆 学而思之,思而学之,岂非圣人乎?
mikeluo
驱动老牛
驱动老牛
  • 注册日期2001-09-04
  • 最后登录2007-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2002-12-10 15:18
PtReceive 跟 ReturnPacket 没关系吧?你说的是 PtReceivePacket ?


你问的不是PtReceivePacket ??
学而不思则罔,思而不学则殆 学而思之,思而学之,岂非圣人乎?
edust
驱动中牛
驱动中牛
  • 注册日期2002-04-02
  • 最后登录2003-06-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2002-12-10 15:27
我问的是 PtReceivePacket,可是 bingjie 好象在说 PtReceive。
mikeluo
驱动老牛
驱动老牛
  • 注册日期2001-09-04
  • 最后登录2007-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2002-12-10 15:33
他说的就是receivepacket,
Status = NDIS_GET_PACKET_STATUS(Packet);这个Status 是在packet里面的OOB数据,不是协议层返回的Status ,方才我没有看程序:)
学而不思则罔,思而不学则殆 学而思之,思而学之,岂非圣人乎?
edust
驱动中牛
驱动中牛
  • 注册日期2002-04-02
  • 最后登录2003-06-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2002-12-11 13:44
我想我现在已经理解了,只是还有个疑虑:

为什么在 PtReceivePacket() 中向上指示的包的包状态不是 NDIS_STATUS_RESOURCES,上层 Protocol 就一定会保留指示上去的包?有什么道理?

此问题澄清后立即结贴给分!诸位高手帮忙!
edust
驱动中牛
驱动中牛
  • 注册日期2002-04-02
  • 最后登录2003-06-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2002-12-11 14:52
高手顺便连这个也说一下吧:

PtSendComplete() 是 MPSend() 和 MPSendPackets() 公用的吗?
mikeluo
驱动老牛
驱动老牛
  • 注册日期2001-09-04
  • 最后登录2007-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2002-12-11 15:06
NDIS_STATUS_RESOURCES是告诉他你的资源不够用了,一定要立刻把东西还给我,不然就没有用的了,否则就是告诉他随便用,用完了在还给你就行了
学而不思则罔,思而不学则殆 学而思之,思而学之,岂非圣人乎?
edust
驱动中牛
驱动中牛
  • 注册日期2002-04-02
  • 最后登录2003-06-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2002-12-11 15:13
 
PtSendComplete() 是 MPSend() 和 MPSendPackets() 公用的吗?


这个呢,mikeluo?
mikeluo
驱动老牛
驱动老牛
  • 注册日期2001-09-04
  • 最后登录2007-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2002-12-11 15:21
PtSendComplete只有一个:)
学而不思则罔,思而不学则殆 学而思之,思而学之,岂非圣人乎?
edust
驱动中牛
驱动中牛
  • 注册日期2002-04-02
  • 最后登录2003-06-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2002-12-11 15:48
 
PtSendComplete只有一个:)


所以是公用的了?!


好,给分!
游客

返回顶部