阅读:1729回复:6
修改PassThru的问题
PassThru 中如下两段代码:
NDIS_STATUS PtReceive( IN NDIS_HANDLE ProtocolBindingContext, IN NDIS_HANDLE MacReceiveContext, IN PVOID HeaderBuffer, IN UINT HeaderBufferSize, IN PVOID LookAheadBuffer, IN UINT LookAheadBufferSize, IN UINT PacketSize ) { ...................以上省略 pAdapt->IndicateRcvComplete = TRUE; switch(pAdapt->Medium) { case NdisMedium802_3: NdisMEthIndicateReceive(pAdapt->MiniportHandle, MacReceiveContext, HeaderBuffer, HeaderBufferSize, LookAheadBuffer, LookAheadBufferSize, PacketSize); break; .................省略 } while(FALSE); return Status; } VOID PtReceiveComplete( IN NDIS_HANDLE ProtocolBindingContext ) { PADAPT pAdapt =(PADAPT)ProtocolBindingContext; ........................ if((pAdapt->MiniportHandle != NULL) && pAdapt->IndicateRcvComplete) { switch(pAdapt->Medium) { case NdisMedium802_3: NdisMEthIndicateReceiveComplete(pAdapt->MiniportHandle); break; .................................. } } pAdapt->IndicateRcvComplete = FALSE; } 我把ptReceive 该成以下形式: NDIS_STATUS PtReceive( IN NDIS_HANDLE ProtocolBindingContext, IN NDIS_HANDLE MacReceiveContext, IN PVOID HeaderBuffer, IN UINT HeaderBufferSize, IN PVOID LookAheadBuffer, IN UINT LookAheadBufferSize, IN UINT PacketSize ) { PVOID HeaderBuffer1,LookAheadBuffer; .............. ...................以上省略 NdisMoveMemory(HeaderBuffer1,HeaderBuffer,HeaderBufferSize); NdisMoveMemory(LookAheadBuffer1,LookAheadBuffer,LookAheadBufferSize); pAdapt->IndicateRcvComplete = TRUE; switch(pAdapt->Medium) { case NdisMedium802_3: NdisMEthIndicateReceive(pAdapt->MiniportHandle, MacReceiveContext, HeaderBuffer1, HeaderBufferSize, LookAheadBuffer1, LookAheadBufferSize, PacketSize); break; .................省略 } while(FALSE); return Status; } 请问:LookAheadBuffer1和HeaderBuffer1在哪里释放比较合适? 是调用完NdisMEthIndicateReceive立即释放还是在PtReceiveComplete中释放,谢谢大虾们指点。 |
|
沙发#
发布于:2004-11-26 12:16
好象上在PtReceiveComplete中释放,好久没有弄NDIS了,记的不是很清楚
|
|
|
板凳#
发布于:2004-12-20 23:13
根本就不需要释放
记住:“谁申请,谁释放” 这两个缓冲区:HeaderBuffer:一般是MAC帧头部,以太网下是14 这时候HeaderBufferSize应该是14 LookAheadBuffer是IP包的开始部分,或者是整个IP包 如果PacketSize == LookAheadBufferSize,说明LookAheadBuffer装的就是一个完整的IP包(包括IP包的头部) 如果PacketSize > LookAheadBufferSize说明这个前视缓冲区只有部分Ip包,系统将要激发MPTransData()例程,在该例程中使用系统调用NdisTranstData()获取没有提交完整的部分 因为HeaderBuffer和LookAheadBuffer都是网卡提交上来的缓冲区 你不必释放它,网卡会自己处理的 |
|
地板#
发布于:2004-12-22 16:27
我想这部分是由内核来管理的,不必自己释放
|
|
|
地下室#
发布于:2004-12-23 09:34
楼上几位,你们都弄错了吧?人家没问HeaderBuffer和LookAheadBuffer什么时候释放,人家问的是LookAheadBuffer1和HeaderBuffer1在哪里释放比较合适.你们不看清楚问题就胡乱回答,这不是误人子弟吗?
我觉得在哪里释放要看LookAheadBuffer1和HeaderBuffer1中的内容在什么时候使用完毕.只要使用完毕就可以释放了 |
|
5楼#
发布于:2007-02-13 09:47
|
|
6楼#
发布于:2007-05-28 14:28
我倒,这个帖子有意思。强!!!
|
|
|