文章详情
WinDivert中的结构变量解释(持续补充)
Posted on 2024-01-01 20:46:22 by 主打一个C++
x64WinDivert库中常用的数据结构解释记录,方便使用参考!
typedef struct
{
UINT8 HdrLength:4; // 头部长度,以 32 位字为单位,四位表示头部的长度
UINT8 Version:4; // IP 版本,通常为 4(IPv4)或 6(IPv6),四位表示版本
UINT8 TOS; // 服务类型 (Type of Service),用于指定数据包的优先级和服务质量
UINT16 Length; // 整个 IP 数据报的长度,包括头部和数据部分,以字节为单位
UINT16 Id; // 唯一标识符,用于分片和重组,标识数据报的不同分片
UINT16 FragOff0; // 分片偏移,指示分片在原始数据包中的位置,包含更多分片信息的标志
UINT8 TTL; // 存活时间 (Time to Live),表示数据包在网络中可以经过的最大路由数
UINT8 Protocol; // 封装在 IP 数据报中的上层协议类型(如 TCP、UDP)
UINT16 Checksum; // 校验和,检测头部在传输过程中是否发生错误
UINT32 SrcAddr; // 源 IP 地址,表示发送数据包的设备的 IP 地址
UINT32 DstAddr; // 目标 IP 地址,表示接收数据包的设备的 IP 地址
} WINDIVERT_IPHDR, *PWINDIVERT_IPHDR;
typedef struct
{
UINT16 SrcPort; // 源端口,表示发送方的应用程序端口号
UINT16 DstPort; // 目标端口,表示接收方的应用程序端口号
UINT32 SeqNum; // 序列号,用于确保数据包的顺序,标识发送的数据字节流中的位置
UINT32 AckNum; // 确认号,表示期望接收的数据的下一个字节(确认已接收的序列号 + 1)
UINT16 Reserved1:4; // 保留字段,未使用,用于将来扩展(4 位)
UINT16 HdrLength:4; // 头部长度,表示 TCP 头部的长度,以 32 位字为单位(4 位)
UINT16 Fin:1; // FIN 标志位,表示发送方希望关闭连接(1 位)
UINT16 Syn:1; // SYN 标志位,表示发起连接请求(1 位)
UINT16 Rst:1; // RST 标志位,表示重置连接(1 位)
UINT16 Psh:1; // PSH 标志位,表示接收方应立即将数据交给上层应用程序(1 位)
UINT16 Ack:1; // ACK 标志位,表示确认数据包(1 位)
UINT16 Urg:1; // URG 标志位,表示紧急数据的存在(1 位)
UINT16 Reserved2:2; // 另一个保留字段,未使用,用于将来扩展(2 位)
UINT16 Window; // 窗口大小,表示接收方可以接收的字节数(用于流控)
UINT16 Checksum; // 校验和,用于检验 TCP 头部和数据的完整性
UINT16 UrgPtr; // 紧急指针,指示紧急数据的字节位置(如果 URG 标志位被设置)
} WINDIVERT_TCPHDR, *PWINDIVERT_TCPHDR;
typedef struct
{
UINT16 SrcPort; // 源端口,表示发送方的应用程序端口号
UINT16 DstPort; // 目标端口,表示接收方的应用程序端口号
UINT16 Length; // 整个 UDP 数据包的长度,包括头部和数据部分,以字节为单位
UINT16 Checksum; // 校验和,用于检验UDP数据包在传输过程中是否发生错误
} WINDIVERT_UDPHDR, *PWINDIVERT_UDPHDR;
typedef struct
{
INT64 Timestamp; // 数据包的时间戳
UINT32 Layer:8; // 数据包的层
UINT32 Event:8; // 数据包事件
UINT32 Sniffed:1; // 数据包是否被嗅探?
UINT32 Outbound:1; // 数据包是否为出站?
UINT32 Loopback:1; // 数据包是否为回环?
UINT32 Impostor:1; // 数据包是否为伪装?
UINT32 IPv6:1; // 数据包是否为 IPv6?
UINT32 IPChecksum:1; // 数据包是否具有有效的 IPv4 校验和?
UINT32 TCPChecksum:1; // 数据包是否具有有效的 TCP 校验和?
UINT32 UDPChecksum:1; // 数据包是否具有有效的 UDP 校验和?
UINT32 Reserved1:8; // 保留字段1
UINT32 Reserved2; // 保留字段2
union
{
WINDIVERT_DATA_NETWORK Network; // 网络层数据
WINDIVERT_DATA_FLOW Flow; // 流层数据
WINDIVERT_DATA_SOCKET Socket; // 套接字层数据
WINDIVERT_DATA_REFLECT Reflect; // 反射层数据
UINT8 Reserved3[64]; // 保留字段3
};
} WINDIVERT_ADDRESS, *PWINDIVERT_ADDRESS;
*转载请注明出处:原文链接:https://cpp.vin/page/52.html