Compare commits
1 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 92869a96c0 |
@@ -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.
|
||||
|
||||
+50
-38
@@ -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:
|
||||
|
||||
+3
-3
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user