From c2a5965d39ab5f841bdbda0d5711c85aacd71bf5 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Sun, 20 Nov 2011 21:37:16 +0000 Subject: [PATCH] [NDIS] - Print debugging information if a mismatch occurs between requested and returned parameter types - Print debugging information if a registry read returns a type that NDIS doesn't handle - Ensure that all digits are less than the base during conversion from string to integer (otherwise it's a string) svn path=/trunk/; revision=54464 --- reactos/drivers/network/ndis/ndis/config.c | 29 +++++++++++++++++++--- 1 file changed, 25 insertions(+), 4 deletions(-) diff --git a/reactos/drivers/network/ndis/ndis/config.c b/reactos/drivers/network/ndis/ndis/config.c index 6aea7dfa79c..f3248293cff 100644 --- a/reactos/drivers/network/ndis/ndis/config.c +++ b/reactos/drivers/network/ndis/ndis/config.c @@ -68,6 +68,8 @@ NdisWriteConfiguration( WCHAR Buff[11]; NDIS_DbgPrint(MAX_TRACE, ("Called.\n")); + + NDIS_DbgPrint(MID_TRACE, ("Parameter type: %d\n", ParameterValue->ParameterType)); /* reset parameter type to standard reg types */ switch(ParameterValue->ParameterType) @@ -373,7 +375,7 @@ IsValidNumericString(PNDIS_STRING String, NDIS_PARAMETER_TYPE *ParameterType) * TRUE if it is valid, FALSE if not */ { - ULONG i; + ULONG i, Base; /* I don't think this will ever happen, but we warn it if it does */ if (String->Length == 0) @@ -384,6 +386,7 @@ IsValidNumericString(PNDIS_STRING String, NDIS_PARAMETER_TYPE *ParameterType) /* Set the default parameter type */ *ParameterType = NdisParameterInteger; + Base = 10; for (i = 0; i < String->Length / sizeof(WCHAR); i++) { @@ -395,6 +398,7 @@ IsValidNumericString(PNDIS_STRING String, NDIS_PARAMETER_TYPE *ParameterType) { NDIS_DbgPrint(MID_TRACE, ("Identified hex string\n")); *ParameterType = NdisParameterHexInteger; + Base = 0x10; continue; } } @@ -403,8 +407,8 @@ IsValidNumericString(PNDIS_STRING String, NDIS_PARAMETER_TYPE *ParameterType) if (String->Buffer[i] == UNICODE_NULL) continue; - /* Make sure the character is valid for a numeric string */ - if (UnicodeToHexByte(String->Buffer[i]) == 0xFF) + /* Make sure the character is valid for a numeric string of this base */ + if (UnicodeToHexByte(String->Buffer[i]) >= Base) return FALSE; } @@ -449,6 +453,7 @@ NdisReadConfiguration( *Status = NDIS_STATUS_FAILURE; NDIS_DbgPrint(MAX_TRACE,("requested read of %wZ\n", Keyword)); + NDIS_DbgPrint(MID_TRACE,("requested parameter type: %d\n", ParameterType)); if (ConfigurationContext == NULL) { @@ -661,7 +666,7 @@ NdisReadConfiguration( (*ParameterValue)->ParameterData.StringData.Buffer = Buffer; (*ParameterValue)->ParameterData.StringData.Length = KeyInformation->DataLength; } - else + else if (KeyInformation->Type == REG_SZ) { UNICODE_STRING str; @@ -698,6 +703,22 @@ NdisReadConfiguration( (*ParameterValue)->ParameterData.StringData.Length = KeyInformation->DataLength; } } + else + { + NDIS_DbgPrint(MIN_TRACE, ("Invalid type for NdisReadConfiguration (%d)\n", KeyInformation->Type)); + NDIS_DbgPrint(MIN_TRACE, ("Requested type: %d\n", ParameterType)); + NDIS_DbgPrint(MIN_TRACE, ("Registry entry: %wZ\n", Keyword)); + *Status = NDIS_STATUS_FAILURE; + ExFreePool(KeyInformation); + return; + } + + if ((*ParameterValue)->ParameterType != ParameterType) + { + NDIS_DbgPrint(MIN_TRACE, ("Parameter type mismatch! (Requested: %d | Received: %d)\n", + ParameterType, (*ParameterValue)->ParameterType)); + NDIS_DbgPrint(MIN_TRACE, ("Registry entry: %wZ\n", Keyword)); + } MiniportResource->ResourceType = MINIPORT_RESOURCE_TYPE_REGISTRY_DATA; MiniportResource->Resource = *ParameterValue;