It looks like this change has caused some regressions in sysreg
http://www.reactos.org/testman/compare.php?ids=3934,3935
cgutman@svn.reactos.org wrote:
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/dhc... ============================================================================== --- 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... ============================================================================== --- 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... ============================================================================== --- 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_... ============================================================================== --- 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 ) {