阅读:1439回复:3
有一个很急的关于如何截包的问题
我现在在做一个对IP数据包分析的程序,需要转换成IP数据包的格式,并对其进行分析.我定义了IP数据包的结构体:
typedef struct _IP_PACKET { // 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地址 }IP_PACKET, *P_IP_PACKET; 在PtReceive里,我已经可以通过HeaderBuffer和LookAheadBuffer来得到IP数据包,并对其进行分析.但在PtReceivePacket中,我如何得到IP的数据包呢?因为在PtReceivePacket中,并没有HeaderBuffer和LookAheadBuffer这两个参数,请大牛指教 |
|
最新喜欢:![]() |
沙发#
发布于:2004-07-11 13:28
在PiReceivePacket中,有packet这个参数,我如何从packet这个参数中,得到一个缓冲区的内容,从而把它转化为IP数据包的格式呢?
|
|
板凳#
发布于:2004-07-11 14:00
packet是一个结构体,里面包含了所需要的信息,只需要明白packet的结构就很容易得到相关的内容了。这个论坛上有很多关于这方面的介绍。
|
|
|
地板#
发布于:2004-07-12 10:35
/*******************************************************************************
函数名: CopyPacketData() 功能描述: 把一个Packet中的数据复制到一个缓冲区中 参数: Packet: 输入的Packet OffSet: 要拷贝的起始位置 Buffer: 输出的缓冲区 pLength: 输入时表示缓冲大小,输出时表示实际拷贝的大小 返回值: 是否已经拷贝PACKET中的所有数据 *******************************************************************************/ BOOL CopyPacketData( PNDIS_PACKET Packet, ULONG Offset, LPBYTE Buffer, PULONG pLength ) { UINT TotalPacketLength; LPBYTE BufferVirtualAddr; UINT BufferLength; ULONG BytesCopyed = 0; ULONG TotalLength = 0; PNDIS_BUFFER CurrentBuffer; // // If the packet is null then muck the packet unused // and return; // if ( Packet == NULL ) { *pLength = 0; return TRUE; } // // Query the packet for its buffer descriptor. // NdisQueryPacket(Packet, NULL, NULL, &CurrentBuffer, &TotalPacketLength ); // // Check if the source is null // if ( TotalPacketLength <= Offset ) { TRACE2( "TotalPacketLength( %d ) short than Offset( %d )", TotalPacketLength, Offset ); *pLength = 0; return TRUE; } TotalLength = 0; BytesCopyed = 0; // // Copy the Data to our buffer. // while( CurrentBuffer ) { // // Query the buffer for it's virtual addr. // #if NDIS50_MINIPORT || NDIS51_MINIPORT NdisQueryBufferSafe(CurrentBuffer, &BufferVirtualAddr, &BufferLength, NormalPagePriority ); #else NdisQueryBuffer(CurrentBuffer, &BufferVirtualAddr, &BufferLength ); #endif if( TotalLength + BufferLength > Offset ) { BufferVirtualAddr += Offset - TotalLength ; Offset += BufferLength; TotalLength += BufferLength; BufferLength = BufferLength - ( Offset - TotalLength ); BufferLength = ( BytesCopyed + BufferLength <= *pLength )? BufferLength : *pLength - BytesCopyed; // // Copy the data to the Dest buffer // NdisMoveMemory( Buffer, BufferVirtualAddr, BufferLength ); Buffer += BufferLength; Offset = TotalLength; BytesCopyed += BufferLength; if( BytesCopyed >= *pLength ) break; } else { TotalLength += BufferLength; } // // Get the next buffer // NdisGetNextBuffer( CurrentBuffer, &CurrentBuffer ); } *pLength = BytesCopyed; return ( CurrentBuffer == NULL )? TRUE : FALSE; } |
|