From 2307347070e40f9106dc3e3ee3b8984e698b52c4 Mon Sep 17 00:00:00 2001 From: basil00 Date: Fri, 8 Mar 2019 09:24:31 +0800 Subject: [PATCH] Use C-string-friendly chars for filter objects. --- dll/windivert_helper.c | 65 +++++++++++++++++++++++++++++++++++------- dll/windivert_shared.c | 15 ++++++++-- 2 files changed, 67 insertions(+), 13 deletions(-) diff --git a/dll/windivert_helper.c b/dll/windivert_helper.c index 4bec8e0..3355433 100644 --- a/dll/windivert_helper.c +++ b/dll/windivert_helper.c @@ -3220,6 +3220,50 @@ static char WinDivertGetChar(PWINDIVERT_STREAM stream) return c; } +/* + * Decode a digit. + */ +static BOOL WinDivertDecodeDigit(char c, UINT8 *digit, BOOL *final) +{ + if (c >= '0' && c <= '9') + { + *digit = c - '0'; + *final = FALSE; + return TRUE; + } + if (c >= 'A' && c <= 'V') + { + *digit = c - 'A' + 10; + *final = FALSE; + return TRUE; + } + if (c >= 'W' && c <= 'Z') + { + *digit = c - 'W'; + *final = TRUE; + return TRUE; + } + if (c >= 'a' && c <= 'z') + { + *digit = c - 'a' + 4; + *final = TRUE; + return TRUE; + } + if (c == '+') + { + *digit = 30; + *final = TRUE; + return TRUE; + } + if (c == '=') + { + *digit = 31; + *final = TRUE; + return TRUE; + } + return FALSE; +} + /* * Deserialize a number. */ @@ -3227,7 +3271,10 @@ static BOOL WinDivertDeserializeNumber(PWINDIVERT_STREAM stream, UINT max_len, UINT32 *result) { UINT32 i, val = 0; + UINT8 digit; + BOOL final; char c; + for (i = 0; i < max_len; i++) { if ((val & 0xF8000000) != 0) @@ -3236,20 +3283,16 @@ static BOOL WinDivertDeserializeNumber(PWINDIVERT_STREAM stream, UINT max_len, } val <<= 5; c = WinDivertGetChar(stream); - if (c >= '!' && c <= '!' + 31) - { - val += (UINT32)(c - '!'); - } - else if (c >= '!' + 32 && c <= '!' + 64) - { - val += (UINT32)(c - '!' - 32); - *result = val; - return TRUE; - } - else + if (!WinDivertDecodeDigit(c, &digit, &final)) { return FALSE; } + val += digit; + if (final) + { + *result = val; + return TRUE; + } } return FALSE; } diff --git a/dll/windivert_shared.c b/dll/windivert_shared.c index 43e0a94..9f1b190 100644 --- a/dll/windivert_shared.c +++ b/dll/windivert_shared.c @@ -143,6 +143,16 @@ static void WinDivertPutNul(PWINDIVERT_STREAM stream) } } +/* + * Encode a digit. + */ +static char WinDivertEncodeDigit(UINT8 dig, BOOL final) +{ + static const char windivert_digits[64+1] = + "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz+="; + return windivert_digits[(dig & 0x1F) + (final? 32: 0)]; +} + /* * Serialize a number. */ @@ -150,6 +160,7 @@ static void WinDivertSerializeNumber(PWINDIVERT_STREAM stream, UINT32 val) { UINT64 mask = 0x00000007C0000000ull; UINT dig = 6; + UINT8 digit; UINT64 val64 = (UINT64)val; BOOL final; @@ -161,8 +172,8 @@ static void WinDivertSerializeNumber(PWINDIVERT_STREAM stream, UINT32 val) while (TRUE) { final = (dig == 0); - WinDivertPutChar(stream, '!' + (char)((mask & val64) >> (5 * dig)) + - (final? 32: 0)); + digit = (UINT8)((mask & val64) >> (5 * dig)); + WinDivertPutChar(stream, WinDivertEncodeDigit(digit, final)); if (final) { break;