- Rewrite getResInfo to directly return a linked list of IP_ADDR_STRING structures

- Might fix manual DNS bug

svn path=/trunk/; revision=37037
This commit is contained in:
Johannes Anderwald 2008-10-28 10:06:16 +00:00
parent d48de02010
commit a9c9171b38
3 changed files with 45 additions and 67 deletions

View file

@ -1367,7 +1367,7 @@ DWORD WINAPI GetNetworkParams(PFIXED_INFO pFixedInfo, PULONG pOutBufLen)
if (!resInfo) if (!resInfo)
return ERROR_OUTOFMEMORY; return ERROR_OUTOFMEMORY;
size = sizeof(FIXED_INFO) + (resInfo->riCount > 0 ? (resInfo->riCount - 1) * size = sizeof(FIXED_INFO) + (resInfo->riCount > 1 ? (resInfo->riCount-1) *
sizeof(IP_ADDR_STRING) : 0); sizeof(IP_ADDR_STRING) : 0);
if (!pFixedInfo || *pOutBufLen < size) { if (!pFixedInfo || *pOutBufLen < size) {
*pOutBufLen = size; *pOutBufLen = size;
@ -1383,25 +1383,16 @@ DWORD WINAPI GetNetworkParams(PFIXED_INFO pFixedInfo, PULONG pOutBufLen)
TRACE("GetComputerNameExA: %s\n", pFixedInfo->DomainName); TRACE("GetComputerNameExA: %s\n", pFixedInfo->DomainName);
if (resInfo->riCount > 0) { if (resInfo->riCount > 0)
PIP_ADDR_STRING ptr; {
int i; CopyMemory(&pFixedInfo->DnsServerList, resInfo->DnsList, sizeof(IP_ADDR_STRING));
if (resInfo->riCount > 1)
for (i = 0, ptr = &pFixedInfo->DnsServerList; i < resInfo->riCount && ptr; {
i++, ptr = ptr->Next) { pFixedInfo->DnsServerList.Next = (struct _IP_ADDR_STRING*)((char*)pFixedInfo + sizeof(FIXED_INFO));
struct sockaddr_in *addr_v4 = CopyMemory(pFixedInfo->DnsServerList.Next, resInfo->DnsList->Next, sizeof(IP_ADDR_STRING) * (resInfo->riCount-1));
(struct sockaddr_in *)&resInfo->riAddressList[i];
toIPAddressString
(addr_v4->sin_addr.s_addr,
ptr->IpAddress.String);
if (i == resInfo->riCount - 1)
ptr->Next = NULL;
else if (i == 0)
ptr->Next = (PIP_ADDR_STRING)((LPBYTE)pFixedInfo + sizeof(FIXED_INFO));
else
ptr->Next = (PIP_ADDR_STRING)((PBYTE)ptr + sizeof(IP_ADDR_STRING));
} }
} }
pFixedInfo->NodeType = HYBRID_NODETYPE; pFixedInfo->NodeType = HYBRID_NODETYPE;
regReturn = RegOpenKeyExA(HKEY_LOCAL_MACHINE, regReturn = RegOpenKeyExA(HKEY_LOCAL_MACHINE,
"SYSTEM\\CurrentControlSet\\Services\\VxD\\MSTCP", 0, KEY_READ, &hKey); "SYSTEM\\CurrentControlSet\\Services\\VxD\\MSTCP", 0, KEY_READ, &hKey);
@ -1490,7 +1481,7 @@ static void CreateNameServerListEnumNamesFunc( PWCHAR Interface, PWCHAR Server,
Context->uSizeRequired += sizeof(IP_ADDR_STRING); Context->uSizeRequired += sizeof(IP_ADDR_STRING);
if (Context->uSizeAvailable >= Context->uSizeRequired) if (Context->uSizeAvailable >= Context->uSizeRequired)
{ {
pNext = ((char*)Context->pLastAddr) + sizeof(IP_ADDR_STRING); pNext = (IP_ADDR_STRING*)(((char*)Context->pLastAddr) + sizeof(IP_ADDR_STRING));
WideCharToMultiByte(CP_ACP, 0, Server, -1, pNext->IpAddress.String, 16, NULL, NULL); WideCharToMultiByte(CP_ACP, 0, Server, -1, pNext->IpAddress.String, 16, NULL, NULL);
pNext->IpAddress.String[15] = '\0'; pNext->IpAddress.String[15] = '\0';
Context->pLastAddr->Next = pNext; Context->pLastAddr->Next = pNext;

View file

@ -23,6 +23,7 @@
typedef struct _IPHLP_RES_INFO { typedef struct _IPHLP_RES_INFO {
DWORD riCount; DWORD riCount;
IP_ADDR_STRING * DnsList;
struct sockaddr_in *riAddressList; struct sockaddr_in *riAddressList;
} IPHLP_RES_INFO, *PIPHLP_RES_INFO; } IPHLP_RES_INFO, *PIPHLP_RES_INFO;

View file

@ -49,8 +49,7 @@
typedef struct _NAME_SERVER_LIST_PRIVATE { typedef struct _NAME_SERVER_LIST_PRIVATE {
UINT NumServers; UINT NumServers;
UINT CurrentName; IP_ADDR_STRING * pCurrent;
PIP_ADDRESS_STRING AddrString;
} NAME_SERVER_LIST_PRIVATE, *PNAME_SERVER_LIST_PRIVATE; } NAME_SERVER_LIST_PRIVATE, *PNAME_SERVER_LIST_PRIVATE;
NTSYSAPI NTSYSAPI
@ -177,22 +176,23 @@ static void CreateNameServerListEnumIfFuncCount( HKEY RegHandle,
CreateNameServerListEnumNamesFuncCount); CreateNameServerListEnumNamesFuncCount);
} }
VOID CreateNameServerListEnumNamesFunc( PWCHAR Interface, VOID CreateNameServerListEnumNamesFunc(
PWCHAR Server, PWCHAR Interface,
PVOID _Data ) { PWCHAR Server,
PVOID _Data )
{
PNAME_SERVER_LIST_PRIVATE Data = (PNAME_SERVER_LIST_PRIVATE)_Data; PNAME_SERVER_LIST_PRIVATE Data = (PNAME_SERVER_LIST_PRIVATE)_Data;
if (WideCharToMultiByte(CP_ACP, 0, Server, -1, if (WideCharToMultiByte(CP_ACP, 0, Server, -1, Data->pCurrent->IpAddress.String, 16, NULL, NULL))
Data->AddrString[Data->CurrentName].String, {
16, NULL, NULL)) Data->pCurrent->Next = (struct _IP_ADDR_STRING*)(char*)Data->pCurrent + sizeof(IP_ADDR_STRING);
{ Data->pCurrent = Data->pCurrent->Next;
Data->AddrString[Data->CurrentName].String[15] = '\0'; Data->NumServers++;
Data->CurrentName++; }
} else
else {
{ Data->pCurrent->IpAddress.String[0] = '\0';
Data->AddrString[Data->CurrentName].String[0] = '\0'; }
}
} }
static void CreateNameServerListEnumIfFunc( HKEY RegHandle, static void CreateNameServerListEnumIfFunc( HKEY RegHandle,
@ -213,51 +213,37 @@ static void MakeNameServerList( PNAME_SERVER_LIST_PRIVATE PrivateData ) {
} }
PIPHLP_RES_INFO getResInfo() { PIPHLP_RES_INFO getResInfo() {
DWORD i, ServerCount; DWORD ServerCount;
NAME_SERVER_LIST_PRIVATE PrivateNSEnum = { 0 }; NAME_SERVER_LIST_PRIVATE PrivateNSEnum;
PIPHLP_RES_INFO ResInfo; PIPHLP_RES_INFO ResInfo;
struct sockaddr_in *AddrList; IP_ADDR_STRING * DnsList;
PrivateNSEnum.NumServers = 0;
ServerCount = CountNameServers( &PrivateNSEnum ); ServerCount = CountNameServers( &PrivateNSEnum );
PrivateNSEnum.NumServers = ServerCount; PrivateNSEnum.NumServers = ServerCount;
PrivateNSEnum.AddrString = DnsList = HeapAlloc(GetProcessHeap(), 0, ServerCount * sizeof(IP_ADDR_STRING));
(PIP_ADDRESS_STRING) ZeroMemory(DnsList, ServerCount * sizeof(IP_ADDR_STRING));
RtlAllocateHeap( GetProcessHeap(), 0,
ServerCount * sizeof(IP_ADDRESS_STRING) );
PrivateNSEnum.CurrentName = 0;
ResInfo = ResInfo = (PIPHLP_RES_INFO)RtlAllocateHeap ( GetProcessHeap(), 0, sizeof(IPHLP_RES_INFO));
(PIPHLP_RES_INFO)RtlAllocateHeap if( !ResInfo )
( GetProcessHeap(), 0, {
sizeof(IPHLP_RES_INFO) + HeapFree( GetProcessHeap(), 0, DnsList );
(ServerCount * sizeof(struct sockaddr_in)) ); return NULL;
if( !ResInfo ) {
RtlFreeHeap( GetProcessHeap(), 0, PrivateNSEnum.AddrString );
return NULL;
} }
ResInfo->riCount = ServerCount; PrivateNSEnum.NumServers = 0;
AddrList = (struct sockaddr_in *) PrivateNSEnum.pCurrent = DnsList;
(((PCHAR)ResInfo) + sizeof(IPHLP_RES_INFO));
ResInfo->riAddressList = AddrList;
MakeNameServerList( &PrivateNSEnum ); MakeNameServerList( &PrivateNSEnum );
ResInfo->DnsList = DnsList;
for( i = 0; i < PrivateNSEnum.CurrentName; i++ ) { ResInfo->riCount = PrivateNSEnum.NumServers;
/* Hmm seems that dns servers are always AF_INET but ... */
ResInfo->riAddressList[i].sin_family = AF_INET;
ResInfo->riAddressList[i].sin_addr.s_addr =
inet_addr(PrivateNSEnum.AddrString[i].String );
ResInfo->riAddressList[i].sin_port = 0;
}
RtlFreeHeap( GetProcessHeap(), 0, PrivateNSEnum.AddrString );
return ResInfo; return ResInfo;
} }
VOID disposeResInfo( PIPHLP_RES_INFO InfoPtr ) { VOID disposeResInfo( PIPHLP_RES_INFO InfoPtr )
{
RtlFreeHeap( GetProcessHeap(), 0, InfoPtr ); RtlFreeHeap( GetProcessHeap(), 0, InfoPtr );
HeapFree(GetProcessHeap(), 0, InfoPtr->DnsList);
} }