阅读:1037回复:5
请教:一个低级的问题(我是新手)
我用下面的Packet_Receive函数截获数据后,用CheckRecv对他的数据检查和修改。我只会对LookAheadBuffer的内容处理(已经调试通过),但当PacketSize〉LookaheadBufferSize时,就出现问题,请问我怎么得到(PacketSize-LookaheadBufferSize)这部分内容的地址?谢谢
NDIS_STATUS NDIS_API Packet_Receive( IN NDIS_HANDLE NdisBindingContext, IN NDIS_HANDLE MacReceiveContext, IN PVOID HeaderBuffer, IN UINT HeaderBufferSize, IN PVOID LookAheadBuffer, IN UINT LookaheadBufferSize, IN UINT PacketSize ) { NDIS_STATUS status; // // 检查封包的合法性 // if(CheckRecv(HeaderBuffer,HeaderBufferSize, LookAheadBuffer, LookaheadBufferSize,PacketSize) != 0) return NDIS_STATUS_SUCCESS; // // 转发给系统函数 // status = m_pNdisReceive( NdisBindingContext, MacReceiveContext, HeaderBuffer, HeaderBufferSize, LookAheadBuffer, LookaheadBufferSize, PacketSize ); return status; } |
|
沙发#
发布于:2003-04-19 21:20
如果packetsize>lookaheadbuffersize,这时候要在receive函数里面调用ndistrasferdata来获得剩下的buffer,如果ndistrasferdata返回的不是pending,那就可以继续处理了,如果返回的是pending,那就到transferdatacomplete里面去处理。
|
|
|
板凳#
发布于:2003-04-19 21:25
详细的你可以看一下ddk里面关于protocolrceive函数的说明。
|
|
|
地板#
发布于:2003-04-21 12:11
感谢 mikeluo给我指导,我在本论坛上看了相关内容,也找到了ndistrasferdata的用法,很烦琐的,让我很头疼。我想尝试下面的方法,不知可行否?
用ReceivePacket代替Receive,也就是在ReceivePacket中处理数据(我的目的是更改端口后转发,其中要重新计算checksum,需要整个包的内容,我也听说过用增量法重新计算checksum,可以剩好多工作,但我不知到算法),因为ReceivePacket中有packet参数,我可以直接处理,请问这样行的通吗? 我在程序中按照上面的方法做了改动,但系统收到数据后并没有调用ReceivePacket,下面是NdisRegisterProtocol中的部分: if(ProtocolCharacteristics->MajorNdisVersion >= 3 && ProtocolCharacteristics->ReceiveHandler != NULL) { m_pNdisReceive = ProtocolCharacteristics->ReceiveHandler; ProtocolCharacteristics->ReceiveHandler = PT_Receive; } if(ProtocolCharacteristics->MajorNdisVersion >= 4 && ProtocolCharacteristics->ReceivePacketHandler != NULL) { m_pReceivePacket = ProtocolCharacteristics->ReceivePacketHandler; ProtocolCharacteristics->ReceivePacketHandler = PT_ReceivePacket; } 这样有错吗? |
|
地下室#
发布于:2003-04-21 17:22
刚才我在论坛上看了许多胡老大关于这方面的帖子,发现我要走的路还很长,我的目的是改端口,改了以后要计算checksum,要用到oob,而且我的机子走的是Receive,目标要求是跟系统无关,看来我还得找一台机子试试Receivepacket。现在我连Receive下都没解决,按照PASSTHRU的方法,加了ndistrasferdata,重启后就蓝平。(我是在xfilter下改的,还没入门呢),这是急啊
|
|
5楼#
发布于:2003-04-22 10:00
你注册了receivepacket函数,但是是否调用是由网卡来决定的,比如我的rtl的网卡调用的就是receive,而3com的网卡调用的就是receivepacket。你可以不注册receivepacket函数,这样就都走receive函数了。
|
|
|