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
77 WINDIVERT_LAYER_NETWORK = 0,
78 WINDIVERT_LAYER_NETWORK_FORWARD = 1,
79 WINDIVERT_LAYER_FLOW = 2,
80 WINDIVERT_LAYER_SOCKET = 3,
81 WINDIVERT_LAYER_REFLECT = 4,
82} WINDIVERT_LAYER, *PWINDIVERT_LAYER;
99 UINT64 ParentEndpointId;
102 UINT32 RemoteAddr[4];
114 UINT64 ParentEndpointId;
117 UINT32 RemoteAddr[4];
130 WINDIVERT_LAYER Layer;
149 UINT64 TCPChecksum:1;
150 UINT64 UDPChecksum:1;
167 WINDIVERT_EVENT_NETWORK_PACKET = 0,
168 WINDIVERT_EVENT_FLOW_ESTABLISHED = 1,
170 WINDIVERT_EVENT_FLOW_DELETED = 2,
171 WINDIVERT_EVENT_SOCKET_BIND = 3,
172 WINDIVERT_EVENT_SOCKET_CONNECT = 4,
173 WINDIVERT_EVENT_SOCKET_LISTEN = 5,
174 WINDIVERT_EVENT_SOCKET_ACCEPT = 6,
175 WINDIVERT_EVENT_SOCKET_CLOSE = 7,
176 WINDIVERT_EVENT_REFLECT_OPEN = 8,
177 WINDIVERT_EVENT_REFLECT_CLOSE = 9,
178} WINDIVERT_EVENT, *PWINDIVERT_EVENT;
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
196 WINDIVERT_PARAM_QUEUE_LENGTH = 0,
197 WINDIVERT_PARAM_QUEUE_TIME = 1,
198 WINDIVERT_PARAM_QUEUE_SIZE = 2,
199 WINDIVERT_PARAM_VERSION_MAJOR = 3,
200 WINDIVERT_PARAM_VERSION_MINOR = 4,
201} WINDIVERT_PARAM, *PWINDIVERT_PARAM;
202#define WINDIVERT_PARAM_MAX WINDIVERT_PARAM_VERSION_MINOR
209 WINDIVERT_SHUTDOWN_RECV = 0x1,
210 WINDIVERT_SHUTDOWN_SEND = 0x2,
211 WINDIVERT_SHUTDOWN_BOTH = 0x3,
212} WINDIVERT_SHUTDOWN, *PWINDIVERT_SHUTDOWN;
213#define WINDIVERT_SHUTDOWN_MAX WINDIVERT_SHUTDOWN_BOTH
215#ifndef WINDIVERT_KERNEL
220extern WINDIVERTEXPORT HANDLE WinDivertOpen(
221 __in
const char *filter,
222 __in WINDIVERT_LAYER layer,
229extern WINDIVERTEXPORT BOOL WinDivertRecv(
231 __out_opt VOID *pPacket,
233 __out_opt UINT *pRecvLen,
239extern WINDIVERTEXPORT BOOL WinDivertRecvEx(
241 __out_opt VOID *pPacket,
243 __out_opt UINT *pRecvLen,
246 __inout_opt UINT *pAddrLen,
247 __inout_opt LPOVERLAPPED lpOverlapped);
252extern WINDIVERTEXPORT BOOL WinDivertSend(
254 __in
const VOID *pPacket,
256 __out_opt UINT *pSendLen,
262extern WINDIVERTEXPORT BOOL WinDivertSendEx(
264 __in
const VOID *pPacket,
266 __out_opt UINT *pSendLen,
270 __inout_opt LPOVERLAPPED lpOverlapped);
275extern WINDIVERTEXPORT BOOL WinDivertShutdown(
277 __in WINDIVERT_SHUTDOWN how);
282extern WINDIVERTEXPORT BOOL WinDivertClose(
288extern WINDIVERTEXPORT BOOL WinDivertSetParam(
290 __in WINDIVERT_PARAM param,
296extern WINDIVERTEXPORT BOOL WinDivertGetParam(
298 __in WINDIVERT_PARAM param,
299 __out UINT64 *pValue);
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
472extern WINDIVERTEXPORT UINT64 WinDivertHelperHashPacket(
473 __in
const VOID *pPacket,
484extern WINDIVERTEXPORT BOOL WinDivertHelperParsePacket(
485 __in
const VOID *pPacket,
487 __out_opt PWINDIVERT_IPHDR *ppIpHdr,
488 __out_opt PWINDIVERT_IPV6HDR *ppIpv6Hdr,
489 __out_opt UINT8 *pProtocol,
490 __out_opt PWINDIVERT_ICMPHDR *ppIcmpHdr,
491 __out_opt PWINDIVERT_ICMPV6HDR *ppIcmpv6Hdr,
492 __out_opt PWINDIVERT_TCPHDR *ppTcpHdr,
493 __out_opt PWINDIVERT_UDPHDR *ppUdpHdr,
494 __out_opt PVOID *ppData,
495 __out_opt UINT *pDataLen,
496 __out_opt PVOID *ppNext,
497 __out_opt UINT *pNextLen);
502extern WINDIVERTEXPORT BOOL WinDivertHelperParseIPv4Address(
503 __in
const char *addrStr,
504 __out_opt UINT32 *pAddr);
509extern WINDIVERTEXPORT BOOL WinDivertHelperParseIPv6Address(
510 __in
const char *addrStr,
511 __out_opt UINT32 *pAddr);
516extern WINDIVERTEXPORT BOOL WinDivertHelperFormatIPv4Address(
524extern WINDIVERTEXPORT BOOL WinDivertHelperFormatIPv6Address(
525 __in
const UINT32 *pAddr,
532extern WINDIVERTEXPORT BOOL WinDivertHelperCalcChecksums(
533 __inout VOID *pPacket,
541extern WINDIVERTEXPORT BOOL WinDivertHelperDecrementTTL(
542 __inout VOID *pPacket,
543 __in UINT packetLen);
548extern WINDIVERTEXPORT BOOL WinDivertHelperCompileFilter(
549 __in
const char *filter,
550 __in WINDIVERT_LAYER layer,
551 __out_opt
char *
object,
553 __out_opt
const char **errorStr,
554 __out_opt UINT *errorPos);
559extern WINDIVERTEXPORT BOOL WinDivertHelperEvalFilter(
560 __in
const char *filter,
561 __in
const VOID *pPacket,
568extern WINDIVERTEXPORT BOOL WinDivertHelperFormatFilter(
569 __in
const char *filter,
570 __in WINDIVERT_LAYER layer,
577extern WINDIVERTEXPORT UINT16 WinDivertHelperNtohs(
579extern WINDIVERTEXPORT UINT16 WinDivertHelperHtons(
581extern WINDIVERTEXPORT UINT32 WinDivertHelperNtohl(
583extern WINDIVERTEXPORT UINT32 WinDivertHelperHtonl(
585extern WINDIVERTEXPORT UINT64 WinDivertHelperNtohll(
587extern WINDIVERTEXPORT UINT64 WinDivertHelperHtonll(
589extern WINDIVERTEXPORT
void WinDivertHelperNtohIpv6Address(
590 __in
const UINT *inAddr,
591 __out UINT *outAddr);
592extern WINDIVERTEXPORT
void WinDivertHelperHtonIpv6Address(
593 __in
const UINT *inAddr,
594 __out UINT *outAddr);