mirror of
https://github.com/reactos/reactos.git
synced 2024-10-06 01:13:38 +00:00
- Convert the string using the WideCharToMultiByte function and fix passed parameters
- Always zero-terminate the converted buffer - Remove querying NameServer / DhcpNameServer under Parameters key because it is not used and was not working - Initialize PrivateNSEnum CurrentName member - Make sure that only successfully converted NameServer get copied svn path=/trunk/; revision=36892
This commit is contained in:
parent
8929e5773c
commit
e2192f9e89
|
@ -181,12 +181,18 @@ VOID CreateNameServerListEnumNamesFunc( PWCHAR Interface,
|
||||||
PWCHAR Server,
|
PWCHAR Server,
|
||||||
PVOID _Data ) {
|
PVOID _Data ) {
|
||||||
PNAME_SERVER_LIST_PRIVATE Data = (PNAME_SERVER_LIST_PRIVATE)_Data;
|
PNAME_SERVER_LIST_PRIVATE Data = (PNAME_SERVER_LIST_PRIVATE)_Data;
|
||||||
RtlUnicodeToMultiByteN((PCHAR)&Data->AddrString[Data->CurrentName],
|
|
||||||
sizeof(Data->AddrString[0]),
|
if (WideCharToMultiByte(CP_ACP, 0, Server, -1,
|
||||||
NULL,
|
Data->AddrString[Data->CurrentName].String,
|
||||||
Server,
|
16, NULL, NULL))
|
||||||
wcslen(Server));
|
{
|
||||||
|
Data->AddrString[Data->CurrentName].String[15] = '\0';
|
||||||
Data->CurrentName++;
|
Data->CurrentName++;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Data->AddrString[Data->CurrentName].String[0] = '\0';
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void CreateNameServerListEnumIfFunc( HKEY RegHandle,
|
static void CreateNameServerListEnumIfFunc( HKEY RegHandle,
|
||||||
|
@ -207,43 +213,19 @@ static void MakeNameServerList( PNAME_SERVER_LIST_PRIVATE PrivateData ) {
|
||||||
}
|
}
|
||||||
|
|
||||||
PIPHLP_RES_INFO getResInfo() {
|
PIPHLP_RES_INFO getResInfo() {
|
||||||
DWORD i, ServerCount, ExtraServer;
|
DWORD i, ServerCount;
|
||||||
HKEY hKey;
|
|
||||||
LONG errCode;
|
|
||||||
PWCHAR Str;
|
|
||||||
IP_ADDR_STRING AddrString;
|
|
||||||
NAME_SERVER_LIST_PRIVATE PrivateNSEnum = { 0 };
|
NAME_SERVER_LIST_PRIVATE PrivateNSEnum = { 0 };
|
||||||
PIPHLP_RES_INFO ResInfo;
|
PIPHLP_RES_INFO ResInfo;
|
||||||
struct sockaddr_in *AddrList;
|
struct sockaddr_in *AddrList;
|
||||||
|
|
||||||
ServerCount = CountNameServers( &PrivateNSEnum );
|
ServerCount = CountNameServers( &PrivateNSEnum );
|
||||||
|
|
||||||
errCode = RegOpenKeyExA(HKEY_LOCAL_MACHINE,
|
|
||||||
"SYSTEM\\CurrentControlSet\\Services\\Tcpip\\"
|
|
||||||
"Parameters", 0, KEY_READ, &hKey);
|
|
||||||
if (errCode != ERROR_SUCCESS) {
|
|
||||||
RegCloseKey( hKey );
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
Str = QueryRegistryValueString( hKey, L"NameServer" );
|
|
||||||
|
|
||||||
/* If NameServer is empty */
|
|
||||||
if (!Str || *Str == L'\0')
|
|
||||||
{
|
|
||||||
/* Then use DhcpNameServer */
|
|
||||||
Str = QueryRegistryValueString( hKey, L"DhcpNameServer" );
|
|
||||||
}
|
|
||||||
|
|
||||||
ExtraServer = Str ? 1 : 0;
|
|
||||||
|
|
||||||
ServerCount += ExtraServer;
|
|
||||||
|
|
||||||
PrivateNSEnum.NumServers = ServerCount;
|
PrivateNSEnum.NumServers = ServerCount;
|
||||||
PrivateNSEnum.AddrString =
|
PrivateNSEnum.AddrString =
|
||||||
(PIP_ADDRESS_STRING)
|
(PIP_ADDRESS_STRING)
|
||||||
RtlAllocateHeap( GetProcessHeap(), 0,
|
RtlAllocateHeap( GetProcessHeap(), 0,
|
||||||
ServerCount * sizeof(IP_ADDRESS_STRING) );
|
ServerCount * sizeof(IP_ADDRESS_STRING) );
|
||||||
|
PrivateNSEnum.CurrentName = 0;
|
||||||
|
|
||||||
ResInfo =
|
ResInfo =
|
||||||
(PIPHLP_RES_INFO)RtlAllocateHeap
|
(PIPHLP_RES_INFO)RtlAllocateHeap
|
||||||
|
@ -253,7 +235,6 @@ PIPHLP_RES_INFO getResInfo() {
|
||||||
|
|
||||||
if( !ResInfo ) {
|
if( !ResInfo ) {
|
||||||
RtlFreeHeap( GetProcessHeap(), 0, PrivateNSEnum.AddrString );
|
RtlFreeHeap( GetProcessHeap(), 0, PrivateNSEnum.AddrString );
|
||||||
RegCloseKey( hKey );
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -264,30 +245,15 @@ PIPHLP_RES_INFO getResInfo() {
|
||||||
|
|
||||||
MakeNameServerList( &PrivateNSEnum );
|
MakeNameServerList( &PrivateNSEnum );
|
||||||
|
|
||||||
if( ExtraServer ) {
|
for( i = 0; i < PrivateNSEnum.CurrentName; i++ ) {
|
||||||
ULONG ResultSize;
|
|
||||||
|
|
||||||
for( ResultSize = 0; Str[ResultSize]; ResultSize++ )
|
|
||||||
((PCHAR)&AddrString)[ResultSize] = Str[ResultSize];
|
|
||||||
|
|
||||||
((PCHAR)&AddrString)[ResultSize] = 0;
|
|
||||||
ResInfo->riAddressList[0].sin_family = AF_INET;
|
|
||||||
ResInfo->riAddressList[0].sin_addr.s_addr =
|
|
||||||
inet_addr( (PCHAR)&AddrString );
|
|
||||||
ResInfo->riAddressList[0].sin_port = 0;
|
|
||||||
ConsumeRegValueString( Str );
|
|
||||||
}
|
|
||||||
|
|
||||||
for( i = ExtraServer; i < ServerCount; i++ ) {
|
|
||||||
/* Hmm seems that dns servers are always AF_INET but ... */
|
/* Hmm seems that dns servers are always AF_INET but ... */
|
||||||
ResInfo->riAddressList[i].sin_family = AF_INET;
|
ResInfo->riAddressList[i].sin_family = AF_INET;
|
||||||
ResInfo->riAddressList[i].sin_addr.s_addr =
|
ResInfo->riAddressList[i].sin_addr.s_addr =
|
||||||
inet_addr( (PCHAR)&PrivateNSEnum.AddrString[i - ExtraServer] );
|
inet_addr(PrivateNSEnum.AddrString[i].String );
|
||||||
ResInfo->riAddressList[i].sin_port = 0;
|
ResInfo->riAddressList[i].sin_port = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
RtlFreeHeap( GetProcessHeap(), 0, PrivateNSEnum.AddrString );
|
RtlFreeHeap( GetProcessHeap(), 0, PrivateNSEnum.AddrString );
|
||||||
RegCloseKey( hKey );
|
|
||||||
|
|
||||||
return ResInfo;
|
return ResInfo;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue