Ay's Blog@CNSSUESTC

个人总结NDIS中NDIS_PACKET,NDIS_BUFFER的关系

 1 //   
 2 // NDIS_PACKET结构的定义  
 3 //   
 4 typedef struct _NDIS_PACKET  
 5 {  
 6 NDIS_PACKET_PRIVATE Private;  
 7 //这个其实是一个链表结构,Private.Head指向第一个链表,Private.Tail指向最后一个  
 8 //以下有关于这个结构的解释  
 9 
10 union  
11 {  
12 struct // For Connection-less miniports   
13 {  
14 UCHAR MiniportReserved[2*sizeof(PVOID)];  
15 UCHAR WrapperReserved[2*sizeof(PVOID)];  
16 };  
17 
18 struct  
19 {  
20 //   
21 // For de-serialized miniports. And by implication conn-oriented miniports.   
22 // This is for the send-path only. Packets indicated will use WrapperReserved   
23 // instead of WrapperReservedEx   
24 //   
25 UCHAR MiniportReservedEx[3*sizeof(PVOID)];  
26 UCHAR WrapperReservedEx[sizeof(PVOID)];  
27 };  
28 
29 struct  
30 {  
31 UCHAR MacReserved[4*sizeof(PVOID)];  
32 };  
33 };  
34 
35 ULONG_PTR Reserved[2]; // For compatibility with Win95   
36 UCHAR ProtocolReserved[1];  
37 
38 } NDIS_PACKET, *PNDIS_PACKET, **PPNDIS_PACKET;  
39 
40 // NDIS_PACKET_PRIVATE 的定义  
41 typedef struct _NDIS_PACKET_PRIVATE  
42 {  
43 UINT PhysicalCount; // number of physical pages in packet.   
44 UINT TotalLength; // Total amount of data in the packet.   
45 PNDIS_BUFFER Head; // 链表指针,指向第一个 
46 PNDIS_BUFFER Tail; // 链表指针,指向最后一个  
47 
48 // if Head is NULL the chain is empty; Tail doesn\'t have to be NULL also   
49 
50 PNDIS_PACKET_POOL Pool; // so we know where to free it back to   
51 UINT Count;  
52 ULONG Flags;  
53 BOOLEAN ValidCounts;  
54 UCHAR NdisPacketFlags; // See fPACKET_xxx bits below   
55 USHORT NdisPacketOobOffset;  
56 } NDIS_PACKET_PRIVATE, * PNDIS_PACKET_PRIVATE;  
57 
58 //NDIS_BUFFER定义 其实就是一个内存描述符
59 
60 typedef struct _NDIS_BUFFER {  
61 struct _NDIS_BUFFER *Next; //指向下一个节点的指针
62 PVOID VirtualAddress;      //指向报文首地址
63 PNDIS_BUFFER_POOL Pool;  
64 UINT Length;               //报文数据长度
65 UINT Signature;  
66 } NDIS_BUFFER, * PNDIS_BUFFER;  

注释写的很清楚了  那么他们的关系还是不清楚的话看看附图



  好了  这样一来我们的思路大概清楚了  NDIS_PACKET只不过是一个关于NDIS_BUFFER链表的结构  在NDIS_PACKET中的成 员Private中有指向第一个NDIS_BUFFER的指针和指向最后一个NDIS_BUFFER的指针  分别是Private.Head 和Private.Tail     而NDIS_BUFFER中就记录了我们数据包的地址和下一个NDIS_BUFFER的地址   操作有很多种方法   由于这些结构体本来对我们是不透明的    所以最安全的方法是用MS提供的一系列函数来操作NDIS_PACKET和NDIS_BUFFER  

    还是拿个例子好说话吧

 1 NDIS_STATUS status ;
 2     PNDIS_BUFFER NdisBuffer ;
 3     UINT TotalPacketLength = 0 , copysize = 0 , DataOffset = 0 , PhysicalBufferCount  ,  BufferCount   ;
 4     PUCHAR mybuffer = NULL ,tembuffer = NULL ;  
 5 
 6 //假设这个是在PtReceive等函数中得到的PACKET
 7 NdisQueryPacket(packet                     //我们先得到第一个NDISBUFFER 的指针   
 8         , &PhysicalBufferCount              
 9         , &BufferCount                           
10         ,&NdisBuffer                               //NdisBuffer就是指向链表头
11         , &TotalPacketLength
12         );
13 /*
14 其实也可以不用那么麻烦 直接  NdisBuffer = packet->Private.Head ;就可以取得第一个BUFFER了
15 */
16 
17     status = NdisAllocateMemory( &mybuffer, 20480, HighestAcceptableMax );  //分配我们自己的内存块
18 
19     if( status != NDIS_STATUS_SUCCESS )
20         return NDIS_STATUS_FAILURE ;
21 
22     NdisZeroMemory( mybuffer, 2048 ) ;
23 
24     NdisQueryBufferSafe(  //取得NDIS_BUFFER描述符中数据的首地址和大小
25                                 NdisBuffer,
26                                 &tembuffer,
27                                 &copysize,
28                                 NormalPagePriority
29     );  
30      
31         //将数据复制到我们的内存中
32     NdisMoveMemory(mybuffer, tembuffer, copysize) ;
33 
34     DataOffset = copysize ;
35 
36     while(1)
37     {
38         /*
39                 也可以这样操作而不用NdisGetNextBuffer
40         if(NdisBuffer->Next == packet->Private.Tail )
41             break ;
42 
43         NdisBuffer = NdisBuffer->Next ;
44 
45         if(pmdl == NULL )
46            break ;
47            */
48         //获得下一个NDIS_BUFFER的的指针
49     NdisGetNextBuffer(NdisBuffer , &NdisBuffer ) ;
50         如果指针是NULL  那么表示到链表尾了
51     if( NdisBuffer == NULL )
52         break ;
53 
54     NdisQueryBufferSafe(
55                                 NdisBuffer,
56                                 &tembuffer,
57                                 &copysize,
58                                 NormalPagePriority
59                                 ) ;
60 
61     NdisMoveMemory( mybuffer + DataOffset , tembuffer, copysize) ;
62 
63     DataOffset += copysize  ;
64 
65     }
66 
67 //OK  我们要的数据就全部都在我们申请的内存mybuffer 数据大小为DataOffset

   
 

