Use C-string-friendly chars for filter objects.
This commit is contained in:
+54
-11
@@ -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
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user