首页
社区
课程
招聘
[求助]NDIS的一个疑问
发表于: 2012-5-6 21:06 4402

[求助]NDIS的一个疑问

2012-5-6 21:06
4402
小弟这两天做一个小型的UDP协议栈,用的DDK的例子ndisprot修改的,现在还把协议栈放到应用层在做,把NDIS驱动当成一个访问网卡的接口,但是遇到一个奇怪的问题.

这个问题是在做arp协议的时候出现的,当我广播arp请求后,立刻读取网卡数据,不知道为什么,居然会把我发送的数据给读取出来,理论上应该是网卡收到数据后,会调用你注册的协议驱动里面的某个回调函数的.

在ndisprot中,收到数据后会把包缓存到一个队列中,当应用层有请求时才反馈给应用层,我在向ndisprot驱动发起读取请求的时候,不光会把发送的数据读取出来,而且ReadFile返回的读取到的字节数非常大,1244968 bytes.
在驱动中,ndisprot反馈应用层数据的时候,是通过如下代码计算的,DDK的代码应该不会有问题啊
           BytesRemaining = MmGetMdlByteCount(pIrp->MdlAddress);

        pNdisBuffer = NDIS_PACKET_FIRST_NDIS_BUFFER(pRcvPacket);

        //
        // Copy the data in the received packet into the buffer provided by the client.
        // If the length of the receive packet is greater than length of the given buffer,
        // we just copy as many bytes as we can. Once the buffer is full, we just discard
        // the rest of the data, and complete the IRP sucessfully even we only did a partial copy.
        //
        while (BytesRemaining && (pNdisBuffer != NULL))
        {
#ifndef WIN9X
            NdisQueryBufferSafe(pNdisBuffer, &pSrc, &BytesAvailable, NormalPagePriority);

            if (pSrc == NULL)
            {
                DEBUGP(DL_FATAL,
                    ("ServiceReads: Open %p, QueryBuffer failed for buffer %p\n",
                            pOpenContext, pNdisBuffer));
                break;
            }
#else
            NdisQueryBuffer(pNdisBuffer, &pSrc, &BytesAvailable);
#endif

            if (BytesAvailable)
            {
                ULONG       BytesToCopy = MIN(BytesAvailable, BytesRemaining);

                NPROT_COPY_MEM(pDst, pSrc, BytesToCopy);
                BytesRemaining -= BytesToCopy;
                pDst += BytesToCopy;
            }

            NdisGetNextBuffer(pNdisBuffer, &pNdisBuffer);
        }

        //
        //  Complete the IRP.
        //
        pIrp->IoStatus.Status = STATUS_SUCCESS;
        pIrp->IoStatus.Information = MmGetMdlByteCount(pIrp->MdlAddress) - BytesRemaining;

应用层读取如下代码:
PacketLength为以太网帧长度1514,ByteRead居然返回1244968,囧
bSuccess = (BOOLEAN)ReadFile(Handle,(LPVOID)pReadBuf,PacketLength,BytesRead,NULL);

那请问大牛们,这是怎么一回事呢

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 796
活跃值: (370)
能力值: ( LV9,RANK:380 )
在线值:
发帖
回帖
粉丝
2
方便就上code来瞧瞧。
2012-5-7 17:46
0
雪    币: 13
活跃值: (59)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
代码太过多了,刚发现自己有个地方弄错了,但是还有个问题,就是读的信息,是发送出去的报,这个还是一个很郁闷的事情,我先自己捣鼓一下再来
2012-5-7 22:04
0
游客
登录 | 注册 方可回帖
返回
//