3961|4

75

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

撑不住了,passthru的ptreceive的LookAheadBuffer中取得IP头数据是对的,但TCP头怎么不对?? [复制链接]

撑不住了,搞了4天了,实在不行不得已才发帖的
passthru的ptreceive的LookAheadBuffer中取得IP头数据是对的,但TCP头怎么不对??

我的代码:
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            pAdapt = (PADAPT)ProtocolBindingContext;
    PNDIS_PACKET      MyPacket, Packet;
    NDIS_STATUS       Status = NDIS_STATUS_SUCCESS;
   
    if ((!pAdapt->MiniportHandle) || (pAdapt->MPDeviceState > NdisDeviceStateD0))
          Status = NDIS_STATUS_FAILURE;
    else do
    {   
        Packet = NdisGetReceivedPacket(pAdapt->BindingHandle, MacReceiveContext);      
        ////////////////////////////我加入的代码//////////////////////////////
        if ( HeaderBufferSize >= sizeof(ETHeader) )
                  KdPrint(( "ETHeader type : %x\n", ((PETHeader)HeaderBuffer)->type ));
        FilterReceive( LookAheadBuffer, LookAheadBufferSize);
        /////////////////////////////////////////////////////////////////////////////////
        
        if (Packet != NULL)
        {
        。。。。。。。。。。。。。。。。。。。。。passthru原来的代码
        。。。。。。。。。。。。。。。。。。。。。
    。。。。。。。。。。。。。。。。。。。。。
}


VOID FilterReceive(I N PVOID  pData, IN UINT  pDataSize  )
{
    //剩下数据的长度
    ULONG ulLeavingLen = pDataSize;
    PIPHeader pIPHdr;
    PTCPHeader pTCPHdr;

    if ( ulLeavingLen < sizeof( IPHeader ) )
        return;

    pIPHdr = ( PIPHeader  )( pData );

    ulLeavingLen -= sizeof( IPHeader );

    //不是TCP退出
    if ( pIPHdr->ipProtocol != 6 )
    {
        KdPrint(( "pIPHdr->ipProtocol != 6\n" ));
        return;
    }
    if ( ulLeavingLen < sizeof(TCPHeader) )
        return;
  
    pTCPHdr = ( PTCPHeader )( (char*)pIPHdr + (pIPHdr->iphVerLen  &  0xf) * 4 );

    KdPrint(( "TCPHeader sourcePort : %d\n", pTCPHdr->sourcePort ));
    KdPrint(( "TCPHeader destinationPort : %d\n", pTCPHdr->destinationPort ));
}




//IP头和TCP头声明
typedef struct _IPHeader        // 20
{
    UCHAR    iphVerLen;      // 版本号和头长度(各占4位)
    UCHAR    ipTOS;          // 服务类型
    USHORT    ipLength;      // 封包总长度,即整个IP报的长度
    USHORT    ipID;             // 封包标识,惟一标识发送的每一个数据报
    USHORT    ipFlags;         // 标志
    UCHAR    ipTTL;         // 生存时间,就是TTL
    UCHAR    ipProtocol;    // 协议,可能是TCP、UDP、ICMP等
    USHORT    ipChecksum;    // 校验和
    ULONG    ipSource;      // 源IP地址
    ULONG    ipDestination;  // 目标IP地址
} IPHeader, *PIPHeader;


typedef struct _TCPHeader     //20 bytes
{
    USHORT            sourcePort;        // 16位源端口号
    USHORT            destinationPort;    // 16位目的端口号
    ULONG            sequenceNumber;        // 32位序列号
    ULONG            acknowledgeNumber;    // 32位确认号


    UCHAR            dataoffset;        // 高4位表示数据偏移
    UCHAR            flags;            // 6位标志位
                                                               
    USHORT            windows;        // 16位窗口大小
    USHORT            checksum;        // 16位校验和
    USHORT            urgentPointer;        // 16位紧急数据偏移量
} TCPHeader, *PTCPHeader;

取得的IP头数据是对的,但TCP头的源端口和目的端口号都是很大的,明显数据不对!

NdisQueryPacket得到数据的方法我也试了,得到的数据和我这个方法一样,都不对!
     NdisQueryPacket(packet, NULL, NULL, &ndisBuffer, &totalLen);
    while (NULL != ndisBuffer)
    {
        NdisQueryBufferSafe(ndisBuffer, &address, &curLen, NormalPagePriority);
        NdisGetNextBuffer(ndisBuffer, &ndisBuffer);
    }


看代码哪都没错啊,到底怎么回事?


请指教!谢谢!

最新回复

apt04,是ntohs,不是noths,呵呵,谢谢了,不过内核态没有这个调用,只能自己写一个了。 还有我不会你问的问题,不好意思了  详情 回复 发表于 2008-7-4 00:02
点赞 关注

回复
举报

84

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
不会吧,驱动开发网那边搞不定,这边也搞不定吗?
 
 

回复

76

帖子

0

TA的资源

一粒金砂(高级)

板凳
 
bigendian
littleendian,这错误我也犯过,用下noths(unsigned short )就行了
 
 
 

回复

87

帖子

0

TA的资源

一粒金砂(初级)

4
 
我倒是有个其他问题想请教一下呢,为什么我用passthru驱动很多数据报都拦截不到呢?Packet指针也不为NULL,但是指向明显是错的
这个问题困扰我一周了,一直不明白,只要打开网卡混杂模式就可以收到一些自己发出去的数据包了,但是别人机器发给我的还是看不见
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

5
 
apt04,是ntohs,不是noths,呵呵,谢谢了,不过内核态没有这个调用,只能自己写一个了。
还有我不会你问的问题,不好意思了
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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

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

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

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