beckzp
驱动牛犊
驱动牛犊
  • 注册日期2004-07-02
  • 最后登录2016-01-09
  • 粉丝1
  • 关注1
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1439回复:3

有一个很急的关于如何截包的问题

楼主#
更多 发布于:2004-07-11 12:47
我现在在做一个对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这两个参数,请大牛指教

最新喜欢:

jzyhummeljzyhum...
beckzp
驱动牛犊
驱动牛犊
  • 注册日期2004-07-02
  • 最后登录2016-01-09
  • 粉丝1
  • 关注1
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-07-11 13:28
在PiReceivePacket中,有packet这个参数,我如何从packet这个参数中,得到一个缓冲区的内容,从而把它转化为IP数据包的格式呢?
canoe982
驱动牛犊
驱动牛犊
  • 注册日期2003-04-11
  • 最后登录2005-12-14
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-07-11 14:00
packet是一个结构体,里面包含了所需要的信息,只需要明白packet的结构就很容易得到相关的内容了。这个论坛上有很多关于这方面的介绍。
独怜幽草涧边生, 上有黄鹂深树鸣。 春潮带雨晚来急, 野渡无人舟自横。
bingjie
驱动小牛
驱动小牛
  • 注册日期2001-08-15
  • 最后登录2007-11-29
  • 粉丝0
  • 关注0
  • 积分36分
  • 威望5点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
地板#
发布于: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;
}
游客

返回顶部