- Fix broken implementation of WinDivertHelperParseIPv6Address().

- Fix IPv6 address word/byte ordering between DLL and SYS.
This commit is contained in:
basil00
2014-11-15 15:06:16 +08:00
parent 72d83fcb07
commit 48075e2e5f
3 changed files with 22 additions and 18 deletions
+6 -3
View File
@@ -52,6 +52,9 @@ WinDivert 1.1.6
- WinDivert now searches for the driver files in the application's
directory (as opposed to the current directory).
WinDivert 1.1.7
- Fixed incorrect IPV6 TCP/UDP checksum calculation in
WinDivertHelperCalcChecksums().
- Driver now calculates checksums for IPV6 packets.
- Improved IPv6 support:
* Fixed incorrect IPV6 TCP/UDP checksum calculation in
WinDivertHelperCalcChecksums().
* WinDivert driver now calculates checksums for IPV6 packets.
* WinDivert can now handle IPV6 extension headers.
* Fixed WinDivertHelperParseIPv6Address().
+4 -3
View File
@@ -1891,11 +1891,11 @@ extern BOOL WinDivertHelperParseIPv6Address(const char *str, UINT32 *addr_ptr)
WinDivertAToX(part_str, NULL, &part);
if (!end)
{
addr[i] = (UINT16)ntohs(part);
addr[i] = (UINT16)part;
}
else
{
addr[j--] = (UINT16)ntohs(part);
addr[j--] = (UINT16)part;
}
if (*str == '\0')
{
@@ -1933,7 +1933,8 @@ extern BOOL WinDivertHelperParseIPv6Address(const char *str, UINT32 *addr_ptr)
{
for (i = 0; i < sizeof(addr) / sizeof(UINT32); i++)
{
addr_ptr[i] = addr[i];
addr_ptr[i] = (UINT32)addr[2 * i + 1] |
(UINT32)addr[2 * i];
}
}
+12 -12
View File
@@ -3049,23 +3049,23 @@ static BOOL windivert_filter(PNET_BUFFER buffer, UINT32 if_idx,
break;
case WINDIVERT_FILTER_FIELD_IPV6_SRCADDR:
field[0] =
(UINT32)RtlUlongByteSwap(ipv6_header->SrcAddr[3]);
field[1] =
(UINT32)RtlUlongByteSwap(ipv6_header->SrcAddr[2]);
field[2] =
(UINT32)RtlUlongByteSwap(ipv6_header->SrcAddr[1]);
field[3] =
(UINT32)RtlUlongByteSwap(ipv6_header->SrcAddr[0]);
field[1] =
(UINT32)RtlUlongByteSwap(ipv6_header->SrcAddr[1]);
field[2] =
(UINT32)RtlUlongByteSwap(ipv6_header->SrcAddr[2]);
field[3] =
(UINT32)RtlUlongByteSwap(ipv6_header->SrcAddr[3]);
break;
case WINDIVERT_FILTER_FIELD_IPV6_DSTADDR:
field[0] =
(UINT32)RtlUlongByteSwap(ipv6_header->DstAddr[3]);
field[1] =
(UINT32)RtlUlongByteSwap(ipv6_header->DstAddr[2]);
field[2] =
(UINT32)RtlUlongByteSwap(ipv6_header->DstAddr[1]);
field[3] =
(UINT32)RtlUlongByteSwap(ipv6_header->DstAddr[0]);
field[1] =
(UINT32)RtlUlongByteSwap(ipv6_header->DstAddr[1]);
field[2] =
(UINT32)RtlUlongByteSwap(ipv6_header->DstAddr[2]);
field[3] =
(UINT32)RtlUlongByteSwap(ipv6_header->DstAddr[3]);
break;
case WINDIVERT_FILTER_FIELD_ICMP_TYPE:
field[0] = (UINT32)icmp_header->Type;