youngyt
驱动牛犊
驱动牛犊
  • 注册日期2003-11-23
  • 最后登录2006-12-29
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1696回复:4

请问大家讨论一下如何区分序列化和非序列化驱动

楼主#
更多 发布于:2004-05-06 01:53
请问大家注意到过这个问题吗?serialized and deserialized,如何得知我们系统上的是前者还是后者?我初次看DDK的时候一直都以为我们现在的系统都是非序列化的MINIPORT DRIVER,直到今天我发现了一个问题

大家看下WINXP DDK 中对NdisMIndicateReceivePacket的描述:If a serialized miniport driver does not set a packet\'s Status member to NDIS_STATUS_RESOURCES, the call to NdisMIndicateReceivePacket gives interested protocols exclusive, read-only access to the buffers chained to each packet. The miniport driver regains ownership of the packet descriptor and the associated buffers as follows:

If the Status in the out-of-band data block is set to NDIS_STATUS_SUCCESS on return from NdisMIndicateReceivePacket, the miniport driver immediately regains ownership of the packet descriptor and all buffers chained to the packet. It can prepare these descriptors for reuse in subsequent receive indications.
If the Status is set to NDIS_STATUS_PENDING on return from NdisMIndicateReceivePacket, the miniport driver regains ownership of the packet descriptor and all buffers chained to the packet when NDIS subsequently calls the miniport driver\'s MiniportReturnPacket function. It can then prepare these descriptors for reuse in subsequent receive indications.
A deserialized miniport driver must not examine the Status of indicated packets on return of NdisMIndicateReceivePacket. Instead, a deserialized miniport driver must save a packet\'s Status in a local variable before indicating up the packet descriptor. When NdisMIndicateReceivePacket returns, the miniport driver should check the saved packet Status. If the miniport driver set the packet\'s Status to NDIS_STATUS_RESOURCES before indicating up the packet descriptor, it should reclaim the packet descriptor immediately after NdisMIndicateReceivePacket returns, preferably by calling its own MiniportReturnPacket function. In this case, NDIS does not call the miniport driver\'s MiniportReturnPacket function to return the packet descriptor. If the miniport driver set the packet\'s Status to NDIS_STATUS_SUCCESS before indicating up the packet descriptor, the miniport driver must not reclaim the packet descriptor until NDIS subsequently returns the packet descriptor to the miniport driver\'s MiniportReturnPacket function.

这样看来序列化的时候是事后检查状态返回值的,它只可能是NDIS_STATUS_SUCCESS和NDIS_STATUS_PENDING两个值。
而非序列化的时候是事前设定一个返回值,这样看来序列化的时候是事后检查状态返回值的,它只可能是NDIS_STATUS_SUCCESS和NDIS_STATUS_RESOURCES两个值。
我在收到每个包上指前都打印其状态,发现也就只有NDIS_STATUS_SUCCESS和NDIS_STATUS_PENDING两个值。这样是不是就可以断定现在我这个系统上是序列化的MINIPORT DRIVER呢?但是很奇怪的是有几次它返回NDIS_STATUS_SUCCESS时本应立即释放资源的,但是它还自己调用了一次MpReturnPacket,这样一来就和非序列化时返回NDIS_STATUS_SUCCESS的处理方法一样了。那这又能说明什么呢?当我照XP的PASSTHRU中的PTRECEIVE里事先设状态为NDIS_STATUS_RESOURCES(也是非序列的方法),这样就没有蓝屏了。
NDIS_SET_PACKET_STATUS(MyPacket, NDIS_STATUS_RESOURCES);
NdisMIndicateReceivePacket(pAdapt->MiniportHandle, &MyPacket, 1);


有大侠知道吗?也请有兴趣的朋友一同讨论一下。
asmsys
驱动老牛
驱动老牛
  • 注册日期2002-03-29
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望17点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-05-07 14:51
\"的PTRECEIVE里事先设状态为 NDIS_STATUS_RESOURCES (也是非序列的方法),这样就没有蓝屏了。\"
no!!!
serialized miniport and deserialized miniport在 IndicatePacket 时都可以设置NDIS_STATUS_RESOURCES,
这不是区分serialized和deserialized的标志。是不是serialized可用OID查询得到。
serialized miniport and deserialized miniport如果设置了 NDIS_STATUS_RESOURCES ,那么他们的
包的处理是一样的,即IndicatePacket返回时,立即回收资源,而且是无条件的。这是因为协议驱动看到
NDIS_STATUS_RESOURCES被设置,他就会复制这个包供自己使用,当然也不会调用ReturnPacket。
    对于非NDIS_STATUS_RESOURCES(NDIS_STATUS_SUCCESS)标志的 IndicatePacket 的调用,serialized和deserialized有不同的操作:
1 serialized:
    1.1 IndicatePacket 返回了NDIS_STATUS_SUCCESS: 立即回收资源,如同设置了NDIS_STATUS_RESOURCES。
1.2 IndicatePacket 返回了NDIS_STATUS_PENDING: 等ReturnPacket时回收资源。
    2 deserialized: 等ReturnPacket时回收资源。

\"发现也就只有NDIS_STATUS_SUCCESS和NDIS_STATUS_PENDING两个值。这样是不是就可以断定现在我这个系统上是序列化的MINIPORT DRIVER呢?\"
deserialized的IndicatePacket调用也返回这两个值,只不过MINIPORT不关心他是什么。(这是我的观点)

“但是很奇怪的是有几次它返回NDIS_STATUS_SUCCESS时本应立即释放资源的,但是它还自己调用了一次 MpReturnPacket”
此时调用 MpReturnPacket ,就是为了释放资源,因为释放资源的代码就在MpReturnPacket中。NDIS能调用,难道自己调用一下就不行吗。
不调用也可以,再写一个释放资源的函数来调用。有这个必要吗。
youngyt
驱动牛犊
驱动牛犊
  • 注册日期2003-11-23
  • 最后登录2006-12-29
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-05-07 17:02
deserialized的IndicatePacket调用也返回这两个值,只不过MINIPORT不关心他是什么。我同意你的说法,因为“A deserialized miniport driver must not examine the Status of indicated packets on return of NdisMIndicateReceivePacket”
它只在乎在indicate前所设的包状态。

对于最后一个解释还需要再讨论一下:
“但是很奇怪的是有几次它返回NDIS_STATUS_SUCCESS时本应立即释放资源的,但是它还自己调用了一次 MpReturnPacket”
此时调用 MpReturnPacket ,就是为了释放资源,因为释放资源的代码就在MpReturnPacket中。NDIS能调用,难道自己调用一下就不行吗。
不调用也可以,再写一个释放资源的函数来调用。有这个必要吗。

你可能误解了我的意思,我执行完上指后是这样写的:
if (Status != NDIS_STATUS_PENDING)
{
这里就是一堆的FREE语句。
}
这样的话,如果返回NDIS_STATUS_SUCCESS那么就会执行释放语句了,这算不算立即释放呢?但是系统还会自动调用一次MPReturnPacket导致重复释放。
asmsys
驱动老牛
驱动老牛
  • 注册日期2002-03-29
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望17点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-05-07 18:06
这种现象我没有遇见过,为此我还做了实验。
youngyt
驱动牛犊
驱动牛犊
  • 注册日期2003-11-23
  • 最后登录2006-12-29
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-05-08 20:32
我原本在2000下运行的好好的,就是放到XP下后,一上网就会返回NDIS_STATUS_SUCCESS,我也很莫名其妙。
游客

返回顶部