阅读:1156回复:6
偶想把PACKET放到一个MEMORY POOL里缓冲一下
修改DDK里的PACKET或PASSTHRU可以实现这种缓冲吗?修改哪一个会比较好呢?
偶是个新手,多谢高手指点!! (鞠躬....) |
|
沙发#
发布于:2003-06-14 15:10
什么memory pool啊?怎么个缓冲法?没说清楚
|
|
板凳#
发布于:2003-06-14 16:13
唉,情非得已,老板逼着作的
过程看起来挺简单的:把所有经过TCP/IP STACK的包都截获下来,放到MEMORY中缓冲一下,然后对这些包进行一些路由(ROUTING)方面的处理,处理后再把包放回原处继续传输 挺起来没啥,但就是有些无从下手 :( |
|
地板#
发布于:2003-06-14 17:32
用passthru吧,比较合适。因为没必要将数据包交给应用层处理,所以packet不合适
|
|
地下室#
发布于:2003-06-14 20:06
感谢dshadow79兄!
:) 我最近看了看PASSTHRU的SOURCE CODE,挺复杂的,我平时又很少接触KERNEL MODE方面的编程,不知大虾能否给个指点,大概从哪里入手,分哪些步骤来解决它 真是感激不尽啊! |
|
5楼#
发布于:2003-06-15 11:57
passthru有两个收包函数,在底层miniport收到数据包会调用这两个函数,一般来说,如果底层资源够用的话,会优先调用PtReceivePacket这个函数。PtReceivePacket的参数是PNDIS_PACKET指向的数据包,如果你想转发的话直接把这个包保存起来就好,以备条件满足的时候调用NdisSend发送。
如果底层资源不够的话(例如,无法构建Packet来调用PtReceivePacket),就会调用PtReceive,这里的处理比较复杂一些,必须自己构建一个数据包。 给你个例子: LPBYTE pData = NULL; PNDIS_BUFFER pBuffer = NULL; do { MyPacket = NULL; NdisAllocateMemoryWithTag( &pData, HeaderBufferSize + PacketSize, TAG ); if( pData == NULL )break; NdisMoveMemory( pData, HeaderBuffer, HeaderBufferSize ); NdisMoveMemory( pData + HeaderBufferSize, LookAheadBuffer, PacketSize ); NdisAllocateBuffer( &Status, &pBuffer, pAdapt->SendBufferPoolHandle, pData, HeaderBufferSize + PacketSize ); if( Status != NDIS_STATUS_SUCCESS )break; NdisDprAllocatePacket( &Status, &MyPacket, pAdapt->RecvPacketPoolHandle ); if( Status != NDIS_STATUS_SUCCESS )break; NdisChainBufferAtFront( MyPacket, pBuffer ); NDIS_SET_PACKET_HEADER_SIZE( MyPacket, HeaderBufferSize ); //NdisSend( &status, pAdapt->BindingHandle, MyPacket ); //这里你得把MyPacket保存起来,以便以后发送 if(status==STATUS_PENDING)return NDIS_STATUS_SUCCESS; }while( FALSE ); if( MyPacket ) { NdisUnchainBufferAtFront( MyPacket, &pBuffer ); NdisDprFreePacket( MyPacket ); } if( pBuffer )NdisFreeBuffer( pBuffer ); if( pData )NdisFreeMemory( pData, 0, 0 ); return NDIS_STATUS_SUCCESS; 还有就是得处理好PtSendComplete函数,这个函数是在调用NdisSend发送数据包,底层在发送完成会调用这个函数,留给你来解决资源释放得问题 |
|
6楼#
发布于:2003-06-15 14:34
多谢dshadow79兄指点! :)
感动ings... |
|