diff --git a/CHANGELOG b/CHANGELOG index d54f0f0..959d369 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -58,3 +58,6 @@ WinDivert 1.1.7 * WinDivert driver now calculates checksums for IPV6 packets. * WinDivert can now handle IPV6 extension headers. * Fixed WinDivertHelperParseIPv6Address(). +WinDivert 1.1.8 + - Fix ip.TOS handling bug. + - Fix IPv6 comparison bug. diff --git a/VERSION b/VERSION index 2bf1ca5..18efdb9 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.1.7 +1.1.8 diff --git a/sys/windivert.c b/sys/windivert.c index b22de73..f7e2b25 100644 --- a/sys/windivert.c +++ b/sys/windivert.c @@ -2764,6 +2764,46 @@ static void windivert_update_checksums(void *header, size_t len, } } +/* + * Big number comparison. + */ +static int windivert_big_num_compare(const UINT32 *a, const UINT32 *b) +{ + if (a[3] < b[3]) + { + return -1; + } + if (a[3] > b[3]) + { + return 1; + } + if (a[2] < b[2]) + { + return -1; + } + if (a[2] > b[2]) + { + return 1; + } + if (a[1] < b[1]) + { + return -1; + } + if (a[1] > b[1]) + { + return 1; + } + if (a[0] < b[0]) + { + return -1; + } + if (a[0] > b[0]) + { + return 1; + } + return 0; +} + /* * Checks if the given packet is of interest. */ @@ -2926,6 +2966,7 @@ static BOOL windivert_filter(PNET_BUFFER buffer, UINT32 if_idx, while (ttl-- != 0) { BOOL result; + int cmp; UINT32 field[4]; field[1] = 0; field[2] = 0; @@ -2998,7 +3039,7 @@ static BOOL windivert_filter(PNET_BUFFER buffer, UINT32 if_idx, field[0] = (UINT32)ip_header->HdrLength; break; case WINDIVERT_FILTER_FIELD_IP_TOS: - field[0] = (UINT32)RtlUshortByteSwap(ip_header->TOS); + field[0] = (UINT32)ip_header->TOS; break; case WINDIVERT_FILTER_FIELD_IP_LENGTH: field[0] = (UINT32)RtlUshortByteSwap(ip_header->Length); @@ -3160,55 +3201,26 @@ static BOOL windivert_filter(PNET_BUFFER buffer, UINT32 if_idx, field[0] = 0; break; } + cmp = windivert_big_num_compare(field, filter[ip].arg); switch (filter[ip].test) { case WINDIVERT_FILTER_TEST_EQ: - result = (field[0] == filter[ip].arg[0] && - field[1] == filter[ip].arg[1] && - field[2] == filter[ip].arg[2] && - field[3] == filter[ip].arg[3]); + result = (cmp == 0); break; case WINDIVERT_FILTER_TEST_NEQ: - result = (field[0] != filter[ip].arg[0] || - field[1] != filter[ip].arg[1] || - field[2] != filter[ip].arg[2] || - field[3] != filter[ip].arg[3]); + result = (cmp != 0); break; case WINDIVERT_FILTER_TEST_LT: - result = (field[3] < filter[ip].arg[3] || - (field[3] == filter[ip].arg[3] && - field[2] < filter[ip].arg[2] || - (field[2] == filter[ip].arg[2] && - field[1] < filter[ip].arg[1] || - (field[1] == filter[ip].arg[1] && - field[0] < filter[ip].arg[0])))); + result = (cmp < 0); break; case WINDIVERT_FILTER_TEST_LEQ: - result = (field[3] < filter[ip].arg[3] || - (field[3] == filter[ip].arg[3] && - field[2] < filter[ip].arg[2] || - (field[2] == filter[ip].arg[2] && - field[1] < filter[ip].arg[1] || - (field[1] == filter[ip].arg[1] && - field[0] <= filter[ip].arg[0])))); + result = (cmp <= 0); break; case WINDIVERT_FILTER_TEST_GT: - result = (field[3] > filter[ip].arg[3] || - (field[3] == filter[ip].arg[3] && - field[2] > filter[ip].arg[2] || - (field[2] == filter[ip].arg[2] && - field[1] > filter[ip].arg[1] || - (field[1] == filter[ip].arg[1] && - field[0] > filter[ip].arg[0])))); + result = (cmp > 0); break; case WINDIVERT_FILTER_TEST_GEQ: - result = (field[3] > filter[ip].arg[3] || - (field[3] == filter[ip].arg[3] && - field[2] > filter[ip].arg[2] || - (field[2] == filter[ip].arg[2] && - field[1] > filter[ip].arg[1] || - (field[1] == filter[ip].arg[1] && - field[0] >= filter[ip].arg[0])))); + result = (cmp >= 0); break; default: result = FALSE; @@ -3465,6 +3477,7 @@ static filter_t windivert_filter_compile(windivert_ioctl_filter_t ioctl_filter, goto windivert_filter_compile_exit; } break; + case WINDIVERT_FILTER_FIELD_IP_TOS: case WINDIVERT_FILTER_FIELD_IP_TTL: case WINDIVERT_FILTER_FIELD_IP_PROTOCOL: case WINDIVERT_FILTER_FIELD_IPV6_TRAFFICCLASS: @@ -3485,7 +3498,6 @@ static filter_t windivert_filter_compile(windivert_ioctl_filter_t ioctl_filter, goto windivert_filter_compile_exit; } break; - case WINDIVERT_FILTER_FIELD_IP_TOS: case WINDIVERT_FILTER_FIELD_IP_LENGTH: case WINDIVERT_FILTER_FIELD_IP_ID: case WINDIVERT_FILTER_FIELD_IP_CHECKSUM: diff --git a/sys/windivert.rc b/sys/windivert.rc index 6c9031d..28da292 100644 --- a/sys/windivert.rc +++ b/sys/windivert.rc @@ -27,10 +27,10 @@ " (donate: 1C5vZVSbizPeZ8ydTYhUfm4LA2cNwBfcYh)" #define VER_INTERNALNAME_STR "WinDivert.sys" #define VER_ORIGINALFILENAME_STR "WinDivert.sys" -#define VER_PRODUCTVERSION 1.1.7 -#define VER_PRODUCTVERSION_STR "1.1.7" +#define VER_PRODUCTVERSION 1.1.8 +#define VER_PRODUCTVERSION_STR "1.1.8" #define VER_COMPANYNAME_STR "Basil" -#define VER_LEGALCOPYRIGHT_YEARS "2011-2014" +#define VER_LEGALCOPYRIGHT_YEARS "2011-2015" #define VER_LEGALCOPYRIGHT_STR \ "Copyright \251 " VER_COMPANYNAME_STR " " VER_LEGALCOPYRIGHT_YEARS #define VER_FILEVERSION VER_PRODUCTVERSION