mirror of
https://github.com/reactos/reactos.git
synced 2025-02-23 08:55:19 +00:00
- 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:
parent
d48de02010
commit
a9c9171b38
3 changed files with 45 additions and 67 deletions
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue