hujing1230
驱动牛犊
驱动牛犊
  • 注册日期2005-04-11
  • 最后登录2005-08-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2496回复:8

以太帧和包是什么关系啊,在ptrecieve中接收的是以太帧吗,那NdisMIndicateReceivePacket发出去的是包吗

楼主#
更多 发布于:2005-06-01 14:46
以太帧和包是什么关系啊,在ptrecieve中接收的是以太帧吗,那NdisMIndicateReceivePacket发出去的是包吗
zhaock
驱动太牛
驱动太牛
  • 注册日期2002-01-26
  • 最后登录2018-06-02
  • 粉丝3
  • 关注2
  • 积分73328分
  • 威望362317点
  • 贡献值1点
  • 好评度226点
  • 原创分0分
  • 专家分0分
  • 社区居民
沙发#
发布于:2005-06-01 15:17
仅针对以太网
以太帧指的是以太网上传输的数据,除了协议看到的数据包外,前头有前导码等,后面还有校验码。
对于ptrecieve中接收和NdisMIndicateReceivePacket发出去来讲,看到的都是以太网的数据包,不能叫以太帧
hujing1230
驱动牛犊
驱动牛犊
  • 注册日期2005-04-11
  • 最后登录2005-08-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2005-06-01 15:54
if(FALSE){}
else if(PacketSize <= LookAheadBufferSize)  // &Egrave;&ccedil;&sup1;&ucirc; LookAheadBuffer &Ouml;&ETH;°ü&ordm;&not;&Aacute;&Euml;&Egrave;&laquo;&sup2;&iquest;&Ecirc;&yacute;&frac34;&Yacute;
{
// ?&Ouml;&Aring;&auml;&Auml;&Uacute;&acute;&aelig;
Status = NdisAllocateMemory(&pPacketContent, BUFFER_SIZE, 0, HighestAcceptableMax);
if(Status != NDIS_STATUS_SUCCESS)
{
DbgPrint(\"PTReceive:NdisAllocateMemory Failed\\n\");
return(NDIS_STATUS_NOT_ACCEPTED);
}
if(pPacketContent == NULL)
{
DbgPrint(\"PTReceive:pPacketContent==NULL\\n\");
return(NDIS_STATUS_NOT_ACCEPTED);
}
// &frac12;&laquo;°ü&Iacute;?&ordm;&Iacute; LookAheadBuffer &cedil;&acute;&Ouml;&AElig;&micro;&frac12;&ETH;&Acirc;?&Ouml;&Aring;&auml;&micro;&Auml;&Auml;&Uacute;&acute;&aelig;&Ouml;&ETH;
NdisZeroMemory(pPacketContent, BUFFER_SIZE);
NdisMoveMemory(pPacketContent, HeaderBuffer, HeaderBufferSize);
NdisMoveMemory(pPacketContent+ HeaderBufferSize, LookAheadBuffer, LookAheadBufferSize);
PacketLen = PacketSize+HeaderBufferSize;

//&sup1;&yacute;&Acirc;&Euml;ICMP
     if(((char *)pPacketContent)[12] == 8 &&
((char *)pPacketContent)[13] == 0 &&
((char *)pPacketContent)[23] == 1)
{
DbgPrint(\"ICMP±&raquo;&Agrave;&sup1;&frac12;&Oslash;!\\n\");
NdisFreeMemory(pPacketContent, 2000, 0);
return NDIS_STATUS_NOT_ACCEPTED;
}
break;

// &Ocirc;&Uacute;°ü&sup3;&Oslash;&Ouml;&ETH;?&Ouml;&Aring;&auml;°ü&Atilde;è&Ecirc;&ouml;?&ucirc;
NdisDprAllocatePacket(&Status, &MyPacket, pAdapt->RecvPacketPoolHandle);

if(Status == NDIS_STATUS_SUCCESS)
{
// &Ocirc;&Uacute;&raquo;&ordm;&sup3;&aring;&sup3;&Oslash;&Ouml;&ETH;?&Ouml;&Aring;&auml;&raquo;&ordm;&sup3;&aring;&Atilde;è&Ecirc;&ouml;?&ucirc;&pound;&not;&frac12;&laquo;°ü&Atilde;è&Ecirc;&ouml;?&ucirc;&Oacute;&euml;&raquo;&ordm;&sup3;&aring;&Atilde;è&Ecirc;&ouml;?&ucirc;&sup1;&Oslash;&Aacute;&ordf;&iexcl;&pound;
NdisAllocateBuffer(&Status, &pPacketBuffer, pAdapt->RecvPacketPoolHandle, pPacketContent, PacketLen);
NdisChainBufferAtFront(MyPacket, pPacketBuffer);

MyPacket->Private.Head->Next = NULL;
MyPacket->Private.Tail = NULL;
Rsvd=(PRSVD)(MyPacket->MiniportReserved);
Rsvd->OriginalPkt = NULL;
NDIS_SET_PACKET_HEADER_SIZE(MyPacket, HeaderBufferSize);
NDIS_SET_PACKET_STATUS(MyPacket, NDIS_STATUS_RESOURCES);

// &Iuml;ò&Eacute;&Iuml;&sup2;&atilde;&ETH;&shy;&Ograve;é&Ccedil;&yacute;&para;&macr;&Ouml;&cedil;&Ecirc;&frac34;&Ecirc;&yacute;&frac34;&Yacute;°ü&pound;&not;?&Agrave;&Otilde;&aelig;&Iacute;&oslash;&iquest;¨&ETH;&ETH;&Icirc;&ordf;&iexcl;&pound;
NdisMIndicateReceivePacket(pAdapt->MiniportHandle, &MyPacket, 1);

if(NDIS_GET_PACKET_STATUS(MyPacket) != NDIS_STATUS_PENDING)
{
DBGPRINT((\"In PtReceive And Free Memory\\n\"));
NdisFreeBuffer(pPacketBuffer);
NdisFreeMemory(pPacketContent, BUFFER_SIZE, 0);
NdisDprFreePacket(MyPacket);
}
}
break;
}
hujing1230
驱动牛犊
驱动牛犊
  • 注册日期2005-04-11
  • 最后登录2005-08-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2005-06-01 17:27
为什么pPacketContent中已经有数据了,
还要弄个MyPacket的东东啊?
zhaock
驱动太牛
驱动太牛
  • 注册日期2002-01-26
  • 最后登录2018-06-02
  • 粉丝3
  • 关注2
  • 积分73328分
  • 威望362317点
  • 贡献值1点
  • 好评度226点
  • 原创分0分
  • 专家分0分
  • 社区居民
地下室#
发布于:2005-06-01 19:27
因为调用了NdisMIndicateReceivePacket,所以就需要构造一个Packet结构出来。这个程序效率不高,实际上完全可以避免内存拷贝。
你可以看ddk中的Passthru的例子的实现,就可以不需要构建新的Packet,也不需要内存拷贝。
hujing1230
驱动牛犊
驱动牛犊
  • 注册日期2005-04-11
  • 最后登录2005-08-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2005-06-02 17:03
我用DDK中的方法,收到的包都是NULL,所以不能用这种啊!
判断出ICMP包后的这段程序不是很理解,希望能帮我解释一下,
假如我不写这段程序,这个包是不是就默认的被传上去了呀?
zhaock
驱动太牛
驱动太牛
  • 注册日期2002-01-26
  • 最后登录2018-06-02
  • 粉丝3
  • 关注2
  • 积分73328分
  • 威望362317点
  • 贡献值1点
  • 好评度226点
  • 原创分0分
  • 专家分0分
  • 社区居民
6楼#
发布于:2005-06-02 22:02
我用DDK中的方法,收到的包都是NULL,所以不能用这种啊!
判断出ICMP包后的这段程序不是很理解,希望能帮我解释一下,
假如我不写这段程序,这个包是不是就默认的被传上去了呀?
 

1。你可能是看的是PtReceive,去获得Packet,为空吧?但直接看LookAside的数据就行了。
2。判断出ICMP包后的这段程序的就是自己如何组一个Packet,通知
上层协议,需要你理解先NDIS_PACKET,NDIS_BUFFER的结构和关系,
再看这段代码就没有任何问题了
如果你采用的是ddk的imd驱动的代码,它的处理就都是往上传
hujing1230
驱动牛犊
驱动牛犊
  • 注册日期2005-04-11
  • 最后登录2005-08-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2005-06-03 09:37
我的意思是不重新构造PACKET,也不调用NdisMIndicateReceivePacket,
判断完ICMP包后的程序都不写
这样的话,收到的包还会被传上去吗
因为我发现,这个驱动装上以后,我就上不了网了,
我是在PASSTHRU基础上做的,应该是IMD吧
如果您方便的话,希望您能给我个QQ什么的,
zhaock
驱动太牛
驱动太牛
  • 注册日期2002-01-26
  • 最后登录2018-06-02
  • 粉丝3
  • 关注2
  • 积分73328分
  • 威望362317点
  • 贡献值1点
  • 好评度226点
  • 原创分0分
  • 专家分0分
  • 社区居民
8楼#
发布于:2005-06-03 10:57
我的意思是不重新构造PACKET,也不调用NdisMIndicateReceivePacket,
判断完ICMP包后的程序都不写
这样的话,收到的包还会被传上去吗
因为我发现,这个驱动装上以后,我就上不了网了,
我是在PASSTHRU基础上做的,应该是IMD吧
如果您方便的话,希望您能给我个QQ什么的,

如果你不构造Packet,也不调用NdisMIndicateReceivePacket。而且也不走Passthru的已有的处理NdisMEthIndicateReceive当然就不会被传上去了。
你把qq发到我的邮箱里吧。我也比较忙,人多了,也招呼不过来。呵呵
游客

返回顶部