阅读:9495回复:32
对胡老大的代码的注释,大家进来指导一下吧
下面是我对huyg的代码的注释,因为功底很浅,漏洞百出,希望各位高人能够指点一下,看的不爽大家只管骂,但是不要再让我回去查ddk了,上面很多在ddk中说的很是模棱两可的,抑或是我的E文太差实在是看不懂
第一部分 void CopyPacket2Buffer(IN PNDIS_PACKET pPacket,IN OUT PUCHAR pBuff,IN OUT PUINT pLength) { PNDIS_BUFFER BuffDT;// buffer指示符, PUCHAR BuffVA;//Buffer的虚拟地址 UINT BuffLen;//Buffer的长度 *pLength=0;//数据包内容的总长度,开始先置零 BuffLen=0;//Buffer的长度,开始先置零 NdisQueryPacket(pPacket,NULL,NULL,&BuffDT,NULL);//查询Packet的信息,这里查的是Packet的Buffer指示符的链表第一个的 while(BuffDT!=(PNDIS_BUFFER)NULL)//如果Buffer指示符不为NULL,则读取其中的内容 { NdisQueryBuffer(BuffDT,&BuffVA,&BuffLen);//得到BuffDT指向的那个Buffer的虚拟地BuffVA,和长度BuffLen NdisMoveMemory(pBuff,BuffVA,BuffLen);//将BuffVA其中的内容,移动到pBuff指向的那块区域 pBuff=pBuff+BuffLen;//pBuff指针后移,前BuffLen个字节已经填入数据 *pLength+=BuffLen;//记录pBuff中填入数据的总长度 NdisGetNextBuffer(BuffDT,&BuffDT);//获得Buffer指示符链表中的下一个Buffer指示符 } return; } //数据传输完备,如果调用了TransferData(),就必须要调用TransferDataComplete,因为Ndis必须遵守谁申请谁释放的原则 VOID PtTransferDataComplete( IN NDIS_HANDLE ProtocolBindingContext, IN PNDIS_PACKET Packet, IN NDIS_STATUS Status, IN UINT BytesTransferred ) /*++ Routine Description: Same as the Send above, all sends need to be completed on the Primary's MiniportHandle Arguments: Return Value: --*/ { PADAPT pAdapt =(PADAPT)ProtocolBindingContext;//得到ProtocolBind的信息 PUCHAR pPacketContent;//数据包的内容就提取出来后就放在这里,我想是从Packet的Buffer中提取出来的把吧 PRSVD Rsvd;//暂时还不知道干什么的 UINT OffsetSize,Result,PacketLen;//偏移量,结果,包的长度(应该是指以太网帧的长度吧) PNDIS_BUFFER pPacketBuffer;//Buffer指示符,我想它应该指向的是Packet中的Buffer PNDIS_PACKET pBakPacket;//Packet指示符,这个是在Ndis中新创建的Packet,感觉上向上层传送的应该就是这个了而不是Packet PNDIS_BUFFER pBakBuffer;//Buffer指示符,备份用的,作用还是有点模糊 PUCHAR pBakContent;//以太网帧的内容应该是放在这里的,pPacketContent已经有了,这里为什么还是要加一个,暂时还不清楚, UINT BufferLen;//Buffer的长度,应该是实际内容的长度吧 DBGPRINT(("In PtTransferDataCompleten")); // // Returning the Send on the Primary, will point to itself if there is no LBFO // pAdapt = pAdapt->pPrimaryAdapt;//得到第一设备,那为什么还要第一句“PADAPT pAdapt =(PADAPT)ProtocolBindingContext”呢? Rsvd =(PRSVD)(Packet->MiniportReserved);//不懂 pBakPacket=(PNDIS_PACKET)(Rsvd->OriginalPkt);//不懂,好像是从微端口获取,Packet的指针,看了后面,回头再写一点把 //这个pBakPacket是不是就是那些还在微端口中的数据啊?? if(pAdapt->MiniportHandle)//是否有微端口绑定,没有话,那也就是不可能有数据上传了 { if(pBakPacket==NULL)//如果没有,那是什么一种情况,不清楚,感觉是数据已经上传的意思吧,通知miniport释放资源 NdisMTransferDataComplete(pAdapt->MiniportHandle,Packet,Status,BytesTransferred); else { Status=NdisAllocateMemory(&pPacketContent,BUFFER_SIZE,0,HighestAcceptableMax);//分配内存给pPacketContent, //BUFFER_SIZE的大小取决于MTU,比他大就行了,因为一个以太网帧不可能大于它的最大可传输单元(MTU)的,Huyg的值是2000 //上面有这样一句pBakPacket=(PNDIS_PACKET)(Rsvd->OriginalPkt),那么下面这句的意思就是把pBakPacket中的以太网帧的 //内容保存在pPacketContent中了,OffsetSize就是pPacketContent长度了 CopyPacket2Buffer(pBakPacket,pPacketContent,&OffsetSize); //同上,保存的是Packet的中的以太网帧的内容,放在pBakPacket的内容之后 CopyPacket2Buffer(Packet,pPacketContent+OffsetSize,&PacketLen); //Packet是pPacketContent的内容的长度 PacketLen+=OffsetSize; //从pBakPacket的Buffer链表中废除pBakBuffer NdisUnchainBufferAtFront(pBakPacket,&pBakBuffer); //安全的查询pBakBuffer(Buffer指示符)的情况,起始地址,内容长度,32是权限,等于哪个级别不清楚 //ddk上说运行NdisQueryBufferSafe在IRQL <= DISPATCH_LEVEL. 上,大概就是32了 NdisQueryBufferSafe(pBakBuffer,&pBakContent,&BufferLen,32); //释放pBakBuffer(释放的是指示符) NdisFreeBuffer(pBakBuffer); //释放pBakBuffer中所指向的缓冲区 NdisFreeMemory(pBakContent,BUFFER_SIZE,0); //这个地方很奇怪了,这个指针好像指向的是Packet->MiniportReserved->OriginalPkt的内容,既然在这里释放,那它到底是属于谁的 //imd的还是miniport的 NdisFreePacket(pBakPacket); //MiniportReserved的值置零,不指向任何地方 memset(Packet->MiniportReserved,0,sizeof(Packet->MiniportReserved)); //从Packet的Buffer链表中废除pPacketBuffer NdisUnchainBufferAtFront(Packet,&pPacketBuffer); //安全查询pPacketBuffer的虚拟地址,长度 NdisQueryBufferSafe(pPacketBuffer,&pBakContent,&BufferLen,32); //释放pPacketBuffer指向的Buffer指示符 NdisFreeBuffer(pPacketBuffer); //释放pPacketBuffer指向的Buffer指示符指向的那块缓冲区 NdisFreeMemory(pBakContent,BUFFER_SIZE,0); //请求分配Buffer指示符 NdisAllocateBuffer(&Status,&pPacketBuffer,pAdapt->RecvBufferPoolHandle,pPacketContent,PacketLen); //将它挂到Packet的Buffer指示符链表的最前端 NdisChainBufferAtFront(Packet,pPacketBuffer); //下面两句话不知道是什么意思,因为不知道Private是干什么的,ddk上有,看了也不明白 //猜测是在维护链表,哪个链表,不清楚了,作用也不清楚 Packet->Private.Head->Next=NULL; Packet->Private.Tail=NULL; //设置包头14个字节 NDIS_SET_PACKET_HEADER_SIZE(Packet,14); //调用和介质无关的Indicate函数通知上层协议, NdisMIndicateReceivePacket(pAdapt->MiniportHandle,&Packet,1); if(NDIS_GET_PACKET_STATUS(Packet)!=NDIS_STATUS_PENDING)//返回后如果是NDIS_STATUS_PENDING(悬挂)则调用函数释放 { MPReturnPacket((NDIS_HANDLE)pAdapt,Packet); } } return; } 待续.... [编辑 - 4/3/04 by darkread] [编辑 - 4/3/04 by darkread] |
|
沙发#
发布于:2008-07-19 16:18
引用第8楼asmsys于2004-04-06 18:12发表的 : 32呢,是这个: typedef enum _MM_PAGE_PRIORITY { LowPagePriority, NormalPagePriority = 16, HighPagePriority = 32 } MM_PAGE_PRIORITY; |
|
板凳#
发布于:2008-04-16 15:33
支持
|
|
地板#
发布于:2007-12-21 17:07
LZ 给个代码的连接吧,大家学习了一起讨论
|
|
地下室#
发布于:2007-08-15 15:48
why
|
|
5楼#
发布于:2007-08-15 15:38
为什么我拿这个PTRECEIVE,一加载就重启?还是没大看懂,最终的PACKET在哪里?
|
|
6楼#
发布于:2007-03-13 18:04
哪个好人给个HU老大的源码的附件好不好?。叩谢了
|
|
7楼#
发布于:2005-05-05 14:52
支持!
|
|
8楼#
发布于:2004-05-09 21:56
支持楼主,以后有好的经验接着贴啊
|
|
9楼#
发布于:2004-05-07 12:40
胡老大的代码贴全了吗?
|
|
10楼#
发布于:2004-05-06 02:24
在那里可以找到源代码呢?
有的可以贴一下吗? 谢谢各位大哥了~~ |
|
11楼#
发布于:2004-04-24 10:24
给个HU老大的源码的附件好不好?或者是把源码都防到一起,大家好去找。谢谢了
|
|
12楼#
发布于:2004-04-23 15:04
hehe ,这个贴还需要补充很多贴子阿
|
|
13楼#
发布于:2004-04-10 21:00
唉~~也该给点动力。有问题你就问啊,散分也就点几下的事。
|
|
14楼#
发布于:2004-04-10 08:48
支持,非常的支持,身边只有我一个人研究ndis真实辛苦呀,坚决的支持楼主
|
|
15楼#
发布于:2004-04-09 11:34
我不结帖的一个原因是我还在开发之中,我想把我在学习NDIS中碰到得我问题集合起来,为以后的初学者提供一个比较好的教材,因为我在学习之中碰到了许多问题,一个一个很分散,有时候找不到,心里非常着急,却又无能为力,很惨的
不知道大家同不同意我的想法,如果同意大家请多多帮忙,把经常碰到的问题和他的解决方案都放上来,好不好 |
|
16楼#
发布于:2004-04-09 09:28
9494
楼主写的不错!大家会给你分的! |
|
|
17楼#
发布于:2004-04-09 09:19
楼主该散分了。 :D
|
|
18楼#
发布于:2004-04-07 11:19
怎么XPDDK里面PassThru的ADAPT和2000DDK里面不一样呢?
|
|
19楼#
发布于:2004-04-07 09:38
讲的非常的好,我以前也摸索了好半天才搞懂
|
|
上一页
下一页