Vieira
驱动牛犊
驱动牛犊
  • 注册日期2003-04-27
  • 最后登录2004-05-13
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1156回复:6

偶想把PACKET放到一个MEMORY POOL里缓冲一下

楼主#
更多 发布于:2003-06-14 14:44
修改DDK里的PACKET或PASSTHRU可以实现这种缓冲吗?修改哪一个会比较好呢?

偶是个新手,多谢高手指点!!
(鞠躬....)
dshadow79
驱动牛犊
驱动牛犊
  • 注册日期2002-09-29
  • 最后登录2006-04-10
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-06-14 15:10
什么memory pool啊?怎么个缓冲法?没说清楚
Vieira
驱动牛犊
驱动牛犊
  • 注册日期2003-04-27
  • 最后登录2004-05-13
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-06-14 16:13
唉,情非得已,老板逼着作的

过程看起来挺简单的:把所有经过TCP/IP STACK的包都截获下来,放到MEMORY中缓冲一下,然后对这些包进行一些路由(ROUTING)方面的处理,处理后再把包放回原处继续传输

挺起来没啥,但就是有些无从下手  :(
dshadow79
驱动牛犊
驱动牛犊
  • 注册日期2002-09-29
  • 最后登录2006-04-10
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-06-14 17:32
用passthru吧,比较合适。因为没必要将数据包交给应用层处理,所以packet不合适
Vieira
驱动牛犊
驱动牛犊
  • 注册日期2003-04-27
  • 最后登录2004-05-13
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-06-14 20:06
感谢dshadow79兄!
 :)

我最近看了看PASSTHRU的SOURCE CODE,挺复杂的,我平时又很少接触KERNEL MODE方面的编程,不知大虾能否给个指点,大概从哪里入手,分哪些步骤来解决它

真是感激不尽啊!
dshadow79
驱动牛犊
驱动牛犊
  • 注册日期2002-09-29
  • 最后登录2006-04-10
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
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发送数据包,底层在发送完成会调用这个函数,留给你来解决资源释放得问题
Vieira
驱动牛犊
驱动牛犊
  • 注册日期2003-04-27
  • 最后登录2004-05-13
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2003-06-15 14:34
多谢dshadow79兄指点! :)
感动ings...
游客

返回顶部