databoy789
驱动牛犊
驱动牛犊
  • 注册日期2003-04-19
  • 最后登录2003-05-06
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1037回复:5

请教:一个低级的问题(我是新手)

楼主#
更多 发布于:2003-04-19 17:29
我用下面的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;
}

mikeluo
驱动老牛
驱动老牛
  • 注册日期2001-09-04
  • 最后登录2007-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-04-19 21:20
如果packetsize>lookaheadbuffersize,这时候要在receive函数里面调用ndistrasferdata来获得剩下的buffer,如果ndistrasferdata返回的不是pending,那就可以继续处理了,如果返回的是pending,那就到transferdatacomplete里面去处理。
学而不思则罔,思而不学则殆 学而思之,思而学之,岂非圣人乎?
mikeluo
驱动老牛
驱动老牛
  • 注册日期2001-09-04
  • 最后登录2007-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-04-19 21:25
详细的你可以看一下ddk里面关于protocolrceive函数的说明。
学而不思则罔,思而不学则殆 学而思之,思而学之,岂非圣人乎?
databoy789
驱动牛犊
驱动牛犊
  • 注册日期2003-04-19
  • 最后登录2003-05-06
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于: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;
}
这样有错吗?
databoy789
驱动牛犊
驱动牛犊
  • 注册日期2003-04-19
  • 最后登录2003-05-06
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-04-21 17:22
刚才我在论坛上看了许多胡老大关于这方面的帖子,发现我要走的路还很长,我的目的是改端口,改了以后要计算checksum,要用到oob,而且我的机子走的是Receive,目标要求是跟系统无关,看来我还得找一台机子试试Receivepacket。现在我连Receive下都没解决,按照PASSTHRU的方法,加了ndistrasferdata,重启后就蓝平。(我是在xfilter下改的,还没入门呢),这是急啊
mikeluo
驱动老牛
驱动老牛
  • 注册日期2001-09-04
  • 最后登录2007-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-04-22 10:00
你注册了receivepacket函数,但是是否调用是由网卡来决定的,比如我的rtl的网卡调用的就是receive,而3com的网卡调用的就是receivepacket。你可以不注册receivepacket函数,这样就都走receive函数了。
学而不思则罔,思而不学则殆 学而思之,思而学之,岂非圣人乎?
游客

返回顶部