Code cleanup & improve const correctness in API.

This commit is contained in:
basil00
2018-11-09 07:21:56 +08:00
parent 33a461eef6
commit 084c78e4af
6 changed files with 247 additions and 299 deletions
+8 -7
View File
@@ -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);
}
}
+6 -6
View File
@@ -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;
+3 -3
View File
@@ -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))];
+12 -12
View File
@@ -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.
+14 -8
View File
@@ -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 */
+204 -263
View File
@@ -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;