NDIS PACKET结构,如何COPY?
来源:互联网 发布:华硕访客网络限速 编辑:程序博客网 时间:2024/06/05 14:36
NDIS PACKET封装了一个网络数据包,在以太网中,就是以太网封包,有时需要对数据进行拷贝再进行特殊的处理,如何做,它的结构体是什么样了?
基本框架结构:
typedef struct _NDIS_PACKET
{
NDIS_PACKET_PRIVATE Private;
union
{
struct // For Connection-less miniports
{
UCHAR MiniportReserved[2*sizeof(PVOID)];
UCHAR WrapperReserved[2*sizeof(PVOID)];
};
struct
{
//
// For de-serialized miniports. And by implication conn-oriented miniports.
//
UCHAR MiniportReservedEx[3*sizeof(PVOID)];
UCHAR WrapperReservedEx[sizeof(PVOID)];
};
struct
{
UCHAR MacReserved[4*sizeof(PVOID)];
};
};
ULONG_PTR Reserved[2]; // For compatibility with Win95
UCHAR ProtocolReserved[1];
} NDIS_PACKET, *PNDIS_PACKET, **PPNDIS_PACKET;
其中的最后一个成员是动态长度,在使用NDIS API 分配包时,可以自行指定,但它并不是这么简单。
其中用到的NDIS_PACKET_PRIVATE结构:
//
//
// wrapper-specific part of a packet
//
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
// if Head is NULL the chain is empty; Tail doesn't have to be NULL also
PNDIS_PACKET_POOL Pool; // so we know where to free it back to
UINT Count;
ULONG Flags;
BOOLEAN ValidCounts;
UCHAR NdisPacketFlags; // See fPACKET_xxx bits below
USHORT NdisPacketOobOffset;
} NDIS_PACKET_PRIVATE, * PNDIS_PACKET_PRIVATE;
其中最后一个成员是一个偏移量,指示出的包数据结构的OOB数据结构成员的偏移量,对应一个NDIS_PACKET_OOB_DATA结构体:
typedef struct _NDIS_PACKET_OOB_DATA
{
union
{
ULONGLONG TimeToSend;
ULONGLONG TimeSent;
};
ULONGLONG TimeReceived;
UINT HeaderSize;
UINT SizeMediaSpecificInfo;
PVOID MediaSpecificInformation;
NDIS_STATUS Status;
} NDIS_PACKET_OOB_DATA, *PNDIS_PACKET_OOB_DATA;
但是在这之后,还有一个数据成员,记录此包的更多相关信息:
typedef struct _NDIS_PACKET_EXTENSION
{
PVOID NdisPacketInfo[MaxPerPacketInfo];
} NDIS_PACKET_EXTENSION, *PNDIS_PACKET_EXTENSION;
typedef enum _NDIS_PER_PACKET_INFO
{
TcpIpChecksumPacketInfo,
IpSecPacketInfo,
TcpLargeSendPacketInfo,
ClassificationHandlePacketInfo,
NdisReserved,
ScatterGatherListPacketInfo,
Ieee8021QInfo,
OriginalPacketInfo,
PacketCancelId,
OriginalNetBufferList,
CachedNetBufferList,
ShortPacketPaddingInfo,
MaxPerPacketInfo
} NDIS_PER_PACKET_INFO, *PNDIS_PER_PACKET_INFO;
综上所述,一个数据包的数据结构如下:
|NDIS_PACKET|PROTOCOL_RESERVED(DYNAMIC)|NDIS_PACKET_OOB_DATA|NDIS_PACKET_EXTENSION
如果需要拷贝一个数据包,需要注意所有以上相关数据成员。
基本框架结构:
typedef struct _NDIS_PACKET
{
NDIS_PACKET_PRIVATE Private;
union
{
struct // For Connection-less miniports
{
UCHAR MiniportReserved[2*sizeof(PVOID)];
UCHAR WrapperReserved[2*sizeof(PVOID)];
};
struct
{
//
// For de-serialized miniports. And by implication conn-oriented miniports.
//
UCHAR MiniportReservedEx[3*sizeof(PVOID)];
UCHAR WrapperReservedEx[sizeof(PVOID)];
};
struct
{
UCHAR MacReserved[4*sizeof(PVOID)];
};
};
ULONG_PTR Reserved[2]; // For compatibility with Win95
UCHAR ProtocolReserved[1];
} NDIS_PACKET, *PNDIS_PACKET, **PPNDIS_PACKET;
其中的最后一个成员是动态长度,在使用NDIS API 分配包时,可以自行指定,但它并不是这么简单。
其中用到的NDIS_PACKET_PRIVATE结构:
//
//
// wrapper-specific part of a packet
//
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
// if Head is NULL the chain is empty; Tail doesn't have to be NULL also
PNDIS_PACKET_POOL Pool; // so we know where to free it back to
UINT Count;
ULONG Flags;
BOOLEAN ValidCounts;
UCHAR NdisPacketFlags; // See fPACKET_xxx bits below
USHORT NdisPacketOobOffset;
} NDIS_PACKET_PRIVATE, * PNDIS_PACKET_PRIVATE;
其中最后一个成员是一个偏移量,指示出的包数据结构的OOB数据结构成员的偏移量,对应一个NDIS_PACKET_OOB_DATA结构体:
typedef struct _NDIS_PACKET_OOB_DATA
{
union
{
ULONGLONG TimeToSend;
ULONGLONG TimeSent;
};
ULONGLONG TimeReceived;
UINT HeaderSize;
UINT SizeMediaSpecificInfo;
PVOID MediaSpecificInformation;
NDIS_STATUS Status;
} NDIS_PACKET_OOB_DATA, *PNDIS_PACKET_OOB_DATA;
但是在这之后,还有一个数据成员,记录此包的更多相关信息:
typedef struct _NDIS_PACKET_EXTENSION
{
PVOID NdisPacketInfo[MaxPerPacketInfo];
} NDIS_PACKET_EXTENSION, *PNDIS_PACKET_EXTENSION;
typedef enum _NDIS_PER_PACKET_INFO
{
TcpIpChecksumPacketInfo,
IpSecPacketInfo,
TcpLargeSendPacketInfo,
ClassificationHandlePacketInfo,
NdisReserved,
ScatterGatherListPacketInfo,
Ieee8021QInfo,
OriginalPacketInfo,
PacketCancelId,
OriginalNetBufferList,
CachedNetBufferList,
ShortPacketPaddingInfo,
MaxPerPacketInfo
} NDIS_PER_PACKET_INFO, *PNDIS_PER_PACKET_INFO;
综上所述,一个数据包的数据结构如下:
|NDIS_PACKET|PROTOCOL_RESERVED(DYNAMIC)|NDIS_PACKET_OOB_DATA|NDIS_PACKET_EXTENSION
如果需要拷贝一个数据包,需要注意所有以上相关数据成员。
0 0
- NDIS PACKET结构,如何COPY?
- NDIS PACKET结构,如何COPY?
- Ndis 协议驱动-Packet源码
- NDIS驱动结构
- ts packet结构分析
- NDIS
- 如何分析HCI的Command Packet和Event Packet包
- 如何分析HCI的Command Packet和Event Packet包
- 如何分析HCI的Command Packet和Event Packet包
- 如何分析HCI的Command Packet和Event Packet包
- ASF文件结构之Packet的Payload
- packet
- 如何区分ip packet 是否分片。
- NDIS(NDIS开发详解)
- 结构体的浅copy和深copy
- 如何获取并分析Bluetooth HCI层Command Packet和Event Packet包
- 浅谈usb的枚举过程及Ndis驱动的分层结构
- NDIS简介
- 视音频编解码学习工程:FLV封装格式分析器
- Memcached 及 Redis 架构分析和比较
- Eclipse中的buildpath详解
- TypeScript设计模式之单例、建造者、原型
- java中volatile关键字的含义
- NDIS PACKET结构,如何COPY?
- 个推sdk 集成(项目firecommand中的应用)
- 17. Letter Combinations of a Phone Number
- iOS开发:移动端与前端交互的一些基本操作
- myeclipse快捷键之前进——Ctrl+Y
- leetcode_middle_87_274. H-Index
- java使用ftp上传文件出现false()
- C++中引用(&)的用法和应用实例
- 字符编码判断