[ros-diffs] [cgutman] 48593: [DHCPCSVC] - Write the DNS servers in a REG_MULTI_SZ value [IPHLPAPI] - Rewrite the registry reading code - Use HeapFree to free memory from the allocated from heap

cgutman at svn.reactos.org cgutman at svn.reactos.org
Sun Aug 22 22:22:28 UTC 2010


Author: cgutman
Date: Sun Aug 22 22:22:27 2010
New Revision: 48593

URL: http://svn.reactos.org/svn/reactos?rev=48593&view=rev
Log:
[DHCPCSVC]
- Write the DNS servers in a REG_MULTI_SZ value
[IPHLPAPI]
- Rewrite the registry reading code
- Use HeapFree to free memory from the allocated from heap

Modified:
    trunk/reactos/dll/win32/dhcpcsvc/dhcp/dhclient.c
    trunk/reactos/dll/win32/iphlpapi/iphlpapi_private.h
    trunk/reactos/dll/win32/iphlpapi/registry.c
    trunk/reactos/dll/win32/iphlpapi/resinfo_reactos.c

Modified: trunk/reactos/dll/win32/dhcpcsvc/dhcp/dhclient.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/dhcpcsvc/dhcp/dhclient.c?rev=48593&r1=48592&r2=48593&view=diff
==============================================================================
--- trunk/reactos/dll/win32/dhcpcsvc/dhcp/dhclient.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/dhcpcsvc/dhcp/dhclient.c [iso-8859-1] Sun Aug 22 22:22:27 2010
@@ -507,24 +507,25 @@
         char *nsbuf;
         int i, addrs =
             new_lease->options[DHO_DOMAIN_NAME_SERVERS].len / sizeof(ULONG);
-
-        nsbuf = malloc( addrs * sizeof(IP_ADDRESS_STRING) );
+        int len = 0;
+
+        nsbuf = malloc( addrs * sizeof(IP_ADDRESS_STRING) + 1 );
 
         if( nsbuf) {
-            nsbuf[0] = 0;
+            memset(nsbuf, 0, addrs * sizeof(IP_ADDRESS_STRING) + 1);
             for( i = 0; i < addrs; i++ ) {
                 nameserver.len = sizeof(ULONG);
                 memcpy( nameserver.iabuf,
                         new_lease->options[DHO_DOMAIN_NAME_SERVERS].data +
                         (i * sizeof(ULONG)), sizeof(ULONG) );
                 strcat( nsbuf, piaddr(nameserver) );
-                if( i != addrs-1 ) strcat( nsbuf, "," );
+                len += strlen(nsbuf) + 1;
             }
 
             DH_DbgPrint(MID_TRACE,("Setting DhcpNameserver: %s\n", nsbuf));
 
-            RegSetValueExA( RegKey, "DhcpNameServer", 0, REG_SZ,
-                           (LPBYTE)nsbuf, strlen(nsbuf) + 1 );
+            RegSetValueExA( RegKey, "DhcpNameServer", 0, REG_MULTI_SZ,
+                           (LPBYTE)nsbuf, len + 1 );
             free( nsbuf );
         }
 

Modified: trunk/reactos/dll/win32/iphlpapi/iphlpapi_private.h
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/iphlpapi/iphlpapi_private.h?rev=48593&r1=48592&r2=48593&view=diff
==============================================================================
--- trunk/reactos/dll/win32/iphlpapi/iphlpapi_private.h [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/iphlpapi/iphlpapi_private.h [iso-8859-1] Sun Aug 22 22:22:27 2010
@@ -139,6 +139,7 @@
 PWCHAR GetNthChildKeyName( HANDLE RegHandle, DWORD n );
 void ConsumeChildKeyName( PWCHAR Name );
 PWCHAR QueryRegistryValueString( HANDLE RegHandle, PWCHAR ValueName );
+PWCHAR *QueryRegistryValueStringMulti( HANDLE RegHandle, PWCHAR ValueName );
 void ConsumeRegValueString( PWCHAR NameServer );
 BOOL isInterface( TDIEntityID *if_maybe );
 BOOL hasArp( HANDLE tcpFile, TDIEntityID *arp_maybe );

Modified: trunk/reactos/dll/win32/iphlpapi/registry.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/iphlpapi/registry.c?rev=48593&r1=48592&r2=48593&view=diff
==============================================================================
--- trunk/reactos/dll/win32/iphlpapi/registry.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/iphlpapi/registry.c [iso-8859-1] Sun Aug 22 22:22:27 2010
@@ -66,25 +66,123 @@
   if (Name) HeapFree( GetProcessHeap(), 0, Name );
 }
 
