阅读:2809回复:19
passthru 加密数据包的发送问题,请sirroom给指导一下
在passthru的mpsend中,具体在作的就是改变ping 送下来的数据,在mpsend里做。按照win2000 ddk protocol driver 2.2,2.5 里的介绍作的。谁知道做到最后了数据送不出去了。
1。调试过程中有蓝屏,可能是我哪里访问了错误地址,所以我把主要的函数贴出来了,有点俗,没办法。 2。从新生成的mypacket总是不能正确的送出去,buffer的连接好像总是不对。 VirtualMem=ExAllocatePool(.. ,2000); //defined memory (代替NdisAllocateMemoryWithTag,不知对不对) NdisAllocateBuffer(&Status, &SendBuffer, ...., VirtualMem, ..); 然后是找数据: NdisQueryPacket(Packet, NULL, NULL, NULL, &SendPktLen); 把他们拷到缓存里: CopiedLengh=CopyPacketToMyBuffer(VirtualMem, Packet, 0, SendPktLen ); 然后定义了一个mdl到buffer里去dbgprint了一下,copy得还对。 接下来是自己的mypacket: NdisAllocatePacket(&Status, &MyPacket, pAdapt->SendPacketPoolHandle); 把它和buffer连起来: NdisChainBufferAtBack( MyPacket, SendBuffer ); # NdisQueryPacket(MyPacket, NULL, NULL, # &MyPacketFirstBuffer, # &SendPktLen); 把mypacket的MyPacketFirstBuffer取出来 Rsvd = (PRSVD)(MyPacket->ProtocolReserved); Rsvd->OriginalPkt = Packet; MyPacket->Private.Flags = Flags; 保存ProtocolReserved和flags 一步一步调到这里,都还没错的感觉,但下边这些代码我就不觉的有什么地方对的了,不知道为什么我定义的buffer就是连不上来。 # MyPacket->Private.Head = MyPacketFirstBuffer; 这句我是想再确认一下mypacket确实连到了MyPacketFirstBuffer。但地下的tail我就不知道应该添什么了 //MyPacket->Private.Tail = (MyPacketFirstBuffer+CurSendPktLen); 取packet的标志copy过来: NdisSetPacketFlags(MyPacket, NdisGetPacketFlags(Packet)); //NDIS_FLAGS_DONT_LOOPBACK); 把oob也copy 过来,纯粹是抄例子。但好像是必须的。 NdisMoveMemory(NDIS_OOB_DATA_FROM_PACKET(MyPacket), NDIS_OOB_DATA_FROM_PACKET(Packet), sizeof(NDIS_PACKET_OOB_DATA)); 把packet info 从packet里 copy过来 *NDIS_PACKET_EXTENSION_FROM_PACKET(MyPacket) = *NDIS_PACKET_EXTENSION_FROM_PACKET(Packet); 把MEDIA_SPECIFIC_INFO 从packet里 copy过来,纯粹是抄例子。但好像是必须的。 NDIS_GET_PACKET_MEDIA_SPECIFIC_INFO(Packet, &MediaSpecificInfo, &MediaSpecificInfoSize); NDIS_SET_PACKET_MEDIA_SPECIFIC_INFO(MyPacket, MediaSpecificInfo, MediaSpecificInfoSize); 然后把包发出去 NdisSend(&Status, pAdapt->BindingHandle, MyPacket); 用SOFTICE跟 能执行两次MPSEND,到第三次的时候,就访问非法内存去了。 那两次包也没发出去,不知道跑哪去了。 我要是不加有#的几行就不访问非法内存了,整个工作的挺好的样子,就是报出不去,ping, time out. 其他的地方都和passthru没作本质性的变化,是哪里有问题呢?mpsend之外的其他部分在这个过程中不需要作改动吧? [编辑 - 5/9/02 作者: moqingsong] |
|
|
沙发#
发布于:2002-05-09 10:00
在passthru的mpsend中,具体在作的就是改变ping 送下来的数据,在mpsend里做。按照win2000 ddk protocol driver 2.2,2.5 里的介绍作的。谁知道做到最后了数据送不出去了。 我只能说说我的理解,有可能是错的,hehe,这类的问题偶觉得要胡版主可以给出正解:) 先说说 MyPacket->Private.Head = Packet->Private.Head; MyPacket->Private.Tail = Packet->Private.Tail; 我认为passthru就是用的这个来拷贝数据的。 而在你的程序中,你自已已经把数据copy出来后,在你用NdisChainBufferAtBack时你的Head与Tail与你的buff 发生了关系,细节你可以看在ndis.h中细看NdisChainBufferAtBack,然后你就会明白了 |
|
|
板凳#
发布于:2002-05-09 10:05
我只是大至的读了一个,不仔细,但出现内存error,基本都是内存的release问题,我看到你的程序里有allocatepacket,这样释放这个packet descriptor就是个问题,通常是packet struct里面有保留项,可以保存一些自己的特别值,你可以你的allocate的packet做个标记,然后在sendcomplete里释放掉,加密的时候通常都会有这个问题!
还有就是加密后的数据包的checksum问题,这种checksum有些是系统做,有些的网卡做,最好的方法是拦截oid,如果不能拦到就自己做checksum. |
|
地板#
发布于:2002-05-09 10:15
整理一下我的加密思路:
1。只在mpsend里作改动就可以把加密数据送下去,(不知对不对?)分配一块memory,再分配一块buffer。把上层传下来的packet copy 到这里进行加密处理。 2。然后把分配好的mypacket和buffer里加密好的数据 chain起来。 3。设置mypacket包中的数据,我现在知道需要作的有: a.把private->head指向chain中的第一片buffer. b.把private->tail指向chain中的最后一片buffer. c.填写oob数据区,(直接从packet里copy) d.填写packt info数据区,(直接从packet里copy,我没重作checksum) e.填写media info数据区,(直接从packet里copy) 我好像是这部分那里有问题数据发不出去。 4.发送 看了本站和白云站的一些贴子,好像大家都没在发送的部分遇到过什么大问题,是我什么地方犯了异常简单的错误啦吗? 胡版主在这方面也有异常丰富的经验,百忙之中也请给指导一下。谢了。 |
|
|
地下室#
发布于:2002-05-09 10:22
胖胖最近怎么这么积极啊??是不是志宁给你开小灶没咱们的份啊??
|
|
|
5楼#
发布于:2002-05-09 10:30
VirtualMem=ExAllocatePool(.. ,2000); //defined memory
(代替NdisAllocateMemoryWithTag,不知对不对) NdisAllocateBuffer(&Status, &SendBuffer, 看看这段!我觉得还是有TAG的好,起码出错的时候知道是哪块内存~~ # MyPacket->Private.Head = MyPacketFirstBuffer; 这句我是想再确认一下mypacket确实连到了MyPacketFirstBuffer。但地下的tail我就不知道应该添什么了 //MyPacket->Private.Tail = (MyPacketFirstBuffer+CurSendPktLen); 这些复制PACKET数据的地方还是得用那个NDIS的PACKET2PACKET的函数!OOB的用OOB的宏,总之NDIS提供了的函数你为什么不用非要自己来复制??搞不懂~~最后你说SEND的部分我没完全明白你说什么,但是我感觉你是不是把一个已经释放了的资源给传到NDISSEND里想SEND出去,这个时候当然会出现错误啦!要是你的pool用的是有TAG的那不就清楚是哪块内存的问题了??当然也就知道从什么地方开始找咯! |
|
|
6楼#
发布于:2002-05-09 12:43
整理一下我的加密思路: 我认为你第三步中的a,b并不是必要的。 你如果对数据作了处理,就最好重新计算一下Check Sum; 你用Wiindows带的网络监视器或其它的sniffer查看一下IP Packet,查看一下是否正确,是否已经发送? |
|
7楼#
发布于:2002-05-09 18:18
志宁开什么小灶哦,偶很有意见的哦。偶觉得应该把在线升级的权力分给大家哈。
我觉得大家先还是看一下ndis.h中关于NdisChainBufferAtBack吧 #define NdisChainBufferAtBack(Packet, Buffer) \\ { \\ PNDIS_BUFFER TmpBuffer = (Buffer); \\ \\ for (;;) \\ { \\ if (TmpBuffer->Next == NULL) \\ break; \\ TmpBuffer = TmpBuffer->Next; \\ } \\ if ((Packet)->Private.Head != NULL) \\ { \\ (Packet)->Private.Tail->Next = (Buffer); \\ } \\ else \\ { \\ (Packet)->Private.Head = (Buffer); \\ } \\ (Packet)->Private.Tail = TmpBuffer; \\ TmpBuffer->Next = NULL; \\ (Packet)->Private.ValidCounts = FALSE; \\ } 在你 2。然后把分配好的mypacket和buffer里加密好的数据 chain起来。 的时候,你应该看到你的head,tail已经指向了谁。 接下来,在后面的操作中,你又 a.把private->head指向chain中的第一片buffer. b.把private->tail指向chain中的最后一片buffer. 你觉得会发生什么情况? head,tail指对了,当然只当这两句什么也没说,如果指的不对,hehe.......你还不如让这两个指针随便指个地方看看 版主曾经说过对passthru中去直接操作private很不理解,看来这个真的是害人不浅。 |
|
|
8楼#
发布于:2002-05-09 19:40
今天调了两下,把NdisChainBufferAtBack 调前,把private->head删除,昨天睡得有点晚,正debug的时候,windows就彻底瘫痪了,删driver都起不来了(我装了双启动)。告我winnt\\system32\\config\\system文件坏了。我可怜的开发机呀。。。。。。
重装吧。谁让我犯困来着。哎。。。。。。 |
|
|
9楼#
发布于:2002-05-09 19:44
在机子死亡之前我记得还看了一下内存,确实有严重错误,困得有点胡涂了就又按了一下F10。
|
|
|
10楼#
发布于:2002-05-09 19:52
安全模式都进不去么?
|
|
11楼#
发布于:2002-05-09 22:03
进了安全模式才知道的,winnt\\system32\\config\\system文件坏了
|
|
|
12楼#
发布于:2002-05-09 22:53
做驱动怎么都不做一个ghost??
|
|
|
13楼#
发布于:2002-05-09 22:56
这是个啥东东?
|
|
|
14楼#
发布于:2002-05-10 00:07
在passthru的mpsend中,具体在作的就是改变ping 送下来的数据,在mpsend里做。按照win2000 ddk protocol driver 2.2,2.5 里的介绍作的。谁知道做到最后了数据送不出去了。 今天看了看Private的结构,觉得######的地方有问题。 Private的定义如下: typedef struct _NDIS_PACKET_PRIVATE { UINT PhysicalCount; //Number of physical in packet UINT TotalLength; //Total amount of data in the packet PNDIS_BUFFER Head;//fist buffer in the chain PNDIS_BUFFER Tail;//last buffer in the chain ............ } 看了这个结构,我想大家应该知道错在何处了 |
|
15楼#
发布于:2002-05-10 09:01
找到了,原来是个backup硬盘的东西.谢谢。
|
|
|
16楼#
发布于:2002-05-10 23:35
恢复系统比你进安全模式还快,爽吧
|
|
|
17楼#
发布于:2002-05-11 11:23
可惜要知道错误就得在错误代码里走一遍
|
|
|
18楼#
发布于:2002-05-11 12:34
正在走。。。。
|
|
|
19楼#
发布于:2002-05-14 20:17
1。我试着使用NDIS的PACKET2PACKET复制数据,不再死机了。有时能发出去一队垃圾(不是我要发的东西),但同样的代码,换一台机子又发不出去了。不明白。 2。你从哪里感觉到我“把一个已经释放了的资源给传到NDISSEND里想SEND出去”的我也有这种感觉,但不知在哪里犯了错误。需要的话,把源码mail给你? 这感觉今天早晨被验证了一下:在可以发出packet的时候,在复制了数据之后packet packet,packet mypacket都可以看到数据报,而发不出去的时候packet是空的,我不知道这是不是意味着他已经被释放了? 3.我对NDIS_PACKET,NDIS_BUFFER,VirtualAddress,这几个结构之间的关系搞不清楚,话比较长,另起了一个贴子。主要是在debug中的问题。 [编辑 - 5/15/02 by moqingsong] |
|
|