falwind
驱动牛犊
驱动牛犊
  • 注册日期2001-12-21
  • 最后登录2006-12-04
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1638回复:5

快救救我!!!

楼主#
更多 发布于:2001-12-28 18:34
小弟是新手;最近需要协议个IM Driver。看了一下passthru的代码,好多地方不明白。请各位大虾帮帮忙。

1.在绑定到下层NIC Driver的ProtocolBindAdapter中,有以下代码:
NDIS_STRING DeviceStr = NDIS_STRING_CONST(\"UpperBindings\");
NDIS_STRING BundleStr = NDIS_STRING_CONST(\"BundleId\");
PNDIS_CONFIGURATION_PARAMETER Param;
PNDIS_CONFIGURATION_PARAMETER BundleParam;
NDIS_STATUS BundleStatus;
……
//从注册表中读取配置
NdisReadConfiguration(Status,
                      &Param,
                      ConfigHandle,
                      &DeviceStr,
                      NdisParameterString);
……
NdisReadConfiguration(&BundleStatus,
                      &BundleParam,
                      ConfigHandle,
                      &BundleStr,
                      NdisParameterString);
请问从注册表中得“UpperBindings”里面读出来的是什么信息啊?是谁往注册表里写了这些信息,什么时候写进去的?这些信息读出来怎么使用啊?
另外,我对于整个驱动程序在一些细节上还不是很明了,那个标识绑定的BundleId在后面什么地方使用了呢?

2.关于packet的问题
(1)在ProtocolReceive中
DDK文档里说,LookaheadBufferSize的含义是“full network packet”,既然是“full”那么应该是包括14字节的以太帧头在内了;
DDK文档里明确说,PacketSize不包括帧头的长度;
DDK文档里又说,当LookaheadBufferSize == PacketSize时,下层Indicate上来的是整个包。这岂不与前面两种说法矛盾?
(2)在ProtocolTransferDataComplete中
这其中有一个PNDIS_PACKET参数,其他很多地方也有NDIS_PACKET结构的参数。NDIS_PACKET里面到底有没有14字节的以太帧头呢?浏览以前的贴子时好像有大虾说在ProtocolTransferDataComplete中PNDIS_PACKET指向的帧不包括那个帧头。到底包不包括呢?通过NdisQueryPacket查询出来的TotalPacketLength又包不包括14字节的以太帧头呢?
另外,在TransferDataComplete中,可不可以用下面的方法来获取以太帧呢:
……
PNDIS_BUFFER FirstBuffer = NULL;
PNDIS_BUFFER NextBuffer = NULL;
PUCHAR MyBuffer = NULL;
PUCHAR Temp = NULL;
PUCHAR VirtualAddr = NULL;
UINT TotalPacketLength;
UINT BufferLen;
NdisQueryPacket(Packet,
                NULL,
                NULL,
                &FirstBuffer,
                &TotalPacketLength);
MyBuffer = ExAllocatePool(NonPagedPool,
                          TotalPacketLength);
//这里我假定的是TotalPacketLength里面
//包含了14字节的帧头,不知正确否?
if(MyBuffer != NULL)
{
    Temp = MyBuffer;
    while(FirstBuffer != NULL)
    {
        NdisQueryBuffer(FirstBuffer,
                        &VritualAddr,
                        &BufferLen);
        RtlCopyMemory(Temp,
                      VirtualAddr,
                      BufferLen);
        Temp += BufferLen;
 
        NdisGetNextBuffer(FirstBuffer,&NextBuffer);
        FirstBuffer = NextBuffer;
    }
    //其他处理
}
……
(3)当上层Protocol Driver调用IM Driver发送包时
在MiniportSend中,Packet参数的含义是以太帧呢还是其他的分组格式(比如IP)?如果是以太帧,帧头是由上层的Protocol Driver填好了呢还是需要由下层的NIC Driver去填写?

3.在IM Driver中,怎么把网卡设置成混杂模式呢(能不能给出代码)?

请大虾们详细解惑,小弟在此谢过了。

最新喜欢:

luke_gemluke_g...
falwind
驱动牛犊
驱动牛犊
  • 注册日期2001-12-21
  • 最后登录2006-12-04
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-01-04 11:45
怎么没人救命阿!
falwind
驱动牛犊
驱动牛犊
  • 注册日期2001-12-21
  • 最后登录2006-12-04
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-01-04 11:46
太过分了。
mister
驱动牛犊
驱动牛犊
  • 注册日期2001-11-25
  • 最后登录2013-02-26
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望26点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-01-04 13:31
我只拣我会的回答:
2(1):所谓的fullPacket是不包括HeaderBuffer的,所以我们理解的“full packet”的大小应该是HeaderBufferSize + PacketSize。
2(2):在例程ProtocolTransferComplete中的Packet,其实是你在(可能在)ProtocolRecive中调用NdisTransferData时提供的那个Packet,所以在例程ProtocolTransferComplete中的Packet究竟包不包括MAC头部的14字节,就要看你在ProtocolReceive中是否先COPY了这14个字节。当然有一点你需要明白,这些数据都是放在连接在PACKET的缓冲区上的。
在调用NdisQueryPacket是若你当时是拷贝了这14个字节,那么它就会在TotalLength反映出来,就是会包括这14个字节。

需要注意的是:例程MiniportTransferData中COPY剩下的数据时,它总是将数据放在你所提供的PACKET的第一个BUFFER上,所以若你在ProtocolReceive中已经将这14个字节拷贝好,但是假如你连接其他的Buffer时使用了NdisChainBufferAtBack,那么你就可能将原来拷贝好的14个字节给冲掉。

3.根据本论坛huyg版主的话(它以前有帖子说过,当然也是正确的),是包括MAC头部的,协议层已经填好了。

4.以前本论坛讨论过,其实我也不会。咱们可以共同学习。
falwind
驱动牛犊
驱动牛犊
  • 注册日期2001-12-21
  • 最后登录2006-12-04
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-01-04 22:20
多谢mister兄的指教。
还有一点,如果仿照passthru那样,在ProtocolReceive中不调用NdisTransferData,而是像passthru那样,直接用NdisMXxxIndicateReceive来指示上层协议,那么上层的ProtocolReceive应该会调用NdisTransferData了;上层Protocol Driver在调用NdisTransferData时会不会拷贝14字节的MAC头呢
mister
驱动牛犊
驱动牛犊
  • 注册日期2001-11-25
  • 最后登录2013-02-26
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望26点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-01-05 11:39
你在向上层调用函数NdisM...IndicateReceive时,不也传递了HeaderBuffer吗,若在你调用的函数NdisM...IndicateReceive中LookAheaderBufferSize < PacketSize,而上层有对你的传递的数据感兴趣的话,他就会调用NdisTransferData(当然,调用前它也会拷贝这14个字节),这样导致NDIS调用本层(你调用NdisM...IndicateRecieve所在层)的MiniportTranferData例程。
游客

返回顶部