-PWCHAR QueryRegistryValueString( HANDLE RegHandle, PWCHAR ValueName ) {
-  PWCHAR Name;
-  DWORD ReturnedSize = 0;
+PVOID QueryRegistryValue(HANDLE RegHandle, PWCHAR ValueName, LPDWORD RegistryType, LPDWORD Length)
+{
+    PVOID ReadValue = NULL;
+    DWORD Error;
 
-  if (RegQueryValueExW( RegHandle, ValueName, NULL, NULL, NULL,
-			&ReturnedSize ) != 0) {
-    return 0;
-  } else {
-    Name = malloc( ReturnedSize);
-    RegQueryValueExW( RegHandle, ValueName, NULL, NULL, (PVOID)Name,
-		      &ReturnedSize );
-    return Name;
-  }
+    *Length = 0;
+    *RegistryType = REG_NONE;
+
+    while (TRUE)
+    {
+        Error = RegQueryValueExW(RegHandle, ValueName, NULL, RegistryType, ReadValue, Length);
+        if (Error == ERROR_SUCCESS)
+        {
+            if (ReadValue) break;
+        }
+        else if (Error == ERROR_MORE_DATA)
+        {
+            HeapFree(GetProcessHeap(), 0, ReadValue);
+        }
+        else break;
+        
+        ReadValue = HeapAlloc(GetProcessHeap(), 0, *Length);
+        if (!ReadValue) return NULL;
+    }
+
+    if (Error != ERROR_SUCCESS)
+    {
+        if (ReadValue) HeapFree(GetProcessHeap(), 0, ReadValue);
+
+        *Length = 0;
+        *RegistryType = REG_NONE;
+        ReadValue = NULL;
+    }
+
+    return ReadValue;
+}
+
+PWCHAR TerminateReadString(PWCHAR String, DWORD Length)
+{
+    PWCHAR TerminatedString;
+    
+    TerminatedString = HeapAlloc(GetProcessHeap(), 0, Length + sizeof(WCHAR));
+    if (TerminatedString == NULL)
+        return NULL;
+
+    memcpy(TerminatedString, String, Length);
+
+    TerminatedString[Length / sizeof(WCHAR)] = UNICODE_NULL;
+    
+    return TerminatedString;
+}
+
+PWCHAR QueryRegistryValueString( HANDLE RegHandle, PWCHAR ValueName )
+{
+    PWCHAR String, TerminatedString;
+    DWORD Type, Length;
+    
+    String = QueryRegistryValue(RegHandle, ValueName, &Type, &Length);
+    if (!String) return NULL;
+    if (Type != REG_SZ)
+    {
+        DbgPrint("Type mismatch for %S (%d != %d)\n", ValueName, Type, REG_SZ);
+        //HeapFree(GetProcessHeap(), 0, String);
+        //return NULL;
+    }
+    
+    TerminatedString = TerminateReadString(String, Length);
+    HeapFree(GetProcessHeap(), 0, String);
+    if (!TerminatedString) return NULL;
+    
+    return TerminatedString;
 }
 
 void ConsumeRegValueString( PWCHAR Value ) {
-  if (Value) free(Value);
+  if (Value) HeapFree(GetProcessHeap(), 0, Value);
 }
 
 PWCHAR *QueryRegistryValueStringMulti( HANDLE RegHandle, PWCHAR ValueName ) {
-  return 0; /* FIXME if needed */
+    PWCHAR String, TerminatedString, Tmp;
+    PWCHAR *Table;
+    DWORD Type, Length, i, j;
+    
+    String = QueryRegistryValue(RegHandle, ValueName, &Type, &Length);
+    if (!String) return NULL;
+    if (Type != REG_MULTI_SZ)
+    {
+        DbgPrint("Type mismatch for %S (%d != %d)\n", ValueName, Type, REG_MULTI_SZ);
+        //HeapFree(GetProcessHeap(), 0, String);
+        //return NULL;
+    }
+    
+    TerminatedString = TerminateReadString(String, Length);
+    HeapFree(GetProcessHeap(), 0, String);
+    if (!TerminatedString) return NULL;
+
+    for (Tmp = TerminatedString, i = 0; *Tmp; Tmp++, i++) while (*Tmp) Tmp++;
+    
+    Table = HeapAlloc(GetProcessHeap(), 0, (i + 1) * sizeof(PWCHAR));
+    if (!Table)
+    {
+        HeapFree(GetProcessHeap(), 0, TerminatedString);
+        return NULL;
+    }
+    
+    for (Tmp = TerminatedString, j = 0; *Tmp; Tmp++, j++)
+    {
+        PWCHAR Orig = Tmp;
+        
+        for (i = 0; *Tmp; i++, Tmp++);
+        
+        Table[j] = HeapAlloc(GetProcessHeap(), 0, i * sizeof(WCHAR));
+        memcpy(Table[j], Orig, i * sizeof(WCHAR));
+    }
+    
+    Table[j] = NULL;
+    
+    HeapFree(GetProcessHeap(), 0, TerminatedString);
+    
+    return Table;
 }

Modified: trunk/reactos/dll/win32/iphlpapi/resinfo_reactos.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/iphlpapi/resinfo_reactos.c?rev=48593&r1=48592&r2=48593&view=diff
==============================================================================
--- trunk/reactos/dll/win32/iphlpapi/resinfo_reactos.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/iphlpapi/resinfo_reactos.c [iso-8859-1] Sun Aug 22 22:22:27 2010
@@ -122,47 +122,24 @@
 
 void EnumNameServers( HANDLE RegHandle, PWCHAR Interface,
 			     PVOID Data, EnumNameServersFunc cb ) {
-    PWCHAR NameServerString =
-	QueryRegistryValueString(RegHandle, L"DhcpNameServer");
+    PWCHAR *NameServerString =
+	QueryRegistryValueStringMulti(RegHandle, L"DhcpNameServer");
+    DWORD i;
 
     if (!NameServerString)
-		NameServerString = QueryRegistryValueString(RegHandle, L"NameServer");
-
-    if (NameServerString) {
-    /* Now, count the non-empty comma separated */
-	DWORD ch;
-	DWORD LastNameStart = 0;
-	for (ch = 0; NameServerString[ch]; ch++) {
-	    if (NameServerString[ch] == ',') {
-		if (ch - LastNameStart > 0) { /* Skip empty entries */
-		    PWCHAR NameServer =
-			malloc(((ch - LastNameStart) + 1) * sizeof(WCHAR));
-		    if (NameServer) {
-			memcpy(NameServer,NameServerString + LastNameStart,
-				   (ch - LastNameStart) * sizeof(WCHAR));
-			NameServer[ch - LastNameStart] = 0;
-			cb( Interface, NameServer, Data );
-			free(NameServer);
-			LastNameStart = ch +1;
-		    }
-		}
-		LastNameStart = ch + 1; /* The first one after the comma */
-	    }
-	}
-	if (ch - LastNameStart > 0) { /* A last name? */
-	    PWCHAR NameServer = malloc(((ch - LastNameStart) + 1) * sizeof(WCHAR));
-            if (NameServer) {
-	        memcpy(NameServer,NameServerString + LastNameStart,
-		       (ch - LastNameStart) * sizeof(WCHAR));
-	        NameServer[ch - LastNameStart] = 0;
-	        cb( Interface, NameServer, Data );
-	        free(NameServer);
-            }
-	}
-	ConsumeRegValueString(NameServerString);
-    }
-}
-
+		NameServerString = QueryRegistryValueStringMulti(RegHandle, L"NameServer");
+    
+    if (!NameServerString) return;
+    
+    for (i = 0; NameServerString[i]; i++)
+    {
+        cb(Interface, NameServerString[i], Data);
+        
+        HeapFree(GetProcessHeap(), 0, NameServerString[i]);
+    }
+    
+    HeapFree(GetProcessHeap(), 0, NameServerString);
+}
 static void CreateNameServerListEnumNamesFuncCount( PWCHAR Interface,
 						    PWCHAR Server,
 						    PVOID _Data ) {




More information about the Ros-diffs mailing list