阅读:3296回复:8
关于ndis_packet的结构问题,各位大侠给讲解一下吧
我用passthru改编程序,截获数据包的时候是用一个pndis_packet格式的指针存起来的,而在DDK文档里面可以看到pndis_packet是定义成ndis_packet结构的指针的,那就是说ndis_packet是用来放数据包的了。可是一般包上有ip头,mac头,(是不是还有ndis定义的头我不太懂),还有数据字段,而DDK里面给出的那个ndis_packet的结构定义看不出有这些字段呀,而是一些reserved什么的:
typedef struct _NDIS_PACKET { NDIS_PACKET_PRIVATE Private; union { struct { UCHAR MiniportReserved[2*sizeof(PVOID)]; UCHAR WrapperReserved[2*sizeof(PVOID)]; }; struct { UCHAR MiniportReservedEx[3*sizeof(PVOID)]; UCHAR WrapperReservedEx[sizeof(PVOID)]; }; struct { UCHAR MacReserved[4*sizeof(PVOID)]; }; }; ULONG_PTR Reserved[2]; UCHAR ProtocolReserved[1]; } NDIS_PACKET, *PNDIS_PACKET, **PPNDIS_PACKET; 这到底是怎么一个关系,我搞的头都大了,翻了以前的文章,好象也没见到讲的很清楚的(难道我看的太不仔细了?),我的工作是要截获包修改mac头然后转发出去,现在已经可以截获下来保存到一个pndis_packet里面了,但是就不知道怎么去找对应的mac头字段的位置了,也就没有办法修改了 :(,导师催的又急,各位大侠指点迷津呀!!!!!!!!!! |
|
沙发#
发布于:2003-04-16 13:28
以前有帖子讲这个,你去搜搜吧!
好运! |
|
|
板凳#
发布于:2003-04-16 13:43
到DDK 帮助
Network Drivers->Design Guide->Part1 Network Drivers->3.0 Network Drivers Programming Considerations->3.5 Packet Structure。 看完了这篇文章,你要是还不知道怎么办,我也没办法了。 |
|
地板#
发布于:2003-04-16 14:02
既然你已经看到这个结构了,你为什么没有再看一看private的结构呢?
|
|
|
地下室#
发布于:2003-04-16 15:21
typedef struct _NDIS_PACKET_PRIVATE {
UINT PhysicalCount; // number of physical pages in packet. UINT TotalLength; // Total amount of data in the packet. PNDIS_BUFFER Head; // first buffer in the chain PNDIS_BUFFER Tail; // last buffer in the chain PNDIS_PACKET_POOL Pool; // so we know where to free it back to UINT Count; ULONG Flags; UCHAR Reserved[8]; // for future expansion } NDIS_PACKET_PRIVATE, * PNDIS_PACKET_PRIVATE; NDIS_BUFFER 定义: typedef struct _NDIS_BUFFER { struct _NDIS_BUFFER *Next; PVOID VirtualAddress; PNDIS_BUFFER_POOL Pool; UINT Length; UINT Signature; } NDIS_BUFFER, * PNDIS_BUFFER; NDIS_PACKET是一个 NDIS_BUFFER 结构的链表。数据包是用 NDIS_BUFFER来表示,VirtualAddress 是数据包的缓冲区指针,Length是VirtualAddress 的长度,Next指向下一个数据包缓冲区。通过这个链表可以得到一个完整的网络数据包。 |
|
5楼#
发布于:2003-04-16 15:48
感谢各位的答复!!!!!不过我还是有些不大明白,看来我比较苯吧 :mad:
to mikeluo大侠:private的结构在哪里找呀,我搜索了一下NDIS_PACKET_PRIVATE,没有搜出什么结果呀,还有PVOID是指一个普通指针的长度么? to fracker斑竹:十分感谢您的提醒,这篇文章一开始看DDK的时候还看过,竟然忘记了(我真是。。。sigh),这个东东确实是用来解析packet包的,您看对于如下这段代码我的解释有什么问题: NdisZeroMemory(pPacketContent, 2000); NdisMoveMemory(pPacketContent, HeaderBuffer, HeaderBufferSize); NdisMoveMemory(pPacketContent+ HeaderBufferSize, LookAheadBuffer, LookAheadBufferSize); PacketLen = PacketSize+HeaderBufferSize; //将数据包的内容拷贝到pPacketContent里面去,这里的包应该是实际在网络中传输的部分 :cool: NdisDprAllocatePacket(&Status,&MyPacket,pAdapt->RecvPacketPoolHandle); //分配一个自己定义的packet头 if(Status == NDIS_STATUS_SUCCESS) { NdisAllocateBuffer(&Status,&PacketBuffer,pAdapt->RecvBufferPoolHandle,pPacketContent,PacketLen); //分配一段?一个?buffer,buffer指向的是我们实际的包的内容,包括数据还有mac头,ip头,tcp头。这些东西事先拷贝到我们所分配的memory就是pPacketContent里面。 NdisChainBufferAtFront( MyPacket, PacketBuffer); //把packet和buffer链起来 MyPacket->Private.Head->Next=NULL; MyPacket->Private.Tail=NULL; Resvd =(PRSVD)(MyPacket->MiniportReserved); Resvd->OriginalPkt = NULL; NDIS_SET_PACKET_HEADER_SIZE( MyPacket, HeaderBufferSize ); //这些就是给ndis_packet的头的一些参数赋值了 NdisMIndicateReceivePacket(pAdapt->MiniportHandle, &MyPacket, 1); 如果我要修改包的话,就可以在:cool:的地方,对pPacketContent对应的位直接修改,这样理解对么? 还有,这是我理解的mac头和ip头格式,各位大侠看看对么?多谢! // Ethernet unsigned char targ_hw_addr[6]; // 目的地址,6字节。 unsigned char src_hw_addr[6]; // 源地址,6字节。 unsigned char H_frame_type; unsigned char L_frame_type; // IP unsigned char h_verlen; //4位首部长度,4位IP版本号 unsigned char tos; //8位服务类型TOS unsigned short total_len; //16位总长度(字节) unsigned short ident; //16位标识 unsigned short frag_and_flags; //3位标志位和13位偏移 unsigned char ttl; //8位生存时间 TTL unsigned char proto; //8位协议 (1->ICMP, 2->IGMP, 6->TCP, 17->UDP) unsigned short checksum; //16位IP首部校验和 unsigned int sourceIP; //32位源IP地址 unsigned int destIP; //32位目的IP地址 不过,fracker老大,这个虽然解决了我面对的实际问题(我觉得解决了,如果我上面的分析基本正确的话呵呵),我还是对_NDIS_PACKET的结构定义不太理解,您所说的那篇文章所提到的Flags,PhysicalPageCount,FirstBuffer都放在什么地方了呀?还望各位大侠点拨一下!!! to monkeyy大侠:我正在搜索以前的帖子,多谢! [编辑 - 4/16/03 by zuozi] |
|
6楼#
发布于:2011-03-25 09:57
回 4楼(david99) 的帖子
能不能留下QQ啊,有很多问题,不懂~~关于ndis驱动改造的 |
|
7楼#
发布于:2011-05-26 09:37
// 以太头
typedef struct _ETH { UCHAR eth_dest[6]; // 目标MAC地址 UCHAR eth_src[6]; // 源MAC地址 union { USHORT eth_type; // Ethernet type field. USHORT eth_len; // 802.3 length field. }; } ETH, *PETH; //IP头 typedef struct IP_HEADER { UCHAR iph_verlen; // 版本 (4 bits) + 首部长度 (4 bits) UCHAR iph_tos; // 8位服务类型(Type of service) USHORT iph_length; // 16位总长(Total length) USHORT iph_id; // 16位标识(Identification) USHORT iph_offset; // 3位标志位(Flags) (3 bits) + 段偏移量(Fragment offset) (13 bits) UCHAR iph_ttl; // 8位存活时间(Time to live) UCHAR iph_protocol; // 8位协议(Protocol) USHORT iph_xsum; // 16位首部校验和(Header checksum) UCHAR iph_src[4]; // 32位源地址(Source address) UCHAR iph_dest[4]; // 32位目的地址(Destination address) } IP_HEADER, *PIP_HEADER; //UDP头 typedef struct UDP_HEADER{ USHORT sport; // 源端口(Source port) USHORT dport; // 目的端口(Destination port) USHORT len; // UDP数据包长度(Datagram length) USHORT crc; // 校验和(Checksum) }UDP_HEADER,*PUDP_HEADER; //TCP头部 struct TCP_HEADER { USHORT sport; USHORT dport; UCHAR m_seq[4]; USHORT m_ack[4]; char m_hlen_res4; //4位tcp头部长,6位保留的前4位 char m_res2_flag; //6位保留的后2位,6位标志 USHORT m_win; USHORT m_cksum; USHORT m_urp; } TCP_HEADER,*PTCP_HEADER; // 以太头 typedef struct _ETH { UCHAR eth_dest[6]; // 目标MAC地址 UCHAR eth_src[6]; // 源MAC地址 union { USHORT eth_type; // Ethernet type field. USHORT eth_len; // 802.3 length field. }; } ETH, *PETH; |
|
8楼#
发布于:2011-05-26 09:37
// 以太头
typedef struct _ETH { UCHAR eth_dest[6]; // 目标MAC地址 UCHAR eth_src[6]; // 源MAC地址 union { USHORT eth_type; // Ethernet type field. USHORT eth_len; // 802.3 length field. }; } ETH, *PETH; //IP头 typedef struct IP_HEADER { UCHAR iph_verlen; // 版本 (4 bits) + 首部长度 (4 bits) UCHAR iph_tos; // 8位服务类型(Type of service) USHORT iph_length; // 16位总长(Total length) USHORT iph_id; // 16位标识(Identification) USHORT iph_offset; // 3位标志位(Flags) (3 bits) + 段偏移量(Fragment offset) (13 bits) UCHAR iph_ttl; // 8位存活时间(Time to live) UCHAR iph_protocol; // 8位协议(Protocol) USHORT iph_xsum; // 16位首部校验和(Header checksum) UCHAR iph_src[4]; // 32位源地址(Source address) UCHAR iph_dest[4]; // 32位目的地址(Destination address) } IP_HEADER, *PIP_HEADER; //UDP头 typedef struct UDP_HEADER{ USHORT sport; // 源端口(Source port) USHORT dport; // 目的端口(Destination port) USHORT len; // UDP数据包长度(Datagram length) USHORT crc; // 校验和(Checksum) }UDP_HEADER,*PUDP_HEADER; //TCP头部 struct TCP_HEADER { USHORT sport; USHORT dport; UCHAR m_seq[4]; USHORT m_ack[4]; char m_hlen_res4; //4位tcp头部长,6位保留的前4位 char m_res2_flag; //6位保留的后2位,6位标志 USHORT m_win; USHORT m_cksum; USHORT m_urp; } TCP_HEADER,*PTCP_HEADER; // 以太头 typedef struct _ETH { UCHAR eth_dest[6]; // 目标MAC地址 UCHAR eth_src[6]; // 源MAC地址 union { USHORT eth_type; // Ethernet type field. USHORT eth_len; // 802.3 length field. }; } ETH, *PETH; |
|