L o a d i n g . . .
主打一个C++
文章详情

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

作者近期文章
提示
×
确定
数据库执行: 7次 总耗时: 0.01s
页面加载耗时: 



wechat +447752296473
wechat cpp-blog