阅读:1642回复:4
passthru 源代码的疑问
PtReceivePacket过程中
NdisGetPacketFlags(MyPacket) = NdisGetPacketFlags(Packet); Status = NDIS_GET_PACKET_STATUS(Packet); NDIS_SET_PACKET_STATUS(MyPacket, Status); NDIS_SET_PACKET_HEADER_SIZE(MyPacket, NDIS_GET_PACKET_HEADER_SIZE(Packet)); if (Status == NDIS_STATUS_RESOURCES) { PtQueueReceivedPacket(pAdapt, MyPacket, TRUE); } else { PtQueueReceivedPacket(pAdapt, MyPacket, FALSE); } if (Status == NDIS_STATUS_RESOURCES) { NdisDprFreePacket(MyPacket);//这里为什么要释放MyPacket } 在这里释放了上层怎么接收的呢? 在进入PtQueueReceivedPacket后也只是简单的将MyPacket指针加入到队列的数组中并没有复制一个副本出来呀? 而上层调用passthru MI的MPReturnPacket后又再度释放了一次 PNDIS_PACKET MyPacket; PRECV_RSVD RecvRsvd; RecvRsvd = (PRECV_RSVD)(Packet->MiniportReserved); MyPacket = RecvRsvd->OriginalPkt; NdisFreePacket(Packet); NdisReturnPackets(&MyPacket, 1); 不会出现重复释放吗??? |
|
沙发#
发布于:2007-03-16 14:48
注意释放资源的条件:if (Status == NDIS_STATUS_RESOURCES)
如果出现 (Status == NDIS_STATUS_RESOURCES)的情况,则执行 PtQueueReceivedPacket(pAdapt, MyPacket, TRUE); 第三个参数TRUE表示不缓存,直接indicate up,所以到了后面当然可以释放资源,没有问题 |
|
板凳#
发布于:2007-03-17 10:15
在MI里不是释放了一次了吗?NdisFreePacket(Packet);
|
|
地板#
发布于:2007-03-31 13:23
两个事不同层次的packet descriptor
|
|
|
地下室#
发布于:2007-03-31 13:24
两个事不同层次的packet descriptor
|
|
|