posted on 2008-09-18 23:25 __ay 阅读(2885) 评论(13)  编辑 收藏 引用 所属分类: 操作系统&&内核

Feedback

# re: 个人总结NDIS中NDIS_PACKET,NDIS_BUFFER的关系 2009-02-12 15:01 NUMBY

不错哈,计院哪个年级的呢?在学习NDIS编程么?方便的话给个QQ交流吧,我的邮箱是zhangx,后面是@学校域名.  回复  更多评论   

# re: 个人总结NDIS中NDIS_PACKET,NDIS_BUFFER的关系 2009-02-12 15:55 __ay

@NUMBY
呵呵 我只做到了通过NDIS截获数据包而已 更深层次的一些操作我没怎么深入研究 你也是UESTC的?如果你需要我可以把一些学习资料给你 以前我学习的时候积累下来的 嘻嘻  回复  更多评论   

# re: 个人总结NDIS中NDIS_PACKET,NDIS_BUFFER的关系 2009-02-12 17:18 NUMBY

@__ay
是的,我在学院软件工程研究中心,给我发封信吧,给个QQ号交流一下。  回复  更多评论   

# re: 个人总结NDIS中NDIS_PACKET,NDIS_BUFFER的关系 2009-02-28 13:35 jakiejia

@__ay
您好,我想学习一下ndis,但是不知道从何入手,希望您能把一些学习资料给我一份,谢谢您 jakiejia@163.com@__ay
  回复  更多评论   

# re: 个人总结NDIS中NDIS_PACKET,NDIS_BUFFER的关系 2009-06-22 17:49 陈陆艳

大牛,你好,我也正在学NDIS截包,但是现在还不知道如何着手,看了你的文档后明白了一些,你可以把你截包的资料发给我一下吗?非常感谢,我也是某学校的学生,谢谢你了!我的邮箱:chen_happy09@163.com  回复  更多评论   

# re: 个人总结NDIS中NDIS_PACKET,NDIS_BUFFER的关系 2009-06-22 19:40 __ay

@陈陆艳
谈不上大牛.... 只不过怕忘记做了些笔记而已 资料发给你了 有问题可以交流交流的 呵呵........  回复  更多评论   

# re: 个人总结NDIS中NDIS_PACKET,NDIS_BUFFER的关系 2009-06-23 20:28 陈陆艳

PNDIS_BUFFER Tail; // 链表指针,指向前面一个 ,,这个应该是指向最后一块buffer的指针吧  回复  更多评论   

# re: 个人总结NDIS中NDIS_PACKET,NDIS_BUFFER的关系 2009-06-23 22:00 __ay

@陈陆艳
恩恩 对 哈哈 写错了 改过来了~~多谢多谢   回复  更多评论   

# re: 个人总结NDIS中NDIS_PACKET,NDIS_BUFFER的关系 2009-09-11 16:58 小黄

能给我一份NDIS的学习资料吗?

我邮箱h275531513@hotmail.com
谢谢了  回复  更多评论   

# re: 个人总结NDIS中NDIS_PACKET,NDIS_BUFFER的关系 2010-02-02 15:36 小鹏

@小黄
希望给我一份,可以学习下  回复  更多评论   

# re: 个人总结NDIS中NDIS_PACKET,NDIS_BUFFER的关系 2010-03-01 11:07 小鹏

@__ay
可以把资料给我一点不  回复  更多评论   

# re: 个人总结NDIS中NDIS_PACKET,NDIS_BUFFER的关系 2010-09-28 10:28 黄美娟

你好!高手,小妹我正在学习NDIS。老师让做Demo,希望能得到你的资料!谢谢,请留下QQ号,方便交流!xianren2440@sina.com  回复  更多评论   

# re: 个人总结NDIS中NDIS_PACKET,NDIS_BUFFER的关系 2010-11-11 12:49 刘君来

最近在做NDIS Miniport驱动相关的东西,看了你的文章受益匪浅,能不能告诉我你的联系方式,我想跟你交流一下。
我的邮箱:csu_zhaojunzhi@163.com  回复  更多评论   



只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理