阅读:1694回复:5
快救救我!!!
小弟是新手;最近需要协议个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_g... |
沙发#
发布于:2002-01-04 11:45
怎么没人救命阿!
|
|
板凳#
发布于:2002-01-04 11:46
太过分了。
|
|
地板#
发布于: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.以前本论坛讨论过,其实我也不会。咱们可以共同学习。 |
|
地下室#
发布于:2002-01-04 22:20
多谢mister兄的指教。
还有一点,如果仿照passthru那样,在ProtocolReceive中不调用NdisTransferData,而是像passthru那样,直接用NdisMXxxIndicateReceive来指示上层协议,那么上层的ProtocolReceive应该会调用NdisTransferData了;上层Protocol Driver在调用NdisTransferData时会不会拷贝14字节的MAC头呢 |
|
5楼#
发布于:2002-01-05 11:39
你在向上层调用函数NdisM...IndicateReceive时,不也传递了HeaderBuffer吗,若在你调用的函数NdisM...IndicateReceive中LookAheaderBufferSize < PacketSize,而上层有对你的传递的数据感兴趣的话,他就会调用NdisTransferData(当然,调用前它也会拷贝这14个字节),这样导致NDIS调用本层(你调用NdisM...IndicateRecieve所在层)的MiniportTranferData例程。
|
|