darkread
驱动牛犊
驱动牛犊
  • 注册日期2003-01-13
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
阅读:9286回复:32

对胡老大的代码的注释,大家进来指导一下吧

楼主#
更多 发布于:2004-04-03 16:02
下面是我对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]
shdaianita
驱动牛犊
驱动牛犊
  • 注册日期2008-07-18
  • 最后登录2009-07-14
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望25点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2008-07-19 16:18
引用第8楼asmsys于2004-04-06 18:12发表的  :
//安全的查询pBakBuffer(Buffer指示符)的情况,起始地址,内容长度,32是权限,等于哪个级别不清楚
=======================================================
32 别瞎说,看DDK:
Priority
Indicates the priority of the request as one of the following:
.......




32呢,是这个:

typedef enum _MM_PAGE_PRIORITY {
    LowPagePriority,
    NormalPagePriority = 16,
    HighPagePriority = 32
} MM_PAGE_PRIORITY;
ownerscu
驱动牛犊
驱动牛犊
  • 注册日期2007-09-03
  • 最后登录2015-08-13
  • 粉丝1
  • 关注0
  • 积分4分
  • 威望27点
  • 贡献值0点
  • 好评度13点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2008-04-16 15:33
支持
funing0321
驱动牛犊
驱动牛犊
  • 注册日期2007-12-17
  • 最后登录2008-01-23
  • 粉丝0
  • 关注0
  • 积分40分
  • 威望5点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
地板#
发布于:2007-12-21 17:07
LZ 给个代码的连接吧,大家学习了一起讨论
zhanSL
驱动小牛
驱动小牛
  • 注册日期2002-09-29
  • 最后登录2010-07-13
  • 粉丝0
  • 关注0
  • 积分25分
  • 威望273点
  • 贡献值0点
  • 好评度106点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2007-08-15 15:48
why
xiaoks46
驱动牛犊
驱动牛犊
  • 注册日期2007-05-18
  • 最后登录2011-06-22
  • 粉丝0
  • 关注0
  • 积分501分
  • 威望170点
  • 贡献值0点
  • 好评度49点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2007-08-15 15:38
为什么我拿这个PTRECEIVE,一加载就重启?还是没大看懂,最终的PACKET在哪里?
henduojbm
驱动牛犊
驱动牛犊
  • 注册日期2005-04-30
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分90分
  • 威望9点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2007-03-13 18:04
哪个好人给个HU老大的源码的附件好不好?。叩谢了
qiyidi
驱动牛犊
驱动牛犊
  • 注册日期2005-03-22
  • 最后登录2011-08-19
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望15点
  • 贡献值0点
  • 好评度15点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2005-05-05 14:52
支持!
shonshondr
驱动牛犊
驱动牛犊
  • 注册日期2004-05-09
  • 最后登录2004-06-03
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2004-05-09 21:56
支持楼主,以后有好的经验接着贴啊
xudq_x
驱动牛犊
驱动牛犊
  • 注册日期2004-03-12
  • 最后登录2004-05-20
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2004-05-07 12:40
胡老大的代码贴全了吗?
chansiio
驱动牛犊
驱动牛犊
  • 注册日期2004-03-02
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2004-05-06 02:24
在那里可以找到源代码呢?

有的可以贴一下吗?

谢谢各位大哥了~~
liusz
驱动牛犊
驱动牛犊
  • 注册日期2004-03-16
  • 最后登录2018-05-26
  • 粉丝0
  • 关注0
  • 积分29分
  • 威望43点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2004-04-24 10:24
给个HU老大的源码的附件好不好?或者是把源码都防到一起,大家好去找。谢谢了
kangzh
驱动小牛
驱动小牛
  • 注册日期2004-03-09
  • 最后登录2012-08-06
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望22点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2004-04-23 15:04
hehe ,这个贴还需要补充很多贴子阿
youngyt
驱动牛犊
驱动牛犊
  • 注册日期2003-11-23
  • 最后登录2006-12-29
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2004-04-10 21:00
唉~~也该给点动力。有问题你就问啊,散分也就点几下的事。
dlmufox
驱动牛犊
驱动牛犊
  • 注册日期2003-10-05
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2004-04-10 08:48
支持,非常的支持,身边只有我一个人研究ndis真实辛苦呀,坚决的支持楼主
darkread
驱动牛犊
驱动牛犊
  • 注册日期2003-01-13
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2004-04-09 11:34
我不结帖的一个原因是我还在开发之中,我想把我在学习NDIS中碰到得我问题集合起来,为以后的初学者提供一个比较好的教材,因为我在学习之中碰到了许多问题,一个一个很分散,有时候找不到,心里非常着急,却又无能为力,很惨的
不知道大家同不同意我的想法,如果同意大家请多多帮忙,把经常碰到的问题和他的解决方案都放上来,好不好
wywwwl
驱动大牛
驱动大牛
  • 注册日期2002-08-16
  • 最后登录2018-04-07
  • 粉丝1
  • 关注0
  • 积分-10分
  • 威望135点
  • 贡献值6点
  • 好评度76点
  • 原创分0分
  • 专家分0分
  • 社区居民
16楼#
发布于:2004-04-09 09:28
9494
楼主写的不错!大家会给你分的!
琢磨悟真知
youngyt
驱动牛犊
驱动牛犊
  • 注册日期2003-11-23
  • 最后登录2006-12-29
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2004-04-09 09:19
楼主该散分了。 :D
coohaze
驱动牛犊
驱动牛犊
  • 注册日期2003-02-21
  • 最后登录2008-12-16
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2004-04-07 11:19
怎么XPDDK里面PassThru的ADAPT和2000DDK里面不一样呢?
dlmufox
驱动牛犊
驱动牛犊
  • 注册日期2003-10-05
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2004-04-07 09:38
讲的非常的好,我以前也摸索了好半天才搞懂
上一页
游客

返回顶部