Index: dll/win32/dnsapi/CMakeLists.txt =================================================================== --- dll/win32/dnsapi/CMakeLists.txt (revision 72796) +++ dll/win32/dnsapi/CMakeLists.txt (working copy) @@ -24,6 +24,6 @@ set_module_type(dnsapi win32dll) target_link_libraries(dnsapi adns) -add_importlibs(dnsapi user32 ws2_32 iphlpapi msvcrt kernel32 ntdll) +add_importlibs(dnsapi advapi32 user32 ws2_32 iphlpapi msvcrt kernel32 ntdll) add_pch(dnsapi dnsapi/precomp.h SOURCE) add_cd_file(TARGET dnsapi DESTINATION reactos/system32 FOR all) Index: dll/win32/dnsapi/dnsapi/query.c =================================================================== --- dll/win32/dnsapi/dnsapi/query.c (revision 72796) +++ dll/win32/dnsapi/dnsapi/query.c (working copy) @@ -9,6 +9,8 @@ */ #include "precomp.h" +#include +#include #define NDEBUG #include @@ -44,6 +46,275 @@ return p; } +HANDLE +WSAAPI +OpenNetworkDatabase(PCHAR Name) +{ + PCHAR ExpandedPath; + PCHAR DatabasePath; + INT ErrorCode; + HKEY DatabaseKey; + DWORD RegType; + DWORD RegSize = 0; + HANDLE ret; + + ExpandedPath = RtlAllocateHeap(RtlGetProcessHeap(), 0, MAX_PATH); + if (!ExpandedPath) + return INVALID_HANDLE_VALUE; + + /* Open the database path key */ + ErrorCode = RegOpenKeyExA(HKEY_LOCAL_MACHINE, + "System\\CurrentControlSet\\Services\\Tcpip\\Parameters", + 0, + KEY_READ, + &DatabaseKey); + if (ErrorCode == NO_ERROR) + { + /* Read the actual path */ + ErrorCode = RegQueryValueExA(DatabaseKey, + "DatabasePath", + NULL, + &RegType, + NULL, + &RegSize); + + DatabasePath = RtlAllocateHeap(RtlGetProcessHeap(), 0, RegSize); + if (!DatabasePath) + { + RtlFreeHeap(RtlGetProcessHeap(), 0, ExpandedPath); + return INVALID_HANDLE_VALUE; + } + + /* Read the actual path */ + ErrorCode = RegQueryValueExA(DatabaseKey, + "DatabasePath", + NULL, + &RegType, + (LPBYTE)DatabasePath, + &RegSize); + + /* Close the key */ + RegCloseKey(DatabaseKey); + + /* Expand the name */ + ExpandEnvironmentStringsA(DatabasePath, ExpandedPath, MAX_PATH); + + RtlFreeHeap(RtlGetProcessHeap(), 0, DatabasePath); + } + else + { + /* Use defalt path */ + GetSystemDirectoryA(ExpandedPath, MAX_PATH); + if (ExpandedPath[strlen(ExpandedPath) - 1] != '\\') + { + /* It isn't, so add it ourselves */ + strncat(ExpandedPath, "\\", MAX_PATH); + } + strncat(ExpandedPath, "DRIVERS\\ETC\\", MAX_PATH); + } + + /* Make sure that the path is backslash-terminated */ + if (ExpandedPath[strlen(ExpandedPath) - 1] != '\\') + { + /* It isn't, so add it ourselves */ + strncat(ExpandedPath, "\\", MAX_PATH); + } + + /* Add the database name */ + strncat(ExpandedPath, Name, MAX_PATH); + + /* Return a handle to the file */ + ret = CreateFileA(ExpandedPath, + FILE_READ_DATA, + FILE_SHARE_READ, + NULL, + OPEN_EXISTING, + FILE_ATTRIBUTE_NORMAL, + NULL); + + RtlFreeHeap(RtlGetProcessHeap(), 0, ExpandedPath); + return ret; +} + +/* This function is far from perfect but it works enough */ +IP4_ADDRESS +CheckForCurrentHostname(IN CONST CHAR * Name, PFIXED_INFO network_info) +{ + PCHAR TempName; + DWORD AdapterAddressesSize, Status; + IP4_ADDRESS ret = 0, Address; + PIP_ADAPTER_ADDRESSES Addresses = NULL, pip; + BOOL Found = FALSE; + + if (network_info->DomainName) + { + TempName = RtlAllocateHeap(RtlGetProcessHeap(), + 0, + strlen(network_info->HostName) + strlen(network_info->DomainName) + 2); + strcpy(TempName, network_info->HostName); + strcat(TempName, "."); + strcat(TempName, network_info->DomainName); + } + else + { + TempName = RtlAllocateHeap(RtlGetProcessHeap(), 0, 1); + TempName[0] = 0; + } + Found = !stricmp(Name, network_info->HostName) || !stricmp(Name, TempName); + RtlFreeHeap(RtlGetProcessHeap(), 0, TempName); + if (!Found) + { + return 0; + } + /* get adapter info */ + AdapterAddressesSize = 0; + GetAdaptersAddresses(AF_INET, + GAA_FLAG_SKIP_FRIENDLY_NAME | GAA_FLAG_SKIP_DNS_SERVER | GAA_FLAG_SKIP_ANYCAST | GAA_FLAG_SKIP_MULTICAST, + NULL, + Addresses, + &AdapterAddressesSize); + if (!AdapterAddressesSize) + { + return 0; + } + Addresses = RtlAllocateHeap(RtlGetProcessHeap(), 0, AdapterAddressesSize); + Status = GetAdaptersAddresses(AF_INET, + GAA_FLAG_SKIP_FRIENDLY_NAME | GAA_FLAG_SKIP_DNS_SERVER | GAA_FLAG_SKIP_ANYCAST | GAA_FLAG_SKIP_MULTICAST, + NULL, + Addresses, + &AdapterAddressesSize); + if (Status) + { + RtlFreeHeap(RtlGetProcessHeap(), 0, Addresses); + return 0; + } + for (pip = Addresses; pip != NULL; pip = pip->Next) { + Address = ((LPSOCKADDR_IN)pip->FirstUnicastAddress->Address.lpSockaddr)->sin_addr.S_un.S_addr; + if (Address != ntohl(INADDR_LOOPBACK)) + break; + } + if (Address && Address != ntohl(INADDR_LOOPBACK)) + { + ret = Address; + } + RtlFreeHeap(RtlGetProcessHeap(), 0, Addresses); + return ret; +} + +/* This function is far from perfect but it works enough */ +IP4_ADDRESS +FindEntryInHosts(IN CONST CHAR * name) +{ + BOOL Found = FALSE; + HANDLE HostsFile; + CHAR HostsDBData[BUFSIZ] = { 0 }; + PCHAR AddressStr, DnsName = NULL, AddrTerm, NameSt, NextLine, ThisLine, Comment; + UINT ValidData = 0; + DWORD ReadSize; + DWORD Address; + + /* Open the network database */ + HostsFile = OpenNetworkDatabase("hosts"); + if (HostsFile == INVALID_HANDLE_VALUE) + { + WSASetLastError(WSANO_RECOVERY); + return 0; + } + + while (!Found && ReadFile(HostsFile, + HostsDBData + ValidData, + sizeof(HostsDBData) - ValidData, + &ReadSize, + NULL)) + { + ValidData += ReadSize; + ReadSize = 0; + NextLine = ThisLine = HostsDBData; + + /* Find the beginning of the next line */ + while ((NextLine < HostsDBData + ValidData) && + (*NextLine != '\r') && + (*NextLine != '\n')) + { + NextLine++; + } + + /* Zero and skip, so we can treat what we have as a string */ + if (NextLine > HostsDBData + ValidData) + break; + + *NextLine = 0; + NextLine++; + + Comment = strchr(ThisLine, '#'); + if (Comment) + *Comment = 0; /* Terminate at comment start */ + + AddressStr = ThisLine; + /* Find the first space separating the IP address from the DNS name */ + AddrTerm = strchr(ThisLine, ' '); + if (AddrTerm) + { + /* Terminate the address string */ + *AddrTerm = 0; + + /* Find the last space before the DNS name */ + NameSt = strrchr(ThisLine, ' '); + + /* If there is only one space (the one we removed above), then just use the address terminator */ + if (!NameSt) + NameSt = AddrTerm; + + /* Move from the space to the first character of the DNS name */ + NameSt++; + + DnsName = NameSt; + + if (!strcmp(name, DnsName) || !strcmp(name, AddressStr)) + { + Found = TRUE; + break; + } + } + + /* Get rid of everything we read so far */ + while (NextLine <= HostsDBData + ValidData && + isspace(*NextLine)) + { + NextLine++; + } + + if (HostsDBData + ValidData - NextLine <= 0) + break; + + memmove(HostsDBData, NextLine, HostsDBData + ValidData - NextLine); + ValidData -= NextLine - HostsDBData; + } + + CloseHandle(HostsFile); + + if (!Found) + { + WSASetLastError(WSANO_DATA); + return 0; + } + + if (strstr(AddressStr, ":")) + { + WSASetLastError(WSAEINVAL); + return 0; + } + + Address = inet_addr(AddressStr); + if (Address == INADDR_NONE) + { + WSASetLastError(WSAEINVAL); + return 0; + } + + return Address; +} + DNS_STATUS WINAPI DnsQuery_A(LPCSTR Name, WORD Type, @@ -58,9 +329,18 @@ adns_answer *answer; LPSTR CurrentName; unsigned i, CNameLoop; + PFIXED_INFO network_info; + ULONG network_info_blen = 0; + DWORD network_info_result; + PIP_ADDR_STRING pip; + IP4_ADDRESS Address; + struct in_addr addr; + PCHAR p; if (Name == NULL) return ERROR_INVALID_PARAMETER; + if ((Options & DNS_QUERY_WIRE_ONLY) != 0 && (Options & DNS_QUERY_NO_WIRE_QUERY) != 0) + return ERROR_INVALID_PARAMETER; *QueryResultSet = 0; @@ -67,7 +347,119 @@ switch(Type) { case DNS_TYPE_A: + network_info_result = GetNetworkParams(NULL, &network_info_blen); + network_info = (PFIXED_INFO)RtlAllocateHeap(RtlGetProcessHeap(), 0, (size_t)network_info_blen); + if (NULL == network_info) + { + return ERROR_OUTOFMEMORY; + } + network_info_result = GetNetworkParams(network_info, &network_info_blen); + if (network_info_result != ERROR_SUCCESS) + { + RtlFreeHeap(RtlGetProcessHeap(), 0, network_info); + return network_info_result; + } + + /* trim spaces */ + while ((p = strchr(Name, ' ')) != NULL) + { + while (*(p + 1) != 0) + { + *p = *(p + 1); + p++; + } + *p = 0; + } + if (p && *p == ' ') + *p = 0; + + /* Hostname "" - convert to "computername" */ + if (strcmp("", Name) == 0) + { + Name = network_info->HostName; + } + + if ((Options & DNS_QUERY_NO_HOSTS_FILE) == 0) + { + if ((Address = FindEntryInHosts(Name)) != 0) + { + RtlFreeHeap(RtlGetProcessHeap(), 0, network_info); + *QueryResultSet = (PDNS_RECORD)RtlAllocateHeap(RtlGetProcessHeap(), 0, sizeof(DNS_RECORD)); + + if (NULL == *QueryResultSet) + { + return ERROR_OUTOFMEMORY; + } + + (*QueryResultSet)->pNext = NULL; + (*QueryResultSet)->wType = Type; + (*QueryResultSet)->wDataLength = sizeof(DNS_A_DATA); + (*QueryResultSet)->Data.A.IpAddress = Address; + + (*QueryResultSet)->pName = xstrsave(Name); + + return (*QueryResultSet)->pName ? ERROR_SUCCESS : ERROR_OUTOFMEMORY; + } + } + + /* very special case 0.0.0.0 */ + if (strcmp("0.0.0.0", Name) == 0) + { + RtlFreeHeap(RtlGetProcessHeap(), 0, network_info); + *QueryResultSet = (PDNS_RECORD)RtlAllocateHeap(RtlGetProcessHeap(), 0, sizeof(DNS_RECORD)); + + if (NULL == *QueryResultSet) + { + return ERROR_OUTOFMEMORY; + } + + (*QueryResultSet)->pNext = NULL; + (*QueryResultSet)->wType = Type; + (*QueryResultSet)->wDataLength = sizeof(DNS_A_DATA); + (*QueryResultSet)->Data.A.IpAddress = 0; + + (*QueryResultSet)->pName = xstrsave(Name); + + return (*QueryResultSet)->pName ? ERROR_SUCCESS : ERROR_OUTOFMEMORY; + } + + if ((Address = CheckForCurrentHostname(Name, network_info)) != 0) + { + RtlFreeHeap(RtlGetProcessHeap(), 0, network_info); + *QueryResultSet = (PDNS_RECORD)RtlAllocateHeap(RtlGetProcessHeap(), 0, sizeof(DNS_RECORD)); + + if (NULL == *QueryResultSet) + { + return ERROR_OUTOFMEMORY; + } + + (*QueryResultSet)->pNext = NULL; + (*QueryResultSet)->wType = Type; + (*QueryResultSet)->wDataLength = sizeof(DNS_A_DATA); + (*QueryResultSet)->Data.A.IpAddress = Address; + + (*QueryResultSet)->pName = xstrsave(Name); + + return (*QueryResultSet)->pName ? ERROR_SUCCESS : ERROR_OUTOFMEMORY; + } + + if ((Options & DNS_QUERY_NO_WIRE_QUERY) != 0) + { + RtlFreeHeap(RtlGetProcessHeap(), 0, network_info); + return ERROR_FILE_NOT_FOUND; + } adns_error = adns_init(&astate, adns_if_noenv | adns_if_noerrprint | adns_if_noserverwarn, 0); + for (pip = &(network_info->DnsServerList); pip; pip = pip->Next) + { + addr.s_addr = inet_addr(pip->IpAddress.String); + if ((addr.s_addr != INADDR_ANY) && (addr.s_addr != INADDR_NONE)) + adns_addserver(astate, addr); + } + if (network_info->DomainName) + { + adns_ccf_search(astate, "LOCALDOMAIN", -1, network_info->DomainName); + } + RtlFreeHeap(RtlGetProcessHeap(), 0, network_info); if(adns_error != adns_s_ok) return DnsIntTranslateAdnsToDNS_STATUS(adns_error); Index: dll/win32/mswsock/CMakeLists.txt =================================================================== --- dll/win32/mswsock/CMakeLists.txt (revision 72796) +++ dll/win32/mswsock/CMakeLists.txt (working copy) @@ -16,6 +16,6 @@ ${CMAKE_CURRENT_BINARY_DIR}/mswsock.def) set_module_type(mswsock win32dll) -add_importlibs(mswsock ws2_32 dnsapi msvcrt kernel32) +add_importlibs(mswsock advapi32 ws2_32 dnsapi msvcrt kernel32) add_pch(mswsock precomp.h SOURCE) add_cd_file(TARGET mswsock DESTINATION reactos/system32 FOR all) Index: dll/win32/mswsock/mswhelper.c =================================================================== --- dll/win32/mswsock/mswhelper.c (revision 72796) +++ dll/win32/mswsock/mswhelper.c (working copy) @@ -263,8 +263,7 @@ /* addr_list */ RtlZeroMemory(lst, sizeof(lst)); - if (ip4addr != 0) - lst[0] = (void*)&ip4addr; + lst[0] = (void*)&ip4addr; phe->h_addr_list = (char**)(mswBufferEndPtr(mswBuf) - bytesOfs); Index: dll/win32/mswsock/nsplookup.c =================================================================== --- dll/win32/mswsock/nsplookup.c (revision 72796) +++ dll/win32/mswsock/nsplookup.c (working copy) @@ -10,6 +10,7 @@ #include #include #include +#include #include "mswhelper.h" @@ -459,146 +460,6 @@ return ERROR_SUCCESS; } -/* This function is far from perfect but it works enough */ -IP4_ADDRESS -FindEntryInHosts(IN CONST WCHAR FAR* wname) -{ - BOOL Found = FALSE; - HANDLE HostsFile; - CHAR HostsDBData[BUFSIZ] = {0}; - PCHAR SystemDirectory = HostsDBData; - PCHAR HostsLocation = "\\drivers\\etc\\hosts"; - PCHAR AddressStr, DnsName = NULL, AddrTerm, NameSt, NextLine, ThisLine, Comment; - UINT SystemDirSize = sizeof(HostsDBData) - 1, ValidData = 0; - DWORD ReadSize; - DWORD Address; - CHAR name[MAX_HOSTNAME_LEN + 1]; - - wcstombs(name, wname, MAX_HOSTNAME_LEN); - - /* We assume that the parameters are valid */ - if (!GetSystemDirectoryA(SystemDirectory, SystemDirSize)) - { - WSASetLastError(WSANO_RECOVERY); - //WS_DbgPrint(MIN_TRACE, ("Could not get windows system directory.\n")); - return 0; /* Can't get system directory */ - } - - strncat(SystemDirectory, HostsLocation, SystemDirSize); - - HostsFile = CreateFileA(SystemDirectory, - GENERIC_READ, - FILE_SHARE_READ, - NULL, - OPEN_EXISTING, - FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, - NULL); - if (HostsFile == INVALID_HANDLE_VALUE) - { - WSASetLastError(WSANO_RECOVERY); - return 0; - } - - while (!Found && ReadFile(HostsFile, - HostsDBData + ValidData, - sizeof(HostsDBData) - ValidData, - &ReadSize, - NULL)) - { - ValidData += ReadSize; - ReadSize = 0; - NextLine = ThisLine = HostsDBData; - - /* Find the beginning of the next line */ - while ((NextLine < HostsDBData + ValidData) && - (*NextLine != '\r') && - (*NextLine != '\n')) - { - NextLine++; - } - - /* Zero and skip, so we can treat what we have as a string */ - if (NextLine > HostsDBData + ValidData) - break; - - *NextLine = 0; - NextLine++; - - Comment = strchr(ThisLine, '#'); - if (Comment) - *Comment = 0; /* Terminate at comment start */ - - AddressStr = ThisLine; - /* Find the first space separating the IP address from the DNS name */ - AddrTerm = strchr(ThisLine, ' '); - if (AddrTerm) - { - /* Terminate the address string */ - *AddrTerm = 0; - - /* Find the last space before the DNS name */ - NameSt = strrchr(ThisLine, ' '); - - /* If there is only one space (the one we removed above), then just use the address terminator */ - if (!NameSt) - NameSt = AddrTerm; - - /* Move from the space to the first character of the DNS name */ - NameSt++; - - DnsName = NameSt; - - if (!strcmp(name, DnsName)) - { - Found = TRUE; - break; - } - } - - /* Get rid of everything we read so far */ - while (NextLine <= HostsDBData + ValidData && - isspace (*NextLine)) - { - NextLine++; - } - - if (HostsDBData + ValidData - NextLine <= 0) - break; - - //WS_DbgPrint(MAX_TRACE,("About to move %d chars\n", - // HostsDBData + ValidData - NextLine)); - - memmove(HostsDBData, NextLine, HostsDBData + ValidData - NextLine); - ValidData -= NextLine - HostsDBData; - //WS_DbgPrint(MAX_TRACE,("Valid bytes: %d\n", ValidData)); - } - - CloseHandle(HostsFile); - - if (!Found) - { - //WS_DbgPrint(MAX_TRACE,("Not found\n")); - WSASetLastError(WSANO_DATA); - return 0; - } - - if (strstr(AddressStr, ":")) - { - //DbgPrint("AF_INET6 NOT SUPPORTED!\n"); - WSASetLastError(WSAEINVAL); - return 0; - } - - Address = inet_addr(AddressStr); - if (Address == INADDR_NONE) - { - WSASetLastError(WSAEINVAL); - return 0; - } - - return Address; -} - INT NSP_GetHostByNameHeapAllocW(_In_ WCHAR* name, _In_ GUID* lpProviderId, @@ -614,19 +475,14 @@ }; typedef enum addr_type addr_type; addr_type addr; - INT ret = 0; - WCHAR* found = 0; DNS_STATUS dns_status = {0}; /* include/WinDNS.h -- look up DNS_RECORD on MSDN */ PDNS_RECORD dp; PDNS_RECORD curr; - WCHAR* tmpHostnameW; CHAR* tmpHostnameA; - IP4_ADDRESS address; INT result = ERROR_SUCCESS; /* needed to be cleaned up if != NULL */ - tmpHostnameW = NULL; dp = NULL; addr = GH_INVALID; @@ -637,23 +493,8 @@ goto cleanup; } - /* Hostname "" / "localhost" - - convert to "computername" */ - if ((wcscmp(L"", name) == 0) /*|| - (wcsicmp(L"localhost", name) == 0)*/) - { - ret = NSP_GetHostNameHeapAllocW(&tmpHostnameW); - if (ret != ERROR_SUCCESS) - { - result = ret; - goto cleanup; - } - name = tmpHostnameW; - } - /* Is it an IPv6 address? */ - found = wcschr(name, L':'); - if (found != NULL) + if (wcschr(name, L':') != NULL) { addr = GH_IPV6; goto act; @@ -693,15 +534,6 @@ /* DNS_TYPE_A: include/WinDNS.h */ /* DnsQuery -- lib/dnsapi/dnsapi/query.c */ - /* Look for the DNS name in the hosts file */ - if ((address = FindEntryInHosts(name)) != 0) - { - hostinfo->hostnameW = StrCpyHeapAllocW(hHeap, name); - hostinfo->addr4 = address; - result = ERROR_SUCCESS; - goto cleanup; - } - tmpHostnameA = StrW2AHeapAlloc(hHeap, name); dns_status = DnsQuery(tmpHostnameA, DNS_TYPE_A, @@ -760,9 +592,6 @@ if (dp != NULL) DnsRecordListFree(dp, DnsFreeRecordList); - if (tmpHostnameW != NULL) - HeapFree(hHeap, 0, tmpHostnameW); - return result; } @@ -825,6 +654,97 @@ return TRUE; } + +HANDLE +WSAAPI +OpenNetworkDatabase(PCHAR Name) +{ + PCHAR ExpandedPath; + PCHAR DatabasePath; + INT ErrorCode; + HKEY DatabaseKey; + DWORD RegType; + DWORD RegSize = 0; + HANDLE ret; + + ExpandedPath = HeapAlloc(GetProcessHeap(), 0, MAX_PATH); + if (!ExpandedPath) + return INVALID_HANDLE_VALUE; + + /* Open the database path key */ + ErrorCode = RegOpenKeyExA(HKEY_LOCAL_MACHINE, + "System\\CurrentControlSet\\Services\\Tcpip\\Parameters", + 0, + KEY_READ, + &DatabaseKey); + if (ErrorCode == NO_ERROR) + { + /* Read the actual path */ + ErrorCode = RegQueryValueExA(DatabaseKey, + "DatabasePath", + NULL, + &RegType, + NULL, + &RegSize); + + DatabasePath = HeapAlloc(GetProcessHeap(), 0, RegSize); + if (!DatabasePath) + { + HeapFree(GetProcessHeap(), 0, ExpandedPath); + return INVALID_HANDLE_VALUE; + } + + /* Read the actual path */ + ErrorCode = RegQueryValueExA(DatabaseKey, + "DatabasePath", + NULL, + &RegType, + (LPBYTE)DatabasePath, + &RegSize); + + /* Close the key */ + RegCloseKey(DatabaseKey); + + /* Expand the name */ + ExpandEnvironmentStringsA(DatabasePath, ExpandedPath, MAX_PATH); + + HeapFree(GetProcessHeap(), 0, DatabasePath); + } + else + { + /* Use defalt path */ + GetSystemDirectoryA(ExpandedPath, MAX_PATH); + if (ExpandedPath[strlen(ExpandedPath) - 1] != '\\') + { + /* It isn't, so add it ourselves */ + strncat(ExpandedPath, "\\", MAX_PATH); + } + strncat(ExpandedPath, "DRIVERS\\ETC\\", MAX_PATH); + } + + /* Make sure that the path is backslash-terminated */ + if (ExpandedPath[strlen(ExpandedPath) - 1] != '\\') + { + /* It isn't, so add it ourselves */ + strncat(ExpandedPath, "\\", MAX_PATH); + } + + /* Add the database name */ + strncat(ExpandedPath, Name, MAX_PATH); + + /* Return a handle to the file */ + ret = CreateFileA(ExpandedPath, + FILE_READ_DATA, + FILE_SHARE_READ, + NULL, + OPEN_EXISTING, + FILE_ATTRIBUTE_NORMAL, + NULL); + + HeapFree(GetProcessHeap(), 0, ExpandedPath); + return ret; +} + INT NSP_GetServiceByNameHeapAllocW(_In_ WCHAR* nameW, _In_ GUID* lpProviderId, @@ -833,14 +753,11 @@ BOOL Found = FALSE; HANDLE ServicesFile; CHAR ServiceDBData[BUFSIZ * sizeof(WCHAR)] = {0}; - PWCHAR SystemDirectory = (PWCHAR)ServiceDBData; /* Reuse this stack space */ - PWCHAR ServicesFileLocation = L"\\drivers\\etc\\services"; PCHAR ThisLine = 0, NextLine = 0, ServiceName = 0, PortNumberStr = 0, ProtocolStr = 0, Comment = 0, EndValid; PCHAR Aliases[WS2_INTERNAL_MAX_ALIAS] = {0}; PCHAR* AliasPtr; - UINT i = 0, - SystemDirSize = (sizeof(ServiceDBData) / sizeof(WCHAR)) - 1; + UINT i = 0; DWORD ReadSize = 0; HANDLE hHeap; PCHAR nameA = NULL; @@ -872,23 +789,7 @@ StringCbCopyA(nameServiceA, i + 1, nameA); nameServiceA[i] = '\0'; - if (!GetSystemDirectoryW(SystemDirectory, SystemDirSize)) - { - /* Can't get system directory */ - res = WSANO_RECOVERY; - goto End; - } - - wcsncat(SystemDirectory, ServicesFileLocation, SystemDirSize); - - ServicesFile = CreateFileW(SystemDirectory, - GENERIC_READ, - FILE_SHARE_READ, - NULL, - OPEN_EXISTING, - FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, - NULL); - + ServicesFile = OpenNetworkDatabase("services"); if (ServicesFile == INVALID_HANDLE_VALUE) { return WSANO_RECOVERY; Index: dll/win32/ws2_32/src/getproto.c =================================================================== --- dll/win32/ws2_32/src/getproto.c (revision 72796) +++ dll/win32/ws2_32/src/getproto.c (working copy) @@ -95,8 +95,8 @@ /* Return a handle to the file */ ret = CreateFile(ExpandedPath, - FILE_READ_ACCESS, - 0, + FILE_READ_DATA, + FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, Index: sdk/lib/3rdparty/adns/src/adns.h =================================================================== --- sdk/lib/3rdparty/adns/src/adns.h (revision 72796) +++ sdk/lib/3rdparty/adns/src/adns.h (working copy) @@ -368,6 +368,7 @@ /* ReactOS addition */ ADNS_API void adns_addserver(adns_state state, struct in_addr server); +ADNS_API void adns_ccf_search(adns_state ads, const char *fn, int lno, const char *buf); ADNS_API int adns_init_strcfg(adns_state *newstate_r, adns_initflags flags, FILE *diagfile /*0=>discard*/, const char *configtext); Index: sdk/lib/3rdparty/adns/src/setup.c =================================================================== --- sdk/lib/3rdparty/adns/src/setup.c (revision 72796) +++ sdk/lib/3rdparty/adns/src/setup.c (working copy) @@ -571,18 +571,6 @@ #ifdef ADNS_JGAA_WIN32 #define SECURE_PATH_LEN (MAX_PATH - 64) char PathBuf[MAX_PATH]; - struct in_addr addr; -#ifdef __REACTOS__ - PFIXED_INFO network_info; - ULONG network_info_blen = 0; -#else - #define ADNS_PFIXED_INFO_BLEN (2048) - PFIXED_INFO network_info = (PFIXED_INFO)_alloca(ADNS_PFIXED_INFO_BLEN); - ULONG network_info_blen = ADNS_PFIXED_INFO_BLEN; -#endif /* __REACTOS__ */ - DWORD network_info_result; - PIP_ADDR_STRING pip; - const char *network_err_str = ""; #endif r= init_begin(&ads, flags, diagfile ? diagfile : stderr); @@ -606,36 +594,6 @@ GetWindowsDirectory(PathBuf, SECURE_PATH_LEN); strcat(PathBuf,"\\System32\\Drivers\\etc\\resolv-adns.conf"); readconfig(ads,PathBuf,0); -#ifdef __REACTOS__ - network_info_result = GetNetworkParams(NULL, &network_info_blen); - network_info = (PFIXED_INFO)malloc((size_t)network_info_blen); -#endif - network_info_result = GetNetworkParams(network_info, &network_info_blen); - if (network_info_result != ERROR_SUCCESS){ - switch(network_info_result) { - case ERROR_BUFFER_OVERFLOW: network_err_str = "ERROR_BUFFER_OVERFLOW"; break; - case ERROR_INVALID_PARAMETER: network_err_str = "ERROR_INVALID_PARAMETER"; break; - case ERROR_NO_DATA: network_err_str = "ERROR_NO_DATA"; break; - case ERROR_NOT_SUPPORTED: network_err_str = "ERROR_NOT_SUPPORTED"; break;} - adns__diag(ads,-1,0,"GetNetworkParams() failed with error [%d] %s", - network_info_result,network_err_str); - } - else { - for(pip = &(network_info->DnsServerList); pip; pip = pip->Next) { - addr.s_addr = inet_addr(pip->IpAddress.String); - if ((addr.s_addr != INADDR_ANY) && (addr.s_addr != INADDR_NONE)) - addserver(ads, addr); -#ifdef __REACTOS__ - if (network_info->DomainName) - ccf_search(ads, "LOCALDOMAIN", -1, network_info->DomainName); - else - ccf_search(ads, "LOCALDOMAIN", -1, ""); -#endif - } - } -#ifdef __REACTOS__ - if (network_info) free(network_info); -#endif #else readconfig(ads,"/etc/resolv.conf",1); readconfig(ads,"/etc/resolv-adns.conf",0); @@ -753,3 +711,6 @@ void adns_addserver(adns_state ads, struct in_addr addr) { addserver(ads, addr); } +void adns_ccf_search(adns_state ads, const char *fn, int lno, const char *buf) { + ccf_search(ads, fn, lno, buf); +}