From 084c78e4afd0c2d838dc5f70292622bd219f2f6f Mon Sep 17 00:00:00 2001 From: basil00 Date: Fri, 9 Nov 2018 07:21:56 +0800 Subject: [PATCH] Code cleanup & improve const correctness in API. --- dll/windivert.c | 15 +- dll/windivert_helper.c | 12 +- dll/windivert_shared.c | 6 +- include/windivert.h | 24 +- include/windivert_device.h | 22 +- sys/windivert.c | 467 ++++++++++++++++--------------------- 6 files changed, 247 insertions(+), 299 deletions(-) diff --git a/dll/windivert.c b/dll/windivert.c index 0a7d63c..fd30f66 100644 --- a/dll/windivert.c +++ b/dll/windivert.c @@ -534,18 +534,18 @@ extern BOOL WinDivertRecvEx(HANDLE handle, PVOID pPacket, UINT packetLen, /* * Send a WinDivert packet. */ -extern BOOL WinDivertSend(HANDLE handle, PVOID pPacket, UINT packetLen, - PWINDIVERT_ADDRESS addr, UINT *writelen) +extern BOOL WinDivertSend(HANDLE handle, const VOID *pPacket, UINT packetLen, + const WINDIVERT_ADDRESS *addr, UINT *writelen) { return WinDivertIoControl(handle, IOCTL_WINDIVERT_SEND, (UINT64)addr, - sizeof(WINDIVERT_ADDRESS), pPacket, packetLen, writelen); + sizeof(WINDIVERT_ADDRESS), (PVOID)pPacket, packetLen, writelen); } /* * Send a WinDivert packet. */ -extern BOOL WinDivertSendEx(HANDLE handle, PVOID pPacket, UINT packetLen, - UINT *writeLen, UINT64 flags, PWINDIVERT_ADDRESS addr, UINT addrLen, +extern BOOL WinDivertSendEx(HANDLE handle, const VOID *pPacket, UINT packetLen, + UINT *writeLen, UINT64 flags, const WINDIVERT_ADDRESS *addr, UINT addrLen, LPOVERLAPPED overlapped) { if (flags != 0) @@ -556,12 +556,13 @@ extern BOOL WinDivertSendEx(HANDLE handle, PVOID pPacket, UINT packetLen, if (overlapped == NULL) { return WinDivertIoControl(handle, IOCTL_WINDIVERT_SEND, - (UINT64)addr, (UINT64)addrLen, pPacket, packetLen, writeLen); + (UINT64)addr, (UINT64)addrLen, (PVOID)pPacket, packetLen, + writeLen); } else { return WinDivertIoControlEx(handle, IOCTL_WINDIVERT_SEND, - (UINT64)addr, (UINT64)addrLen, pPacket, packetLen, writeLen, + (UINT64)addr, (UINT64)addrLen, (PVOID)pPacket, packetLen, writeLen, overlapped); } } diff --git a/dll/windivert_helper.c b/dll/windivert_helper.c index 5057d08..3c200a9 100644 --- a/dll/windivert_helper.c +++ b/dll/windivert_helper.c @@ -282,13 +282,13 @@ static void WinDivertFormatExpr(PWINDIVERT_STREAM stream, PEXPR expr, /* * Parse IPv4/IPv6/ICMP/ICMPv6/TCP/UDP headers from a raw packet. */ -extern BOOL WinDivertHelperParsePacket(PVOID pPacket, UINT packetLen, +extern BOOL WinDivertHelperParsePacket(const VOID *pPacket, UINT packetLen, PWINDIVERT_IPHDR *ppIpHdr, PWINDIVERT_IPV6HDR *ppIpv6Hdr, PWINDIVERT_ICMPHDR *ppIcmpHdr, PWINDIVERT_ICMPV6HDR *ppIcmpv6Hdr, PWINDIVERT_TCPHDR *ppTcpHdr, PWINDIVERT_UDPHDR *ppUdpHdr, PVOID *ppData, UINT *pDataLen) { - return WinDivertParsePacket(pPacket, packetLen, ppIpHdr, ppIpv6Hdr, + return WinDivertParsePacket((PVOID)pPacket, packetLen, ppIpHdr, ppIpv6Hdr, ppIcmpHdr, ppIcmpv6Hdr, ppTcpHdr, ppUdpHdr, NULL, ppData, pDataLen); } @@ -2316,7 +2316,7 @@ static int WinDivertBigNumCompare(const UINT32 *a, const UINT32 *b, BOOL big) /* * Get packet/payload data. */ -static BOOL WinDivertGetData(PVOID packet, UINT packet_len, UINT offset, +static BOOL WinDivertGetData(const VOID *packet, UINT packet_len, UINT offset, INT idx, UINT size, PVOID data) { if (idx < 0) @@ -2338,8 +2338,8 @@ static BOOL WinDivertGetData(PVOID packet, UINT packet_len, UINT offset, /* * Evaluate the given filter with the given packet as input. */ -extern BOOL WinDivertHelperEvalFilter(const char *filter, PVOID packet, - UINT packet_len, PWINDIVERT_ADDRESS addr) +extern BOOL WinDivertHelperEvalFilter(const char *filter, const VOID *packet, + UINT packet_len, const WINDIVERT_ADDRESS *addr) { UINT16 pc; ERROR err; @@ -2374,7 +2374,7 @@ extern BOOL WinDivertHelperEvalFilter(const char *filter, PVOID packet, SetLastError(ERROR_INVALID_PARAMETER); return FALSE; } - WinDivertParsePacket(packet, packet_len, &iphdr, &ipv6hdr, + WinDivertParsePacket((PVOID)packet, packet_len, &iphdr, &ipv6hdr, &icmphdr, &icmpv6hdr, &tcphdr, &udphdr, &protocol, NULL, &payload_len); header_len = packet_len - payload_len; diff --git a/dll/windivert_shared.c b/dll/windivert_shared.c index bd6b9e0..ed15081 100644 --- a/dll/windivert_shared.c +++ b/dll/windivert_shared.c @@ -165,7 +165,7 @@ static void WinDivertSerializeNumber(PWINDIVERT_STREAM stream, UINT32 val) * Serialize a test. */ static void WinDivertSerializeTest(PWINDIVERT_STREAM stream, - PWINDIVERT_FILTER filter) + const WINDIVERT_FILTER *filter) { INT idx; UINT i; @@ -209,7 +209,7 @@ static void WinDivertSerializeTest(PWINDIVERT_STREAM stream, * Serialize a test. */ static void WinDivertSerializeFilter(PWINDIVERT_STREAM stream, - PWINDIVERT_FILTER filter, UINT8 length) + const WINDIVERT_FILTER *filter, UINT8 length) { UINT8 i; WinDivertPutString(stream, "@WinDiv_"); // Magic @@ -443,7 +443,7 @@ WinDivertHelperParsePacketExit: * Calculate IPv4/IPv6/ICMP/ICMPv6/TCP/UDP checksums. */ extern UINT WinDivertHelperCalcChecksums(PVOID pPacket, UINT packetLen, - PWINDIVERT_ADDRESS pAddr, UINT64 flags) + const WINDIVERT_ADDRESS *pAddr, UINT64 flags) { UINT8 pseudo_header[ MAX(sizeof(WINDIVERT_PSEUDOHDR), sizeof(WINDIVERT_PSEUDOV6HDR))]; diff --git a/include/windivert.h b/include/windivert.h index 354b4e0..a736f37 100644 --- a/include/windivert.h +++ b/include/windivert.h @@ -220,9 +220,9 @@ extern WINDIVERTEXPORT HANDLE WinDivertOpen( */ extern WINDIVERTEXPORT BOOL WinDivertRecv( __in HANDLE handle, - __out PVOID pPacket, + __out VOID *pPacket, __in UINT packetLen, - __out_opt PWINDIVERT_ADDRESS pAddr, + __out_opt WINDIVERT_ADDRESS *pAddr, __out_opt UINT *pReadLen); /* @@ -234,7 +234,7 @@ extern WINDIVERTEXPORT BOOL WinDivertRecvEx( __in UINT packetLen, __out_opt UINT *pReadLen, __in UINT64 flags, - __out PWINDIVERT_ADDRESS pAddr, + __out WINDIVERT_ADDRESS *pAddr, __inout_opt UINT *pAddrLen, __inout_opt LPOVERLAPPED lpOverlapped); @@ -243,9 +243,9 @@ extern WINDIVERTEXPORT BOOL WinDivertRecvEx( */ extern WINDIVERTEXPORT BOOL WinDivertSend( __in HANDLE handle, - __in PVOID pPacket, + __in const VOID *pPacket, __in UINT packetLen, - __in PWINDIVERT_ADDRESS pAddr, + __in const WINDIVERT_ADDRESS *pAddr, __out_opt UINT *pWriteLen); /* @@ -253,11 +253,11 @@ extern WINDIVERTEXPORT BOOL WinDivertSend( */ extern WINDIVERTEXPORT BOOL WinDivertSendEx( __in HANDLE handle, - __in PVOID pPacket, + __in const VOID *pPacket, __in UINT packetLen, __out_opt UINT *pWriteLen, __in UINT64 flags, - __in PWINDIVERT_ADDRESS pAddr, + __in const WINDIVERT_ADDRESS *pAddr, __in UINT addrLen, __inout_opt LPOVERLAPPED lpOverlapped); @@ -438,7 +438,7 @@ typedef struct * Parse IPv4/IPv6/ICMP/ICMPv6/TCP/UDP headers from a raw packet. */ extern WINDIVERTEXPORT BOOL WinDivertHelperParsePacket( - __in PVOID pPacket, + __in const VOID *pPacket, __in UINT packetLen, __out_opt PWINDIVERT_IPHDR *ppIpHdr, __out_opt PWINDIVERT_IPV6HDR *ppIpv6Hdr, @@ -483,9 +483,9 @@ extern WINDIVERTEXPORT BOOL WinDivertHelperFormatIPv6Address( * Calculate IPv4/IPv6/ICMP/ICMPv6/TCP/UDP checksums. */ extern WINDIVERTEXPORT UINT WinDivertHelperCalcChecksums( - __inout PVOID pPacket, + __inout VOID *pPacket, __in UINT packetLen, - __in_opt PWINDIVERT_ADDRESS pAddr, + __in_opt const WINDIVERT_ADDRESS *pAddr, __in UINT64 flags); /* @@ -504,9 +504,9 @@ extern WINDIVERTEXPORT BOOL WinDivertHelperCompileFilter( */ extern WINDIVERTEXPORT BOOL WinDivertHelperEvalFilter( __in const char *filter, - __in PVOID pPacket, + __in const VOID *pPacket, __in UINT packetLen, - __in PWINDIVERT_ADDRESS pAddr); + __in const WINDIVERT_ADDRESS *pAddr); /* * Format the given filter string. diff --git a/include/windivert_device.h b/include/windivert_device.h index 3efd822..22bb898 100644 --- a/include/windivert_device.h +++ b/include/windivert_device.h @@ -245,20 +245,26 @@ typedef struct * IOCTL codes. */ #define IOCTL_WINDIVERT_RECV \ - CTL_CODE(FILE_DEVICE_NETWORK, 0x918, METHOD_OUT_DIRECT, FILE_ANY_ACCESS) + CTL_CODE(FILE_DEVICE_NETWORK, 0x918, METHOD_OUT_DIRECT, FILE_READ_DATA) #define IOCTL_WINDIVERT_SEND \ - CTL_CODE(FILE_DEVICE_NETWORK, 0x919, METHOD_IN_DIRECT, FILE_ANY_ACCESS) + CTL_CODE(FILE_DEVICE_NETWORK, 0x919, METHOD_IN_DIRECT, FILE_READ_DATA | \ + FILE_WRITE_DATA) #define IOCTL_WINDIVERT_START_FILTER \ - CTL_CODE(FILE_DEVICE_NETWORK, 0x91A, METHOD_IN_DIRECT, FILE_ANY_ACCESS) + CTL_CODE(FILE_DEVICE_NETWORK, 0x91A, METHOD_IN_DIRECT, FILE_READ_DATA | \ + FILE_WRITE_DATA) #define IOCTL_WINDIVERT_SET_LAYER \ - CTL_CODE(FILE_DEVICE_NETWORK, 0x91B, METHOD_IN_DIRECT, FILE_ANY_ACCESS) + CTL_CODE(FILE_DEVICE_NETWORK, 0x91B, METHOD_IN_DIRECT, FILE_READ_DATA | \ + FILE_WRITE_DATA) #define IOCTL_WINDIVERT_SET_PRIORITY \ - CTL_CODE(FILE_DEVICE_NETWORK, 0x91C, METHOD_IN_DIRECT, FILE_ANY_ACCESS) + CTL_CODE(FILE_DEVICE_NETWORK, 0x91C, METHOD_IN_DIRECT, FILE_READ_DATA | \ + FILE_WRITE_DATA) #define IOCTL_WINDIVERT_SET_FLAGS \ - CTL_CODE(FILE_DEVICE_NETWORK, 0x91D, METHOD_IN_DIRECT, FILE_ANY_ACCESS) + CTL_CODE(FILE_DEVICE_NETWORK, 0x91D, METHOD_IN_DIRECT, FILE_READ_DATA | \ + FILE_WRITE_DATA) #define IOCTL_WINDIVERT_SET_PARAM \ - CTL_CODE(FILE_DEVICE_NETWORK, 0x91E, METHOD_IN_DIRECT, FILE_ANY_ACCESS) + CTL_CODE(FILE_DEVICE_NETWORK, 0x91E, METHOD_IN_DIRECT, FILE_READ_DATA | \ + FILE_WRITE_DATA) #define IOCTL_WINDIVERT_GET_PARAM \ - CTL_CODE(FILE_DEVICE_NETWORK, 0x91F, METHOD_OUT_DIRECT, FILE_ANY_ACCESS) + CTL_CODE(FILE_DEVICE_NETWORK, 0x91F, METHOD_OUT_DIRECT, FILE_READ_DATA) #endif /* __WINDIVERT_DEVICE_H */ diff --git a/sys/windivert.c b/sys/windivert.c index 175991c..8af6571 100644 --- a/sys/windivert.c +++ b/sys/windivert.c @@ -128,7 +128,6 @@ struct reflect_context_s */ #define WINDIVERT_CONTEXT_SIZE (sizeof(struct context_s)) #define WINDIVERT_CONTEXT_MAXLAYERS 8 -#define WINDIVERT_CONTEXT_MAXWORKERS 1 typedef enum { WINDIVERT_CONTEXT_STATE_OPENING = 0xA0, // Context is opening. @@ -156,9 +155,7 @@ struct context_s LONGLONG packet_queue_maxcounts; // Packet queue max counts. ULONG packet_queue_maxtime; // Packet queue max time. WDFQUEUE read_queue; // Read queue. - WDFWORKITEM workers[WINDIVERT_CONTEXT_MAXWORKERS]; - // Read workers. - UINT8 worker_curr; // Current read worker. + WDFWORKITEM worker; // Read worker. WINDIVERT_LAYER layer; // Context's layer. UINT64 flags; // Context's flags. UINT32 priority; // Context (internal) priority. @@ -169,7 +166,7 @@ struct context_s // Filter GUIDs. BOOL installed[WINDIVERT_CONTEXT_MAXLAYERS];// What is installed? HANDLE engine_handle; // WFP engine handle. - PWINDIVERT_FILTER filter; // Packet filter. + const WINDIVERT_FILTER *filter; // Packet filter. UINT8 filter_len; // Length of filter. struct reflect_context_s reflect; // Reflection info. }; @@ -200,14 +197,14 @@ struct layer_s wchar_t *callout_desc; // Call-out description. wchar_t *filter_name; // Filter name. wchar_t *filter_desc; // Filter description. - GUID layer_guid; // WFP layer GUID. - GUID sublayer_guid; // Sub-layer GUID. + const GUID *layer_guid; // WFP layer GUID. + const GUID *sublayer_guid; // Sub-layer GUID. windivert_classify_t classify; // Classify function. windivert_flow_delete_notify_t flow_delete; // Flow delete function. UINT16 sublayer_weight; // Sub-layer weight. }; -typedef struct layer_s *layer_t; +typedef const struct layer_s *layer_t; /* * WinDivert request context. @@ -466,10 +463,10 @@ static BOOL windivert_parse_headers(PNET_BUFFER buffer, BOOL ipv4, PWINDIVERT_TCPHDR *tcp_header_ptr, PWINDIVERT_UDPHDR *udp_header_ptr, UINT8 *proto_ptr, UINT *header_len_ptr, UINT *payload_len_ptr); static BOOL windivert_filter(PNET_BUFFER buffer, WINDIVERT_LAYER layer, - PVOID layer_data, WINDIVERT_EVENT event, BOOL ipv4, BOOL outbound, - BOOL loopback, BOOL impostor, PWINDIVERT_FILTER filter); -static PWINDIVERT_FILTER windivert_filter_compile( - PWINDIVERT_FILTER ioctl_filter, size_t ioctl_filter_len, + const VOID *layer_data, WINDIVERT_EVENT event, BOOL ipv4, BOOL outbound, + BOOL loopback, BOOL impostor, const WINDIVERT_FILTER *filter); +static const WINDIVERT_FILTER *windivert_filter_compile( + const WINDIVERT_FILTER *ioctl_filter, size_t ioctl_filter_len, WINDIVERT_LAYER layer); static NTSTATUS windivert_reflect_init(WDFOBJECT parent); static void windivert_reflect_close(void); @@ -536,7 +533,7 @@ DEFINE_GUID(WINDIVERT_SUBLAYER_AUTH_RECV_ACCEPT_IPV6_GUID, /* * WinDivert supported layers. */ -static struct layer_s layer_inbound_network_ipv4_0 = +static const struct layer_s windivert_layer_inbound_network_ipv4 = { L"" WINDIVERT_DEVICE_NAME L"_SubLayerInboundNetworkIPv4", L"" WINDIVERT_DEVICE_NAME L" sublayer network (inbound IPv4)", @@ -544,15 +541,16 @@ static struct layer_s layer_inbound_network_ipv4_0 = L"" WINDIVERT_DEVICE_NAME L" callout network (inbound IPv4)", L"" WINDIVERT_DEVICE_NAME L"_FilterInboundNetworkIPv4", L"" WINDIVERT_DEVICE_NAME L" filter network (inbound IPv4)", - {0}, - {0}, + &FWPM_LAYER_INBOUND_IPPACKET_V4, + &WINDIVERT_SUBLAYER_INBOUND_IPV4_GUID, windivert_inbound_network_v4_classify, NULL, UINT16_MAX }; -static layer_t layer_inbound_network_ipv4 = &layer_inbound_network_ipv4_0; +#define WINDIVERT_LAYER_INBOUND_NETWORK_IPV4 \ + (&windivert_layer_inbound_network_ipv4) -static struct layer_s layer_outbound_network_ipv4_0 = +static const struct layer_s windivert_layer_outbound_network_ipv4 = { L"" WINDIVERT_DEVICE_NAME L"_SubLayerOutboundNetworkIPv4", L"" WINDIVERT_DEVICE_NAME L" sublayer network (outbound IPv4)", @@ -560,15 +558,16 @@ static struct layer_s layer_outbound_network_ipv4_0 = L"" WINDIVERT_DEVICE_NAME L" callout network (outbound IPv4)", L"" WINDIVERT_DEVICE_NAME L"_FilterOutboundNetworkIPv4", L"" WINDIVERT_DEVICE_NAME L" filter network (outbound IPv4)", - {0}, - {0}, + &FWPM_LAYER_OUTBOUND_IPPACKET_V4, + &WINDIVERT_SUBLAYER_OUTBOUND_IPV4_GUID, windivert_outbound_network_v4_classify, NULL, UINT16_MAX }; -static layer_t layer_outbound_network_ipv4 = &layer_outbound_network_ipv4_0; +#define WINDIVERT_LAYER_OUTBOUND_NETWORK_IPV4 \ + (&windivert_layer_outbound_network_ipv4) -static struct layer_s layer_inbound_network_ipv6_0 = +static const struct layer_s windivert_layer_inbound_network_ipv6 = { L"" WINDIVERT_DEVICE_NAME L"_SubLayerInboundNetworkIPv6", L"" WINDIVERT_DEVICE_NAME L" sublayer network (inbound IPv6)", @@ -576,15 +575,16 @@ static struct layer_s layer_inbound_network_ipv6_0 = L"" WINDIVERT_DEVICE_NAME L" callout network (inbound IPv6)", L"" WINDIVERT_DEVICE_NAME L"_FilterInboundNetworkIPv6", L"" WINDIVERT_DEVICE_NAME L" filter network (inbound IPv6)", - {0}, - {0}, + &FWPM_LAYER_INBOUND_IPPACKET_V6, + &WINDIVERT_SUBLAYER_INBOUND_IPV6_GUID, windivert_inbound_network_v6_classify, NULL, UINT16_MAX }; -static layer_t layer_inbound_network_ipv6 = &layer_inbound_network_ipv6_0; +#define WINDIVERT_LAYER_INBOUND_NETWORK_IPV6 \ + (&windivert_layer_inbound_network_ipv6) -static struct layer_s layer_outbound_network_ipv6_0 = +static const struct layer_s windivert_layer_outbound_network_ipv6 = { L"" WINDIVERT_DEVICE_NAME L"_SubLayerOutboundNetworkIPv6", L"" WINDIVERT_DEVICE_NAME L" sublayer network (outbound IPv6)", @@ -592,15 +592,16 @@ static struct layer_s layer_outbound_network_ipv6_0 = L"" WINDIVERT_DEVICE_NAME L" callout network (outbound IPv6)", L"" WINDIVERT_DEVICE_NAME L"_FilterOutboundNetworkIPv6", L"" WINDIVERT_DEVICE_NAME L" filter network (outbound IPv6)", - {0}, - {0}, + &FWPM_LAYER_OUTBOUND_IPPACKET_V6, + &WINDIVERT_SUBLAYER_OUTBOUND_IPV6_GUID, windivert_outbound_network_v6_classify, NULL, UINT16_MAX }; -static layer_t layer_outbound_network_ipv6 = &layer_outbound_network_ipv6_0; +#define WINDIVERT_LAYER_OUTBOUND_NETWORK_IPV6 \ + (&windivert_layer_outbound_network_ipv6) -static struct layer_s layer_forward_network_ipv4_0 = +static const struct layer_s windivert_layer_forward_network_ipv4 = { L"" WINDIVERT_DEVICE_NAME L"_SubLayerForwardNetworkIPv4", L"" WINDIVERT_DEVICE_NAME L" sublayer network (forward IPv4)", @@ -608,15 +609,16 @@ static struct layer_s layer_forward_network_ipv4_0 = L"" WINDIVERT_DEVICE_NAME L" callout network (forward IPv4)", L"" WINDIVERT_DEVICE_NAME L"_FilterForwardNetworkIPv4", L"" WINDIVERT_DEVICE_NAME L" filter network (forward IPv4)", - {0}, - {0}, + &FWPM_LAYER_IPFORWARD_V4, + &WINDIVERT_SUBLAYER_FORWARD_IPV4_GUID, windivert_forward_network_v4_classify, NULL, UINT16_MAX }; -static layer_t layer_forward_network_ipv4 = &layer_forward_network_ipv4_0; +#define WINDIVERT_LAYER_FORWARD_NETWORK_IPV4 \ + (&windivert_layer_forward_network_ipv4) -static struct layer_s layer_forward_network_ipv6_0 = +static const struct layer_s windivert_layer_forward_network_ipv6 = { L"" WINDIVERT_DEVICE_NAME L"_SubLayerForwardNetworkIPv6", L"" WINDIVERT_DEVICE_NAME L" sublayer network (forward IPv6)", @@ -624,145 +626,152 @@ static struct layer_s layer_forward_network_ipv6_0 = L"" WINDIVERT_DEVICE_NAME L" callout network (forward IPv6)", L"" WINDIVERT_DEVICE_NAME L"_FilterForwardNetworkIPv6", L"" WINDIVERT_DEVICE_NAME L" filter network (forward IPv6)", - {0}, - {0}, + &FWPM_LAYER_IPFORWARD_V6, + &WINDIVERT_SUBLAYER_FORWARD_IPV6_GUID, windivert_forward_network_v6_classify, NULL, UINT16_MAX }; -static layer_t layer_forward_network_ipv6 = &layer_forward_network_ipv6_0; +#define WINDIVERT_LAYER_FORWARD_NETWORK_IPV6 \ + (&windivert_layer_forward_network_ipv6) -static struct layer_s layer_resource_assignment_ipv4_0 = +static const struct layer_s windivert_layer_resource_assignment_ipv4 = { L"" WINDIVERT_DEVICE_NAME L"_SubLayerResourceAssignmentIPv4", - L"" WINDIVERT_DEVICE_NAME L" sublayer flow established (IPv4)", + L"" WINDIVERT_DEVICE_NAME L" sublayer resource assignment (IPv4)", L"" WINDIVERT_DEVICE_NAME L"_CalloutResourceAssignmentIPv4", - L"" WINDIVERT_DEVICE_NAME L" callout flow established (IPv4)", + L"" WINDIVERT_DEVICE_NAME L" callout resource assignment (IPv4)", L"" WINDIVERT_DEVICE_NAME L"_FilterResourceAssignmentIPv4", - L"" WINDIVERT_DEVICE_NAME L" filter flow established (IPv4)", - {0}, - {0}, + L"" WINDIVERT_DEVICE_NAME L" filter resource assignment (IPv4)", + &FWPM_LAYER_ALE_RESOURCE_ASSIGNMENT_V4, + &WINDIVERT_SUBLAYER_RESOURCE_ASSIGNMENT_IPV4_GUID, windivert_resource_assignment_v4_classify, NULL, 0 }; -static layer_t layer_resource_assignment_ipv4 = - &layer_resource_assignment_ipv4_0; +#define WINDIVERT_LAYER_RESOURCE_ASSIGNMENT_IPV4 \ + (&windivert_layer_resource_assignment_ipv4) -static struct layer_s layer_resource_assignment_ipv6_0 = +static const struct layer_s windivert_layer_resource_assignment_ipv6 = { L"" WINDIVERT_DEVICE_NAME L"_SubLayerResourceAssignmentIPv6", - L"" WINDIVERT_DEVICE_NAME L" sublayer flow established (IPv6)", + L"" WINDIVERT_DEVICE_NAME L" sublayer resource assignment (IPv6)", L"" WINDIVERT_DEVICE_NAME L"_CalloutResourceAssignmentIPv6", - L"" WINDIVERT_DEVICE_NAME L" callout flow established (IPv6)", + L"" WINDIVERT_DEVICE_NAME L" callout resource assignment (IPv6)", L"" WINDIVERT_DEVICE_NAME L"_FilterResourceAssignmentIPv6", - L"" WINDIVERT_DEVICE_NAME L" filter flow established (IPv6)", - {0}, - {0}, + L"" WINDIVERT_DEVICE_NAME L" filter resource assignment (IPv6)", + &FWPM_LAYER_ALE_RESOURCE_ASSIGNMENT_V6, + &WINDIVERT_SUBLAYER_RESOURCE_ASSIGNMENT_IPV6_GUID, windivert_resource_assignment_v6_classify, NULL, 0 }; -static layer_t layer_resource_assignment_ipv6 = - &layer_resource_assignment_ipv6_0; +#define WINDIVERT_LAYER_RESOURCE_ASSIGNMENT_IPV6 \ + (&windivert_layer_resource_assignment_ipv6) -static struct layer_s layer_auth_connect_ipv4_0 = +static const struct layer_s windivert_layer_auth_connect_ipv4 = { L"" WINDIVERT_DEVICE_NAME L"_SubLayerAuthConnectIPv4", - L"" WINDIVERT_DEVICE_NAME L" sublayer flow established (IPv4)", + L"" WINDIVERT_DEVICE_NAME L" sublayer auth connect (IPv4)", L"" WINDIVERT_DEVICE_NAME L"_CalloutAuthConnectIPv4", - L"" WINDIVERT_DEVICE_NAME L" callout flow established (IPv4)", + L"" WINDIVERT_DEVICE_NAME L" callout auth connect (IPv4)", L"" WINDIVERT_DEVICE_NAME L"_FilterAuthConnectIPv4", - L"" WINDIVERT_DEVICE_NAME L" filter flow established (IPv4)", - {0}, - {0}, + L"" WINDIVERT_DEVICE_NAME L" filter auth connect (IPv4)", + &FWPM_LAYER_ALE_AUTH_CONNECT_V4, + &WINDIVERT_SUBLAYER_AUTH_CONNECT_IPV4_GUID, windivert_auth_connect_v4_classify, NULL, 0 }; -static layer_t layer_auth_connect_ipv4 = &layer_auth_connect_ipv4_0; +#define WINDIVERT_LAYER_AUTH_CONNECT_IPV4 \ + (&windivert_layer_auth_connect_ipv4) -static struct layer_s layer_auth_connect_ipv6_0 = +static const struct layer_s windivert_layer_auth_connect_ipv6 = { L"" WINDIVERT_DEVICE_NAME L"_SubLayerAuthConnectIPv6", - L"" WINDIVERT_DEVICE_NAME L" sublayer flow established (IPv6)", + L"" WINDIVERT_DEVICE_NAME L" sublayer auth connect (IPv6)", L"" WINDIVERT_DEVICE_NAME L"_CalloutAuthConnectIPv6", - L"" WINDIVERT_DEVICE_NAME L" callout flow established (IPv6)", + L"" WINDIVERT_DEVICE_NAME L" callout auth connect (IPv6)", L"" WINDIVERT_DEVICE_NAME L"_FilterAuthConnectIPv6", - L"" WINDIVERT_DEVICE_NAME L" filter flow established (IPv6)", - {0}, - {0}, + L"" WINDIVERT_DEVICE_NAME L" filter auth connect (IPv6)", + &FWPM_LAYER_ALE_AUTH_CONNECT_V6, + &WINDIVERT_SUBLAYER_AUTH_CONNECT_IPV6_GUID, windivert_auth_connect_v6_classify, NULL, 0 }; -static layer_t layer_auth_connect_ipv6 = &layer_auth_connect_ipv6_0; +#define WINDIVERT_LAYER_AUTH_CONNECT_IPV6 \ + (&windivert_layer_auth_connect_ipv6) -static struct layer_s layer_auth_listen_ipv4_0 = +static const struct layer_s windivert_layer_auth_listen_ipv4 = { L"" WINDIVERT_DEVICE_NAME L"_SubLayerAuthListenIPv4", - L"" WINDIVERT_DEVICE_NAME L" sublayer flow established (IPv4)", + L"" WINDIVERT_DEVICE_NAME L" sublayer auth listen (IPv4)", L"" WINDIVERT_DEVICE_NAME L"_CalloutAuthListenIPv4", - L"" WINDIVERT_DEVICE_NAME L" callout flow established (IPv4)", + L"" WINDIVERT_DEVICE_NAME L" callout auth listen (IPv4)", L"" WINDIVERT_DEVICE_NAME L"_FilterAuthListenIPv4", - L"" WINDIVERT_DEVICE_NAME L" filter flow established (IPv4)", - {0}, - {0}, + L"" WINDIVERT_DEVICE_NAME L" filter auth listen (IPv4)", + &FWPM_LAYER_ALE_AUTH_LISTEN_V4, + &WINDIVERT_SUBLAYER_AUTH_LISTEN_IPV4_GUID, windivert_auth_listen_v4_classify, NULL, 0 }; -static layer_t layer_auth_listen_ipv4 = &layer_auth_listen_ipv4_0; +#define WINDIVERT_LAYER_AUTH_LISTEN_IPV4 \ + (&windivert_layer_auth_listen_ipv4) -static struct layer_s layer_auth_listen_ipv6_0 = +static const struct layer_s windivert_layer_auth_listen_ipv6 = { L"" WINDIVERT_DEVICE_NAME L"_SubLayerAuthListenIPv6", - L"" WINDIVERT_DEVICE_NAME L" sublayer flow established (IPv6)", + L"" WINDIVERT_DEVICE_NAME L" sublayer auth listen (IPv6)", L"" WINDIVERT_DEVICE_NAME L"_CalloutAuthListenIPv6", - L"" WINDIVERT_DEVICE_NAME L" callout flow established (IPv6)", + L"" WINDIVERT_DEVICE_NAME L" callout auth listen (IPv6)", L"" WINDIVERT_DEVICE_NAME L"_FilterAuthListenIPv6", - L"" WINDIVERT_DEVICE_NAME L" filter flow established (IPv6)", - {0}, - {0}, + L"" WINDIVERT_DEVICE_NAME L" filter auth listen (IPv6)", + &FWPM_LAYER_ALE_AUTH_LISTEN_V6, + &WINDIVERT_SUBLAYER_AUTH_LISTEN_IPV6_GUID, windivert_auth_listen_v6_classify, NULL, 0 }; -static layer_t layer_auth_listen_ipv6 = &layer_auth_listen_ipv6_0; +#define WINDIVERT_LAYER_AUTH_LISTEN_IPV6 \ + (&windivert_layer_auth_listen_ipv6) -static struct layer_s layer_auth_recv_accept_ipv4_0 = +static const struct layer_s windivert_layer_auth_recv_accept_ipv4 = { L"" WINDIVERT_DEVICE_NAME L"_SubLayerAuthRecvAcceptIPv4", - L"" WINDIVERT_DEVICE_NAME L" sublayer flow established (IPv4)", + L"" WINDIVERT_DEVICE_NAME L" sublayer auth recv accept (IPv4)", L"" WINDIVERT_DEVICE_NAME L"_CalloutAuthRecvAcceptIPv4", - L"" WINDIVERT_DEVICE_NAME L" callout flow established (IPv4)", + L"" WINDIVERT_DEVICE_NAME L" callout auth recv accept (IPv4)", L"" WINDIVERT_DEVICE_NAME L"_FilterAuthRecvAcceptIPv4", - L"" WINDIVERT_DEVICE_NAME L" filter flow established (IPv4)", - {0}, - {0}, + L"" WINDIVERT_DEVICE_NAME L" filter auth recv accept (IPv4)", + &FWPM_LAYER_ALE_AUTH_RECV_ACCEPT_V4, + &WINDIVERT_SUBLAYER_AUTH_RECV_ACCEPT_IPV4_GUID, windivert_auth_recv_accept_v4_classify, NULL, 0 }; -static layer_t layer_auth_recv_accept_ipv4 = &layer_auth_recv_accept_ipv4_0; +#define WINDIVERT_LAYER_AUTH_RECV_ACCEPT_IPV4 \ + (&windivert_layer_auth_recv_accept_ipv4) -static struct layer_s layer_auth_recv_accept_ipv6_0 = +static const struct layer_s windivert_layer_auth_recv_accept_ipv6 = { L"" WINDIVERT_DEVICE_NAME L"_SubLayerAuthRecvAcceptIPv6", - L"" WINDIVERT_DEVICE_NAME L" sublayer flow established (IPv6)", + L"" WINDIVERT_DEVICE_NAME L" sublayer auth recv accept (IPv6)", L"" WINDIVERT_DEVICE_NAME L"_CalloutAuthRecvAcceptIPv6", - L"" WINDIVERT_DEVICE_NAME L" callout flow established (IPv6)", + L"" WINDIVERT_DEVICE_NAME L" callout auth recv accept (IPv6)", L"" WINDIVERT_DEVICE_NAME L"_FilterAuthRecvAcceptIPv6", - L"" WINDIVERT_DEVICE_NAME L" filter flow established (IPv6)", - {0}, - {0}, + L"" WINDIVERT_DEVICE_NAME L" filter auth recv accept (IPv6)", + &FWPM_LAYER_ALE_AUTH_RECV_ACCEPT_V6, + &WINDIVERT_SUBLAYER_AUTH_RECV_ACCEPT_IPV6_GUID, windivert_auth_recv_accept_v6_classify, NULL, 0 }; -static layer_t layer_auth_recv_accept_ipv6 = &layer_auth_recv_accept_ipv6_0; +#define WINDIVERT_LAYER_AUTH_RECV_ACCEPT_IPV6 \ + (&windivert_layer_auth_recv_accept_ipv6) -static struct layer_s layer_flow_established_ipv4_0 = +static const struct layer_s windivert_layer_flow_established_ipv4 = { L"" WINDIVERT_DEVICE_NAME L"_SubLayerFlowEstablishedIPv4", L"" WINDIVERT_DEVICE_NAME L" sublayer flow established (IPv4)", @@ -770,15 +779,16 @@ static struct layer_s layer_flow_established_ipv4_0 = L"" WINDIVERT_DEVICE_NAME L" callout flow established (IPv4)", L"" WINDIVERT_DEVICE_NAME L"_FilterFlowEstablishedIPv4", L"" WINDIVERT_DEVICE_NAME L" filter flow established (IPv4)", - {0}, - {0}, + &FWPM_LAYER_ALE_FLOW_ESTABLISHED_V4, + &WINDIVERT_SUBLAYER_FLOW_ESTABLISHED_IPV4_GUID, windivert_flow_established_v4_classify, windivert_flow_delete_notify, 0 }; -static layer_t layer_flow_established_ipv4 = &layer_flow_established_ipv4_0; +#define WINDIVERT_LAYER_FLOW_ESTABLISHED_IPV4 \ + (&windivert_layer_flow_established_ipv4) -static struct layer_s layer_flow_established_ipv6_0 = +static const struct layer_s windivert_layer_flow_established_ipv6 = { L"" WINDIVERT_DEVICE_NAME L"_SubLayerFlowEstablishedIPv6", L"" WINDIVERT_DEVICE_NAME L" sublayer flow established (IPv6)", @@ -786,13 +796,14 @@ static struct layer_s layer_flow_established_ipv6_0 = L"" WINDIVERT_DEVICE_NAME L" callout flow established (IPv6)", L"" WINDIVERT_DEVICE_NAME L"_FilterFlowEstablishedIPv6", L"" WINDIVERT_DEVICE_NAME L" filter flow established (IPv6)", - {0}, - {0}, + &FWPM_LAYER_ALE_FLOW_ESTABLISHED_V6, + &WINDIVERT_SUBLAYER_FLOW_ESTABLISHED_IPV6_GUID, windivert_flow_established_v6_classify, windivert_flow_delete_notify, 0 }; -static layer_t layer_flow_established_ipv6 = &layer_flow_established_ipv6_0; +#define WINDIVERT_LAYER_FLOW_ESTABLISHED_IPV6 \ + (&windivert_layer_flow_established_ipv6) /* * Shared functions. @@ -865,62 +876,6 @@ extern NTSTATUS DriverEntry(IN PDRIVER_OBJECT driver_obj, counts_per_ms = freq.QuadPart / 1000; counts_per_ms = (counts_per_ms == 0? 1: counts_per_ms); - // Initialize the layers. - layer_inbound_network_ipv4->layer_guid = FWPM_LAYER_INBOUND_IPPACKET_V4; - layer_outbound_network_ipv4->layer_guid = FWPM_LAYER_OUTBOUND_IPPACKET_V4; - layer_inbound_network_ipv6->layer_guid = FWPM_LAYER_INBOUND_IPPACKET_V6; - layer_outbound_network_ipv6->layer_guid = FWPM_LAYER_OUTBOUND_IPPACKET_V6; - layer_forward_network_ipv4->layer_guid = FWPM_LAYER_IPFORWARD_V4; - layer_forward_network_ipv6->layer_guid = FWPM_LAYER_IPFORWARD_V6; - layer_flow_established_ipv4->layer_guid = - FWPM_LAYER_ALE_FLOW_ESTABLISHED_V4; - layer_flow_established_ipv6->layer_guid = - FWPM_LAYER_ALE_FLOW_ESTABLISHED_V6; - layer_resource_assignment_ipv4->layer_guid = - FWPM_LAYER_ALE_RESOURCE_ASSIGNMENT_V4; - layer_resource_assignment_ipv6->layer_guid = - FWPM_LAYER_ALE_RESOURCE_ASSIGNMENT_V6; - layer_auth_connect_ipv4->layer_guid = FWPM_LAYER_ALE_AUTH_CONNECT_V4; - layer_auth_connect_ipv6->layer_guid = FWPM_LAYER_ALE_AUTH_CONNECT_V6; - layer_auth_listen_ipv4->layer_guid = FWPM_LAYER_ALE_AUTH_LISTEN_V4; - layer_auth_listen_ipv6->layer_guid = FWPM_LAYER_ALE_AUTH_LISTEN_V6; - layer_auth_recv_accept_ipv4->layer_guid = - FWPM_LAYER_ALE_AUTH_RECV_ACCEPT_V4; - layer_auth_recv_accept_ipv6->layer_guid = - FWPM_LAYER_ALE_AUTH_RECV_ACCEPT_V6; - layer_inbound_network_ipv4->sublayer_guid = - WINDIVERT_SUBLAYER_INBOUND_IPV4_GUID; - layer_outbound_network_ipv4->sublayer_guid = - WINDIVERT_SUBLAYER_OUTBOUND_IPV4_GUID; - layer_inbound_network_ipv6->sublayer_guid = - WINDIVERT_SUBLAYER_INBOUND_IPV6_GUID; - layer_outbound_network_ipv6->sublayer_guid = - WINDIVERT_SUBLAYER_OUTBOUND_IPV6_GUID; - layer_forward_network_ipv4->sublayer_guid = - WINDIVERT_SUBLAYER_FORWARD_IPV4_GUID; - layer_forward_network_ipv6->sublayer_guid = - WINDIVERT_SUBLAYER_FORWARD_IPV6_GUID; - layer_flow_established_ipv4->sublayer_guid = - WINDIVERT_SUBLAYER_FLOW_ESTABLISHED_IPV4_GUID; - layer_flow_established_ipv6->sublayer_guid = - WINDIVERT_SUBLAYER_FLOW_ESTABLISHED_IPV6_GUID; - layer_resource_assignment_ipv4->sublayer_guid = - WINDIVERT_SUBLAYER_RESOURCE_ASSIGNMENT_IPV4_GUID; - layer_resource_assignment_ipv6->sublayer_guid = - WINDIVERT_SUBLAYER_RESOURCE_ASSIGNMENT_IPV6_GUID; - layer_auth_connect_ipv4->sublayer_guid = - WINDIVERT_SUBLAYER_AUTH_CONNECT_IPV4_GUID; - layer_auth_connect_ipv6->sublayer_guid = - WINDIVERT_SUBLAYER_AUTH_CONNECT_IPV6_GUID; - layer_auth_listen_ipv4->sublayer_guid = - WINDIVERT_SUBLAYER_AUTH_LISTEN_IPV4_GUID; - layer_auth_listen_ipv6->sublayer_guid = - WINDIVERT_SUBLAYER_AUTH_LISTEN_IPV6_GUID; - layer_auth_recv_accept_ipv4->sublayer_guid = - WINDIVERT_SUBLAYER_AUTH_RECV_ACCEPT_IPV4_GUID; - layer_auth_recv_accept_ipv6->sublayer_guid = - WINDIVERT_SUBLAYER_AUTH_RECV_ACCEPT_IPV6_GUID; - // Configure ourself as a non-PnP driver: WDF_DRIVER_CONFIG_INIT(&config, WDF_NO_EVENT_CALLBACK); config.DriverInitFlags |= WdfDriverInitNonPnpDriver; @@ -1057,7 +1012,7 @@ extern NTSTATUS DriverEntry(IN PDRIVER_OBJECT driver_obj, DEBUG_ERROR("failed to begin WFP transaction", status); goto driver_entry_exit; } - status = windivert_install_sublayer(layer_inbound_network_ipv4); + status = windivert_install_sublayer(WINDIVERT_LAYER_INBOUND_NETWORK_IPV4); if (!NT_SUCCESS(status)) { driver_entry_sublayer_error: @@ -1065,77 +1020,79 @@ driver_entry_sublayer_error: FwpmTransactionAbort0(engine_handle); goto driver_entry_exit; } - status = windivert_install_sublayer(layer_outbound_network_ipv4); + status = windivert_install_sublayer(WINDIVERT_LAYER_OUTBOUND_NETWORK_IPV4); if (!NT_SUCCESS(status)) { goto driver_entry_sublayer_error; } - status = windivert_install_sublayer(layer_inbound_network_ipv6); + status = windivert_install_sublayer(WINDIVERT_LAYER_INBOUND_NETWORK_IPV6); if (!NT_SUCCESS(status)) { goto driver_entry_sublayer_error; } - status = windivert_install_sublayer(layer_outbound_network_ipv6); + status = windivert_install_sublayer(WINDIVERT_LAYER_OUTBOUND_NETWORK_IPV6); if (!NT_SUCCESS(status)) { goto driver_entry_sublayer_error; } - status = windivert_install_sublayer(layer_forward_network_ipv4); + status = windivert_install_sublayer(WINDIVERT_LAYER_FORWARD_NETWORK_IPV4); if (!NT_SUCCESS(status)) { goto driver_entry_sublayer_error; } - status = windivert_install_sublayer(layer_forward_network_ipv6); + status = windivert_install_sublayer(WINDIVERT_LAYER_FORWARD_NETWORK_IPV6); if (!NT_SUCCESS(status)) { goto driver_entry_sublayer_error; } - status = windivert_install_sublayer(layer_flow_established_ipv4); + status = windivert_install_sublayer(WINDIVERT_LAYER_FLOW_ESTABLISHED_IPV4); if (!NT_SUCCESS(status)) { goto driver_entry_sublayer_error; } - status = windivert_install_sublayer(layer_flow_established_ipv6); + status = windivert_install_sublayer(WINDIVERT_LAYER_FLOW_ESTABLISHED_IPV6); if (!NT_SUCCESS(status)) { goto driver_entry_sublayer_error; } - status = windivert_install_sublayer(layer_resource_assignment_ipv4); + status = windivert_install_sublayer( + WINDIVERT_LAYER_RESOURCE_ASSIGNMENT_IPV4); if (!NT_SUCCESS(status)) { goto driver_entry_sublayer_error; } - status = windivert_install_sublayer(layer_resource_assignment_ipv6); + status = windivert_install_sublayer( + WINDIVERT_LAYER_RESOURCE_ASSIGNMENT_IPV6); if (!NT_SUCCESS(status)) { goto driver_entry_sublayer_error; } - status = windivert_install_sublayer(layer_auth_connect_ipv4); + status = windivert_install_sublayer(WINDIVERT_LAYER_AUTH_CONNECT_IPV4); if (!NT_SUCCESS(status)) { goto driver_entry_sublayer_error; } - status = windivert_install_sublayer(layer_auth_connect_ipv6); + status = windivert_install_sublayer(WINDIVERT_LAYER_AUTH_CONNECT_IPV6); if (!NT_SUCCESS(status)) { goto driver_entry_sublayer_error; } - status = windivert_install_sublayer(layer_auth_listen_ipv4); + status = windivert_install_sublayer(WINDIVERT_LAYER_AUTH_LISTEN_IPV4); if (!NT_SUCCESS(status)) { goto driver_entry_sublayer_error; } - status = windivert_install_sublayer(layer_auth_listen_ipv6); + status = windivert_install_sublayer(WINDIVERT_LAYER_AUTH_LISTEN_IPV6); if (!NT_SUCCESS(status)) { goto driver_entry_sublayer_error; } - status = windivert_install_sublayer(layer_auth_recv_accept_ipv4); + status = windivert_install_sublayer(WINDIVERT_LAYER_AUTH_RECV_ACCEPT_IPV4); if (!NT_SUCCESS(status)) { goto driver_entry_sublayer_error; } - status = windivert_install_sublayer(layer_auth_recv_accept_ipv6); + status = windivert_install_sublayer(WINDIVERT_LAYER_AUTH_RECV_ACCEPT_IPV6); if (!NT_SUCCESS(status)) { goto driver_entry_sublayer_error; @@ -1206,37 +1163,37 @@ static void windivert_driver_unload(void) return; } FwpmSubLayerDeleteByKey0(engine_handle, - &layer_inbound_network_ipv4->sublayer_guid); + WINDIVERT_LAYER_INBOUND_NETWORK_IPV4->sublayer_guid); FwpmSubLayerDeleteByKey0(engine_handle, - &layer_outbound_network_ipv4->sublayer_guid); + WINDIVERT_LAYER_OUTBOUND_NETWORK_IPV4->sublayer_guid); FwpmSubLayerDeleteByKey0(engine_handle, - &layer_inbound_network_ipv6->sublayer_guid); + WINDIVERT_LAYER_INBOUND_NETWORK_IPV6->sublayer_guid); FwpmSubLayerDeleteByKey0(engine_handle, - &layer_outbound_network_ipv6->sublayer_guid); + WINDIVERT_LAYER_OUTBOUND_NETWORK_IPV6->sublayer_guid); FwpmSubLayerDeleteByKey0(engine_handle, - &layer_forward_network_ipv4->sublayer_guid); + WINDIVERT_LAYER_FORWARD_NETWORK_IPV4->sublayer_guid); FwpmSubLayerDeleteByKey0(engine_handle, - &layer_forward_network_ipv6->sublayer_guid); + WINDIVERT_LAYER_FORWARD_NETWORK_IPV6->sublayer_guid); FwpmSubLayerDeleteByKey0(engine_handle, - &layer_flow_established_ipv4->sublayer_guid); + WINDIVERT_LAYER_FLOW_ESTABLISHED_IPV4->sublayer_guid); FwpmSubLayerDeleteByKey0(engine_handle, - &layer_flow_established_ipv6->sublayer_guid); + WINDIVERT_LAYER_FLOW_ESTABLISHED_IPV6->sublayer_guid); FwpmSubLayerDeleteByKey0(engine_handle, - &layer_resource_assignment_ipv4->sublayer_guid); + WINDIVERT_LAYER_RESOURCE_ASSIGNMENT_IPV4->sublayer_guid); FwpmSubLayerDeleteByKey0(engine_handle, - &layer_resource_assignment_ipv6->sublayer_guid); + WINDIVERT_LAYER_RESOURCE_ASSIGNMENT_IPV6->sublayer_guid); FwpmSubLayerDeleteByKey0(engine_handle, - &layer_auth_connect_ipv4->sublayer_guid); + WINDIVERT_LAYER_AUTH_CONNECT_IPV4->sublayer_guid); FwpmSubLayerDeleteByKey0(engine_handle, - &layer_auth_connect_ipv6->sublayer_guid); + WINDIVERT_LAYER_AUTH_CONNECT_IPV6->sublayer_guid); FwpmSubLayerDeleteByKey0(engine_handle, - &layer_auth_listen_ipv4->sublayer_guid); + WINDIVERT_LAYER_AUTH_LISTEN_IPV4->sublayer_guid); FwpmSubLayerDeleteByKey0(engine_handle, - &layer_auth_listen_ipv6->sublayer_guid); + WINDIVERT_LAYER_AUTH_LISTEN_IPV6->sublayer_guid); FwpmSubLayerDeleteByKey0(engine_handle, - &layer_auth_recv_accept_ipv4->sublayer_guid); + WINDIVERT_LAYER_AUTH_RECV_ACCEPT_IPV4->sublayer_guid); FwpmSubLayerDeleteByKey0(engine_handle, - &layer_auth_recv_accept_ipv6->sublayer_guid); + WINDIVERT_LAYER_AUTH_RECV_ACCEPT_IPV6->sublayer_guid); status = FwpmTransactionCommit0(engine_handle); if (!NT_SUCCESS(status)) { @@ -1255,7 +1212,7 @@ static NTSTATUS windivert_install_sublayer(layer_t layer) NTSTATUS status; RtlZeroMemory(&sublayer, sizeof(sublayer)); - sublayer.subLayerKey = layer->sublayer_guid; + sublayer.subLayerKey = *(layer->sublayer_guid); sublayer.displayData.name = layer->sublayer_name; sublayer.displayData.description = layer->sublayer_desc; sublayer.weight = layer->sublayer_weight; @@ -1301,11 +1258,7 @@ extern VOID windivert_create(IN WDFDEVICE device, IN WDFREQUEST request, context->flags = 0; context->priority = windivert_context_priority(WINDIVERT_PRIORITY_DEFAULT); context->filter = NULL; - for (i = 0; i < WINDIVERT_CONTEXT_MAXWORKERS; i++) - { - context->workers[i] = NULL; - } - context->worker_curr = 0; + context->worker = NULL; for (i = 0; i < WINDIVERT_CONTEXT_MAXLAYERS; i++) { context->installed[i] = FALSE; @@ -1343,15 +1296,11 @@ extern VOID windivert_create(IN WDFDEVICE device, IN WDFREQUEST request, item_config.AutomaticSerialization = FALSE; WDF_OBJECT_ATTRIBUTES_INIT(&obj_attrs); obj_attrs.ParentObject = (WDFOBJECT)object; - for (i = 0; i < WINDIVERT_CONTEXT_MAXWORKERS; i++) + status = WdfWorkItemCreate(&item_config, &obj_attrs, &context->worker); + if (!NT_SUCCESS(status)) { - status = WdfWorkItemCreate(&item_config, &obj_attrs, - context->workers + i); - if (!NT_SUCCESS(status)) - { - DEBUG_ERROR("failed to create read service work item", status); - goto windivert_create_exit; - } + DEBUG_ERROR("failed to create read service work item", status); + goto windivert_create_exit; } RtlZeroMemory(&session, sizeof(session)); session.flags |= FWPM_SESSION_FLAG_DYNAMIC; @@ -1374,12 +1323,9 @@ windivert_create_exit: { WdfObjectDelete(context->read_queue); } - for (i = 0; i < WINDIVERT_CONTEXT_MAXWORKERS; i++) + if (context->worker != NULL) { - if (context->workers[i] != NULL) - { - WdfObjectDelete(context->workers[i]); - } + WdfObjectDelete(context->worker); } if (context->engine_handle != NULL) { @@ -1413,30 +1359,30 @@ static NTSTATUS windivert_install_callouts(context_t context, UINT8 layer, case WINDIVERT_LAYER_NETWORK: if (inbound && ipv4) { - layers[i++] = layer_inbound_network_ipv4; + layers[i++] = WINDIVERT_LAYER_INBOUND_NETWORK_IPV4; } if (outbound && ipv4) { - layers[i++] = layer_outbound_network_ipv4; + layers[i++] = WINDIVERT_LAYER_OUTBOUND_NETWORK_IPV4; } if (inbound && ipv6) { - layers[i++] = layer_inbound_network_ipv6; + layers[i++] = WINDIVERT_LAYER_INBOUND_NETWORK_IPV6; } if (outbound && ipv6) { - layers[i++] = layer_outbound_network_ipv6; + layers[i++] = WINDIVERT_LAYER_OUTBOUND_NETWORK_IPV6; } break; case WINDIVERT_LAYER_NETWORK_FORWARD: if (ipv4) { - layers[i++] = layer_forward_network_ipv4; + layers[i++] = WINDIVERT_LAYER_FORWARD_NETWORK_IPV4; } if (ipv6) { - layers[i++] = layer_forward_network_ipv6; + layers[i++] = WINDIVERT_LAYER_FORWARD_NETWORK_IPV6; } break; @@ -1444,29 +1390,29 @@ static NTSTATUS windivert_install_callouts(context_t context, UINT8 layer, if (ipv4) { callout_ids[i] = &context->flow_v4_callout_id; - layers[i++] = layer_flow_established_ipv4; + layers[i++] = WINDIVERT_LAYER_FLOW_ESTABLISHED_IPV4; } if (ipv6) { callout_ids[i] = &context->flow_v6_callout_id; - layers[i++] = layer_flow_established_ipv6; + layers[i++] = WINDIVERT_LAYER_FLOW_ESTABLISHED_IPV6; } break; case WINDIVERT_LAYER_SOCKET: if (ipv4) { - layers[i++] = layer_resource_assignment_ipv4; - layers[i++] = layer_auth_connect_ipv4; - layers[i++] = layer_auth_listen_ipv4; - layers[i++] = layer_auth_recv_accept_ipv4; + layers[i++] = WINDIVERT_LAYER_RESOURCE_ASSIGNMENT_IPV4; + layers[i++] = WINDIVERT_LAYER_AUTH_CONNECT_IPV4; + layers[i++] = WINDIVERT_LAYER_AUTH_LISTEN_IPV4; + layers[i++] = WINDIVERT_LAYER_AUTH_RECV_ACCEPT_IPV4; } if (ipv6) { - layers[i++] = layer_resource_assignment_ipv6; - layers[i++] = layer_auth_connect_ipv6; - layers[i++] = layer_auth_listen_ipv6; - layers[i++] = layer_auth_recv_accept_ipv6; + layers[i++] = WINDIVERT_LAYER_RESOURCE_ASSIGNMENT_IPV6; + layers[i++] = WINDIVERT_LAYER_AUTH_CONNECT_IPV6; + layers[i++] = WINDIVERT_LAYER_AUTH_LISTEN_IPV6; + layers[i++] = WINDIVERT_LAYER_AUTH_RECV_ACCEPT_IPV6; } break; @@ -1540,15 +1486,15 @@ static NTSTATUS windivert_install_callout(context_t context, UINT idx, mcallout.calloutKey = callout_guid; mcallout.displayData.name = layer->callout_name; mcallout.displayData.description = layer->callout_desc; - mcallout.applicableLayer = layer->layer_guid; + mcallout.applicableLayer = *(layer->layer_guid); RtlZeroMemory(&filter, sizeof(filter)); filter.filterKey = filter_guid; - filter.layerKey = layer->layer_guid; + filter.layerKey = *(layer->layer_guid); filter.displayData.name = layer->filter_name; filter.displayData.description = layer->filter_desc; filter.action.type = FWP_ACTION_CALLOUT_UNKNOWN; filter.action.calloutKey = callout_guid; - filter.subLayerKey = layer->sublayer_guid; + filter.subLayerKey = *(layer->sublayer_guid); filter.weight.type = FWP_UINT64; filter.weight.uint64 = &weight; filter.rawContext = (UINT64)context; @@ -1816,18 +1762,15 @@ windivert_cleanup_error: KeReleaseInStackQueuedSpinLock(&lock_handle); WdfIoQueuePurge(read_queue, NULL, NULL); WdfObjectDelete(read_queue); - for (i = 0; i < WINDIVERT_CONTEXT_MAXWORKERS; i++) + KeAcquireInStackQueuedSpinLock(&context->lock, &lock_handle); + if (context->state != WINDIVERT_CONTEXT_STATE_CLOSING) { - KeAcquireInStackQueuedSpinLock(&context->lock, &lock_handle); - if (context->state != WINDIVERT_CONTEXT_STATE_CLOSING) - { - goto windivert_cleanup_error; - } - worker = context->workers[i]; - KeReleaseInStackQueuedSpinLock(&lock_handle); - WdfWorkItemFlush(worker); - WdfObjectDelete(worker); + goto windivert_cleanup_error; } + worker = context->worker; + KeReleaseInStackQueuedSpinLock(&lock_handle); + WdfWorkItemFlush(worker); + WdfObjectDelete(worker); } /* @@ -1860,7 +1803,7 @@ extern VOID windivert_destroy(IN WDFOBJECT object) { KLOCK_QUEUE_HANDLE lock_handle; context_t context = windivert_context_get((WDFFILEOBJECT)object); - PWINDIVERT_FILTER filter; + const WINDIVERT_FILTER *filter; NTSTATUS status; DEBUG("DESTROY: destroying WinDivert context (context=%p)", context); @@ -1877,7 +1820,7 @@ extern VOID windivert_destroy(IN WDFOBJECT object) KeReleaseInStackQueuedSpinLock(&lock_handle); windivert_uninstall_callouts(context, WINDIVERT_CONTEXT_STATE_CLOSED); FwpmEngineClose0(context->engine_handle); - windivert_free(filter); + windivert_free((PVOID)filter); } /* @@ -2603,10 +2546,9 @@ extern VOID windivert_ioctl(IN WDFQUEUE queue, IN WDFREQUEST request, { KLOCK_QUEUE_HANDLE lock_handle; PCHAR inbuf, outbuf; - size_t inbuflen, outbuflen, filter0_len; + size_t inbuflen, outbuflen, ioctl_filter_len; PWINDIVERT_IOCTL ioctl; - PWINDIVERT_FILTER filter0; - PWINDIVERT_FILTER filter; + const WINDIVERT_FILTER *ioctl_filter, *filter; UINT8 layer; INT16 priority; UINT64 flags; @@ -2688,7 +2630,7 @@ extern VOID windivert_ioctl(IN WDFQUEUE queue, IN WDFREQUEST request, { windivert_ioctl_bad_start_state: KeReleaseInStackQueuedSpinLock(&lock_handle); - windivert_free(filter); + windivert_free((PVOID)filter); status = STATUS_INVALID_DEVICE_STATE; goto windivert_ioctl_exit; } @@ -2696,16 +2638,17 @@ windivert_ioctl_bad_start_state: layer = context->layer; KeReleaseInStackQueuedSpinLock(&lock_handle); - filter0 = (PWINDIVERT_FILTER)outbuf; - filter0_len = outbuflen; - filter = windivert_filter_compile(filter0, filter0_len, layer); + ioctl_filter = (const WINDIVERT_FILTER *)outbuf; + ioctl_filter_len = outbuflen; + filter = windivert_filter_compile(ioctl_filter, ioctl_filter_len, + layer); if (filter == NULL) { status = STATUS_INVALID_PARAMETER; DEBUG_ERROR("failed to compile filter", status); goto windivert_ioctl_exit; } - filter_len = filter0_len / sizeof(WINDIVERT_FILTER); + filter_len = ioctl_filter_len / sizeof(WINDIVERT_FILTER); irp = WdfRequestWdmGetIrp(request); process_id = (UINT32)IoGetRequestorProcessId(irp); timestamp = KeQueryPerformanceCounter(NULL).QuadPart; @@ -3229,7 +3172,7 @@ static void windivert_network_classify(context_t context, BOOL impostor, sniff_mode, ok; WDFOBJECT object; PLIST_ENTRY old_entry; - PWINDIVERT_FILTER filter; + const WINDIVERT_FILTER *filter; LONGLONG timestamp; NTSTATUS status; @@ -3498,7 +3441,7 @@ static void windivert_flow_established_classify(context_t context, UINT16 layer_id; BOOL match, ok; WDFOBJECT object; - PWINDIVERT_FILTER filter; + const WINDIVERT_FILTER *filter; LONGLONG timestamp; flow_t flow; NTSTATUS status; @@ -3614,7 +3557,7 @@ static void windivert_flow_delete_notify(UINT16 layer_id, UINT32 callout_id, BOOL match, cleanup; WDFOBJECT object; context_t context; - PWINDIVERT_FILTER filter; + const WINDIVERT_FILTER *filter; LONGLONG timestamp; flow_t flow; @@ -3943,7 +3886,7 @@ static void windivert_socket_classify(context_t context, UINT64 flags; BOOL match, ok; WDFOBJECT object; - PWINDIVERT_FILTER filter; + const WINDIVERT_FILTER *filter; LONGLONG timestamp; NTSTATUS status; @@ -4193,9 +4136,7 @@ static BOOL windivert_queue_work(context_t context, PVOID packet, context->work_queue_length--; } InsertTailList(&context->work_queue, &work->entry); - WdfWorkItemEnqueue(context->workers[context->worker_curr]); - context->worker_curr = - (context->worker_curr + 1) % WINDIVERT_CONTEXT_MAXWORKERS; + WdfWorkItemEnqueue(context->worker); KeReleaseInStackQueuedSpinLock(&lock_handle); if (old_entry != NULL) @@ -4698,8 +4639,8 @@ static BOOL windivert_parse_headers(PNET_BUFFER buffer, BOOL ipv4, * Checks if the given network packet is of interest. */ static BOOL windivert_filter(PNET_BUFFER buffer, WINDIVERT_LAYER layer, - PVOID layer_data, WINDIVERT_EVENT event, BOOL ipv4, BOOL outbound, - BOOL loopback, BOOL impostor, PWINDIVERT_FILTER filter) + const VOID *layer_data, WINDIVERT_EVENT event, BOOL ipv4, BOOL outbound, + BOOL loopback, BOOL impostor, const WINDIVERT_FILTER *filter) { PWINDIVERT_IPHDR ip_header = NULL; PWINDIVERT_IPV6HDR ipv6_header = NULL; @@ -5437,8 +5378,8 @@ static BOOL windivert_filter(PNET_BUFFER buffer, WINDIVERT_LAYER layer, /* * Compile a WinDivert filter from an IOCTL. */ -static PWINDIVERT_FILTER windivert_filter_compile( - PWINDIVERT_FILTER ioctl_filter, size_t ioctl_filter_len, +static const WINDIVERT_FILTER *windivert_filter_compile( + const WINDIVERT_FILTER *ioctl_filter, size_t ioctl_filter_len, WINDIVERT_LAYER layer) { PWINDIVERT_FILTER filter = NULL; @@ -5693,7 +5634,7 @@ static PWINDIVERT_FILTER windivert_filter_compile( windivert_filter_compile_error: - windivert_free(filter); + windivert_free((PVOID)filter); return NULL; } @@ -5829,7 +5770,7 @@ static PWINDIVERT_IPHDR windivert_reflect_pseudo_packet(context_t context, UINT16 total_len; UINT8 *packet; char *object; - PWINDIVERT_FILTER filter; + const WINDIVERT_FILTER *filter; UINT8 filter_len; PWINDIVERT_IPHDR iphdr; WINDIVERT_STREAM stream; @@ -5876,7 +5817,7 @@ static void windivert_reflect_event_notify(context_t context, KLOCK_QUEUE_HANDLE lock_handle; PLIST_ENTRY entry; context_t waiter; - PWINDIVERT_FILTER filter; + const WINDIVERT_FILTER *filter; PWINDIVERT_IPHDR packet = NULL; ULONG packet_len; BOOL match; @@ -5919,7 +5860,7 @@ static void windivert_reflect_established_notify(context_t context, PLIST_ENTRY entry; BOOL match, ok, final; context_t waiter; - PWINDIVERT_FILTER filter; + const WINDIVERT_FILTER *filter; PWINDIVERT_IPHDR packet; ULONG packet_len;