Use C-string-friendly chars for filter objects.

This commit is contained in:
basil00
2019-03-08 09:24:31 +08:00
parent 3d4f52e2c0
commit 2307347070
2 changed files with 67 additions and 13 deletions
+54 -11
View File
@@ -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;
}
+13 -2
View File
@@ -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;