3164|1

77

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

passthru在ptreceive中截获数据包问题。用debugging打印出来是乱码。 [复制链接]

修改后的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
    )
/*++
Routine Description:
    Handle receive data indicated up by the miniport below. We pass
    it along to the protocol above us.
    If the miniport below indicates packets, NDIS would more
    likely call us at our ReceivePacket handler. However we
    might be called here in certain situations even though
    the miniport below has indicated a receive packet, e.g.
    if the miniport had set packet status to NDIS_STATUS_RESOURCES.
        
Arguments:
   
Return Value:
    NDIS_STATUS_SUCCESS if we processed the receive successfully,
    NDIS_STATUS_XXX error code if we discarded it.
--*/
{
    PADAPT            pAdapt = (PADAPT)ProtocolBindingContext;
    PNDIS_PACKET      MyPacket, Packet = NULL;
    NDIS_STATUS       Status = NDIS_STATUS_SUCCESS,Status1;
   
   
   
   
   
UCHAR CONTENT='c';
PUCHAR pPacketContent;
PUCHAR pBuf=NULL;
UINT BufLength;
MDL * pNext;
UINT i;
NDIS_PHYSICAL_ADDRESS HighestAcceptableMax = NDIS_PHYSICAL_ADDRESS_CONST(-1, -1);

    if ((!pAdapt->MiniportHandle) || (pAdapt->MPDeviceState > NdisDeviceStateD0))
    {
        Status = NDIS_STATUS_FAILURE;
    }
    else do
    {
        //
        // Get at the packet, if any, indicated up by the miniport below.
        //
        Packet = NdisGetReceivedPacket(pAdapt->BindingHandle, MacReceiveContext);
        if (Packet != NULL)
        {


            NdisDprAllocatePacket(&Status,
                                &MyPacket,
                                pAdapt->RecvPacketPoolHandle);
            if (Status == NDIS_STATUS_SUCCESS)
            {

                NDIS_PACKET_FIRST_NDIS_BUFFER(MyPacket) = NDIS_PACKET_FIRST_NDIS_BUFFER(Packet);
                NDIS_PACKET_LAST_NDIS_BUFFER(MyPacket) = NDIS_PACKET_LAST_NDIS_BUFFER(Packet);

                NDIS_SET_ORIGINAL_PACKET(MyPacket, NDIS_GET_ORIGINAL_PACKET(Packet));
                NDIS_SET_PACKET_HEADER_SIZE(MyPacket, HeaderBufferSize);

                NDIS_SET_PACKET_STATUS(MyPacket, NDIS_STATUS_RESOURCES);
               
                //     
                NdisQueryPacket( MyPacket,NULL,NULL,NULL,&PacketSize);
               
                Status= NdisAllocateMemory( &pPacketContent, 2000, 0,HighestAcceptableMax);
                if (Status!=NDIS_STATUS_SUCCESS ) return Status;
                NdisZeroMemory (pPacketContent, 2000);
                NdisQueryBufferSafe(MyPacket->Private.Head, &pBuf, &BufLength, 32 );
                if(pBuf==NULL){ DBGPRINT(("获取包内容不成功\n"));}
                else
                {   DBGPRINT(("Head内容是:%s\n",&pBuf));
                    DBGPRINT(("Head大小是:%d\n",BufLength));
                }
                NdisMoveMemory(pPacketContent, pBuf, BufLength);
                i = BufLength;
   
                pNext = MyPacket->Private.Head;
                for(;;)
                {
                    DBGPRINT(("进入内部循环\n"));
                    if(pNext == MyPacket->Private.Tail)
                    {
                        DBGPRINT(("到达尾部,跳出循环\n"));                         //每次运行到这里就跳出for循环了,也就是说Private.Head=Private.Tail。是怎么回事啊?
                        break;
                    }
                    
                    pNext = pNext->Next; //指针后移
                    if(pNext == NULL)
                    {
                        DBGPRINT(("下一缓冲区为空,跳出循环\n"));
                        break;
                    }
                    NdisQueryBufferSafe(pNext,&pBuf,&BufLength,32);
                    NdisMoveMemory(pPacketContent+i,pBuf,BufLength);
                    i+=BufLength;
                    DBGPRINT(("部分包内容是:%s\n",&pBuf));
                    DBGPRINT(("部分包大小是:%d\n",BufLength));
                }
               
                DBGPRINT(("ptreceive\n"));
                DBGPRINT(("包内容是:%s\n",&pPacketContent));
                DBGPRINT(("包大小是:%d\n",i));


                NdisMIndicateReceivePacket(pAdapt->MiniportHandle, &MyPacket, 1);
                NdisDprFreePacket(MyPacket);
                break;
            }
        }
        else
        {
            //
            // The miniport below us uses the old-style (not packet)
            // receive indication. Fall through.
            //
        }
        //
        // Fall through if the miniport below us has either not
        // indicated a packet or we could not allocate one
        //
        if (Packet != NULL)
        {
            //
            // We are here because we failed to allocate packet
            //
            PtFlushReceiveQueue(pAdapt);
        }
        if ((pAdapt->MiniportHandle == NULL)
                || (pAdapt->MPDeviceState > NdisDeviceStateD0))
        {
            break;
        }
        
        pAdapt->IndicateRcvComplete = TRUE;
        switch (pAdapt->Medium)
        {
            case NdisMedium802_3:
            case NdisMediumWan:
                NdisMEthIndicateReceive(pAdapt->MiniportHandle,
                                             MacReceiveContext,
                                             HeaderBuffer,
                                             HeaderBufferSize,
                                             LookAheadBuffer,
                                             LookAheadBufferSize,
                                             PacketSize);
                break;
            case NdisMedium802_5:
                NdisMTrIndicateReceive(pAdapt->MiniportHandle,
                                            MacReceiveContext,
                                            HeaderBuffer,
                                            HeaderBufferSize,
                                            LookAheadBuffer,
                                            LookAheadBufferSize,
                                            PacketSize);
                break;
            case NdisMediumFddi:
                NdisMFddiIndicateReceive(pAdapt->MiniportHandle,
                                              MacReceiveContext,
                                              HeaderBuffer,
                                              HeaderBufferSize,
                                              LookAheadBuffer,
                                              LookAheadBufferSize,
                                              PacketSize);
                break;
            default:
                ASSERT(FALSE);
                break;
        }
    } while(FALSE);
    return Status;
}
每个打印的地方用%s打出来都是乱码,是不是包中数据不在pPacketContent里面啊?我添的代码是不是有什么问题哦?从网上很多地方看到的都是这样的啊

最新回复

知道这么打印出来了,用%x打印出来的。但是又有新的问题,貌似这样只拿到了广播包而且是向外发送的。明明是在ptreceive函数中添加的代码怎么会拿到向外发送的呢?这么久了怎么都没一位牛人来解答一下呢?  详情 回复 发表于 2009-5-31 22:39
点赞 关注

回复
举报

69

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
知道这么打印出来了,用%x打印出来的。但是又有新的问题,貌似这样只拿到了广播包而且是向外发送的。明明是在ptreceive函数中添加的代码怎么会拿到向外发送的呢?这么久了怎么都没一位牛人来解答一下呢?
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表