38#ifndef WINDIVERT_KERNEL
42#ifndef WINDIVERTEXPORT
43#define WINDIVERTEXPORT __declspec(dllimport)
57#define UINT16 uint16_t
59#define UINT32 uint32_t
61#define UINT64 uint64_t
183#define WINDIVERT_FLAG_SNIFF 0x0001
184#define WINDIVERT_FLAG_DROP 0x0002
185#define WINDIVERT_FLAG_RECV_ONLY 0x0004
186#define WINDIVERT_FLAG_READ_ONLY WINDIVERT_FLAG_RECV_ONLY
187#define WINDIVERT_FLAG_SEND_ONLY 0x0008
188#define WINDIVERT_FLAG_WRITE_ONLY WINDIVERT_FLAG_SEND_ONLY
189#define WINDIVERT_FLAG_NO_INSTALL 0x0010
202#define WINDIVERT_PARAM_MAX WINDIVERT_PARAM_VERSION_MINOR
213#define WINDIVERT_SHUTDOWN_MAX WINDIVERT_SHUTDOWN_BOTH
215#ifndef WINDIVERT_KERNEL
221 __in const char *filter,
231 __out_opt VOID *pPacket,
233 __out_opt
UINT *pRecvLen,
241 __out_opt VOID *pPacket,
243 __out_opt
UINT *pRecvLen,
246 __inout_opt
UINT *pAddrLen,
247 __inout_opt LPOVERLAPPED lpOverlapped);
254 __in const VOID *pPacket,
256 __out_opt
UINT *pSendLen,
264 __in const VOID *pPacket,
266 __out_opt
UINT *pSendLen,
270 __inout_opt LPOVERLAPPED lpOverlapped);
306#define WINDIVERT_PRIORITY_HIGHEST 30000
307#define WINDIVERT_PRIORITY_LOWEST (-WINDIVERT_PRIORITY_HIGHEST)
308#define WINDIVERT_PARAM_QUEUE_LENGTH_DEFAULT 4096
309#define WINDIVERT_PARAM_QUEUE_LENGTH_MIN 32
310#define WINDIVERT_PARAM_QUEUE_LENGTH_MAX 16384
311#define WINDIVERT_PARAM_QUEUE_TIME_DEFAULT 2000
312#define WINDIVERT_PARAM_QUEUE_TIME_MIN 100
313#define WINDIVERT_PARAM_QUEUE_TIME_MAX 16000
314#define WINDIVERT_PARAM_QUEUE_SIZE_DEFAULT 4194304
315#define WINDIVERT_PARAM_QUEUE_SIZE_MIN 65535
316#define WINDIVERT_PARAM_QUEUE_SIZE_MAX 33554432
317#define WINDIVERT_BATCH_MAX 0xFF
318#define WINDIVERT_MTU_MAX (40 + 0xFFFF)
342#define WINDIVERT_IPHDR_GET_FRAGOFF(hdr) \
343 (((hdr)->FragOff0) & 0xFF1F)
344#define WINDIVERT_IPHDR_GET_MF(hdr) \
345 ((((hdr)->FragOff0) & 0x0020) != 0)
346#define WINDIVERT_IPHDR_GET_DF(hdr) \
347 ((((hdr)->FragOff0) & 0x0040) != 0)
348#define WINDIVERT_IPHDR_GET_RESERVED(hdr) \
349 ((((hdr)->FragOff0) & 0x0080) != 0)
351#define WINDIVERT_IPHDR_SET_FRAGOFF(hdr, val) \
354 (hdr)->FragOff0 = (((hdr)->FragOff0) & 0x00E0) | \
358#define WINDIVERT_IPHDR_SET_MF(hdr, val) \
361 (hdr)->FragOff0 = (((hdr)->FragOff0) & 0xFFDF) | \
362 (((val) & 0x0001) << 5); \
365#define WINDIVERT_IPHDR_SET_DF(hdr, val) \
368 (hdr)->FragOff0 = (((hdr)->FragOff0) & 0xFFBF) | \
369 (((val) & 0x0001) << 6); \
372#define WINDIVERT_IPHDR_SET_RESERVED(hdr, val) \
375 (hdr)->FragOff0 = (((hdr)->FragOff0) & 0xFF7F) | \
376 (((val) & 0x0001) << 7); \
382 UINT8 TrafficClass0:4;
385 UINT8 TrafficClass1:4;
394#define WINDIVERT_IPV6HDR_GET_TRAFFICCLASS(hdr) \
395 ((((hdr)->TrafficClass0) << 4) | ((hdr)->TrafficClass1))
396#define WINDIVERT_IPV6HDR_GET_FLOWLABEL(hdr) \
397 ((((UINT32)(hdr)->FlowLabel0) << 16) | ((UINT32)(hdr)->FlowLabel1))
399#define WINDIVERT_IPV6HDR_SET_TRAFFICCLASS(hdr, val) \
402 (hdr)->TrafficClass0 = ((UINT8)(val) >> 4); \
403 (hdr)->TrafficClass1 = (UINT8)(val); \
406#define WINDIVERT_IPV6HDR_SET_FLOWLABEL(hdr, val) \
409 (hdr)->FlowLabel0 = (UINT8)((val) >> 16); \
410 (hdr)->FlowLabel1 = (UINT16)(val); \
461#define WINDIVERT_HELPER_NO_IP_CHECKSUM 1
462#define WINDIVERT_HELPER_NO_ICMP_CHECKSUM 2
463#define WINDIVERT_HELPER_NO_ICMPV6_CHECKSUM 4
464#define WINDIVERT_HELPER_NO_TCP_CHECKSUM 8
465#define WINDIVERT_HELPER_NO_UDP_CHECKSUM 16
467#ifndef WINDIVERT_KERNEL
473 __in const VOID *pPacket,
485 __in const VOID *pPacket,
489 __out_opt
UINT8 *pProtocol,
494 __out_opt
PVOID *ppData,
495 __out_opt
UINT *pDataLen,
496 __out_opt
PVOID *ppNext,
497 __out_opt
UINT *pNextLen);
503 __in const char *addrStr,
510 __in const char *addrStr,
533 __inout VOID *pPacket,
542 __inout VOID *pPacket,
549 __in const char *filter,
551 __out_opt
char *
object,
553 __out_opt
const char **errorStr,
554 __out_opt
UINT *errorPos);
560 __in const char *filter,
561 __in const VOID *pPacket,
569 __in const char *filter,
static ANIM_HANDLE handle
WINDIVERT_DATA_NETWORK Network
WINDIVERT_DATA_REFLECT Reflect
WINDIVERT_DATA_SOCKET Socket
struct WINDIVERT_ADDRESS * PWINDIVERT_ADDRESS
WINDIVERTEXPORT BOOL WinDivertHelperParsePacket(__in const VOID *pPacket, __in UINT packetLen, __out_opt PWINDIVERT_IPHDR *ppIpHdr, __out_opt PWINDIVERT_IPV6HDR *ppIpv6Hdr, __out_opt UINT8 *pProtocol, __out_opt PWINDIVERT_ICMPHDR *ppIcmpHdr, __out_opt PWINDIVERT_ICMPV6HDR *ppIcmpv6Hdr, __out_opt PWINDIVERT_TCPHDR *ppTcpHdr, __out_opt PWINDIVERT_UDPHDR *ppUdpHdr, __out_opt PVOID *ppData, __out_opt UINT *pDataLen, __out_opt PVOID *ppNext, __out_opt UINT *pNextLen)
WINDIVERTEXPORT void WinDivertHelperHtonIpv6Address(__in const UINT *inAddr, __out UINT *outAddr)
struct WINDIVERT_TCPHDR * PWINDIVERT_TCPHDR
WINDIVERTEXPORT BOOL WinDivertGetParam(__in HANDLE handle, __in WINDIVERT_PARAM param, __out UINT64 *pValue)
WINDIVERTEXPORT BOOL WinDivertHelperCompileFilter(__in const char *filter, __in WINDIVERT_LAYER layer, __out_opt char *object, __in UINT objLen, __out_opt const char **errorStr, __out_opt UINT *errorPos)
WINDIVERTEXPORT BOOL WinDivertRecvEx(__in HANDLE handle, __out_opt VOID *pPacket, __in UINT packetLen, __out_opt UINT *pRecvLen, __in UINT64 flags, __out WINDIVERT_ADDRESS *pAddr, __inout_opt UINT *pAddrLen, __inout_opt LPOVERLAPPED lpOverlapped)
WINDIVERTEXPORT void WinDivertHelperNtohIpv6Address(__in const UINT *inAddr, __out UINT *outAddr)
WINDIVERTEXPORT BOOL WinDivertClose(__in HANDLE handle)
WINDIVERTEXPORT BOOL WinDivertSend(__in HANDLE handle, __in const VOID *pPacket, __in UINT packetLen, __out_opt UINT *pSendLen, __in const WINDIVERT_ADDRESS *pAddr)
WINDIVERTEXPORT BOOL WinDivertHelperParseIPv6Address(__in const char *addrStr, __out_opt UINT32 *pAddr)
WINDIVERTEXPORT BOOL WinDivertHelperDecrementTTL(__inout VOID *pPacket, __in UINT packetLen)
enum WINDIVERT_SHUTDOWN * PWINDIVERT_SHUTDOWN
WINDIVERTEXPORT UINT64 WinDivertHelperHtonll(__in UINT64 x)
WINDIVERTEXPORT BOOL WinDivertHelperCalcChecksums(__inout VOID *pPacket, __in UINT packetLen, __out_opt WINDIVERT_ADDRESS *pAddr, __in UINT64 flags)
WINDIVERTEXPORT BOOL WinDivertHelperParseIPv4Address(__in const char *addrStr, __out_opt UINT32 *pAddr)
WINDIVERTEXPORT UINT16 WinDivertHelperHtons(__in UINT16 x)
struct WINDIVERT_ICMPV6HDR * PWINDIVERT_ICMPV6HDR
WINDIVERTEXPORT BOOL WinDivertHelperFormatFilter(__in const char *filter, __in WINDIVERT_LAYER layer, __out char *buffer, __in UINT bufLen)
struct WINDIVERT_UDPHDR * PWINDIVERT_UDPHDR
WINDIVERTEXPORT UINT16 WinDivertHelperNtohs(__in UINT16 x)
WINDIVERTEXPORT BOOL WinDivertSendEx(__in HANDLE handle, __in const VOID *pPacket, __in UINT packetLen, __out_opt UINT *pSendLen, __in UINT64 flags, __in const WINDIVERT_ADDRESS *pAddr, __in UINT addrLen, __inout_opt LPOVERLAPPED lpOverlapped)
struct WINDIVERT_DATA_SOCKET * PWINDIVERT_DATA_SOCKET
struct WINDIVERT_DATA_REFLECT * PWINDIVERT_DATA_REFLECT
enum WINDIVERT_PARAM * PWINDIVERT_PARAM
WINDIVERTEXPORT BOOL WinDivertSetParam(__in HANDLE handle, __in WINDIVERT_PARAM param, __in UINT64 value)
enum WINDIVERT_EVENT * PWINDIVERT_EVENT
@ WINDIVERT_LAYER_NETWORK
@ WINDIVERT_LAYER_NETWORK_FORWARD
@ WINDIVERT_LAYER_REFLECT
struct WINDIVERT_DATA_FLOW * PWINDIVERT_DATA_FLOW
struct WINDIVERT_IPV6HDR * PWINDIVERT_IPV6HDR
WINDIVERTEXPORT BOOL WinDivertHelperEvalFilter(__in const char *filter, __in const VOID *pPacket, __in UINT packetLen, __in const WINDIVERT_ADDRESS *pAddr)
enum WINDIVERT_LAYER * PWINDIVERT_LAYER
@ WINDIVERT_EVENT_SOCKET_CLOSE
@ WINDIVERT_EVENT_FLOW_DELETED
@ WINDIVERT_EVENT_REFLECT_OPEN
@ WINDIVERT_EVENT_FLOW_ESTABLISHED
@ WINDIVERT_EVENT_NETWORK_PACKET
@ WINDIVERT_EVENT_SOCKET_BIND
@ WINDIVERT_EVENT_REFLECT_CLOSE
@ WINDIVERT_EVENT_SOCKET_LISTEN
@ WINDIVERT_EVENT_SOCKET_CONNECT
@ WINDIVERT_EVENT_SOCKET_ACCEPT
@ WINDIVERT_SHUTDOWN_SEND
@ WINDIVERT_SHUTDOWN_RECV
@ WINDIVERT_SHUTDOWN_BOTH
WINDIVERTEXPORT UINT32 WinDivertHelperNtohl(__in UINT32 x)
struct WINDIVERT_DATA_NETWORK * PWINDIVERT_DATA_NETWORK
WINDIVERTEXPORT BOOL WinDivertShutdown(__in HANDLE handle, __in WINDIVERT_SHUTDOWN how)
WINDIVERTEXPORT BOOL WinDivertHelperFormatIPv6Address(__in const UINT32 *pAddr, __out char *buffer, __in UINT bufLen)
WINDIVERTEXPORT BOOL WinDivertHelperFormatIPv4Address(__in UINT32 addr, __out char *buffer, __in UINT bufLen)
struct WINDIVERT_IPHDR * PWINDIVERT_IPHDR
struct WINDIVERT_ICMPHDR * PWINDIVERT_ICMPHDR
WINDIVERTEXPORT BOOL WinDivertRecv(__in HANDLE handle, __out_opt VOID *pPacket, __in UINT packetLen, __out_opt UINT *pRecvLen, __out_opt WINDIVERT_ADDRESS *pAddr)
WINDIVERTEXPORT UINT32 WinDivertHelperHtonl(__in UINT32 x)
WINDIVERTEXPORT UINT64 WinDivertHelperNtohll(__in UINT64 x)
@ WINDIVERT_PARAM_QUEUE_SIZE
@ WINDIVERT_PARAM_QUEUE_TIME
@ WINDIVERT_PARAM_VERSION_MINOR
@ WINDIVERT_PARAM_VERSION_MAJOR
@ WINDIVERT_PARAM_QUEUE_LENGTH
WINDIVERTEXPORT HANDLE WinDivertOpen(__in const char *filter, __in WINDIVERT_LAYER layer, __in INT16 priority, __in UINT64 flags)
WINDIVERTEXPORT UINT64 WinDivertHelperHashPacket(__in const VOID *pPacket, __in UINT packetLen, __in UINT64 seed)