From 630f34a0d05814dc8c118bba46bb7098dc48da14 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Sat, 23 Nov 2019 17:07:59 +0100 Subject: [PATCH] [DNSAPI][DNSRSLVR] Parse the hosts file when the resolver is initializing - Move the hosts file handling from dnsapi.dll to the resolver service. Now, the hosts file is no longer parsed on each query. - Add support for DNS_QUERY_WIRE_ONLY and DNS_QUERY_NO_WIRE_QUERY flags to R_ResolverQuery. - GetCurrentTimeInSeconds() should return DWORD instead of DNS_STATUS. --- base/services/dnsrslvr/CMakeLists.txt | 1 + base/services/dnsrslvr/cache.c | 34 ++- base/services/dnsrslvr/dnsrslvr.c | 2 + base/services/dnsrslvr/hostsfile.c | 396 ++++++++++++++++++++++++++ base/services/dnsrslvr/precomp.h | 22 +- base/services/dnsrslvr/rpcserver.c | 59 ++-- dll/win32/dnsapi/query.c | 228 +-------------- sdk/include/reactos/idl/dnsrslvr.idl | 3 + sdk/include/reactos/windns_undoc.h | 2 +- 9 files changed, 484 insertions(+), 263 deletions(-) create mode 100644 base/services/dnsrslvr/hostsfile.c diff --git a/base/services/dnsrslvr/CMakeLists.txt b/base/services/dnsrslvr/CMakeLists.txt index a2821d93763..410715c6171 100644 --- a/base/services/dnsrslvr/CMakeLists.txt +++ b/base/services/dnsrslvr/CMakeLists.txt @@ -5,6 +5,7 @@ add_rpc_files(server ${REACTOS_SOURCE_DIR}/sdk/include/reactos/idl/dnsrslvr.idl) list(APPEND SOURCE cache.c dnsrslvr.c + hostsfile.c rpcserver.c precomp.h ${CMAKE_CURRENT_BINARY_DIR}/dnsrslvr_s.c) diff --git a/base/services/dnsrslvr/cache.c b/base/services/dnsrslvr/cache.c index 6a6eee4844e..748a1599383 100644 --- a/base/services/dnsrslvr/cache.c +++ b/base/services/dnsrslvr/cache.c @@ -20,7 +20,7 @@ static BOOL DnsCacheInitialized = FALSE; VOID DnsIntCacheInitialize(VOID) { - DPRINT("DnsIntCacheInitialize\n"); + DPRINT("DnsIntCacheInitialize()\n"); /* Check if we're initialized */ if (DnsCacheInitialized) @@ -35,7 +35,7 @@ DnsIntCacheInitialize(VOID) VOID DnsIntCacheFree(VOID) { - DPRINT("DnsIntCacheFree\n"); + DPRINT("DnsIntCacheFree()\n"); /* Check if we're initialized */ if (!DnsCacheInitialized) @@ -53,7 +53,7 @@ DnsIntCacheFree(VOID) VOID DnsIntCacheRemoveEntryItem(PRESOLVER_CACHE_ENTRY CacheEntry) { - DPRINT("DnsIntCacheRemoveEntryItem %p\n", CacheEntry); + DPRINT("DnsIntCacheRemoveEntryItem(%p)\n", CacheEntry); /* Remove the entry from the list */ RemoveEntryList(&CacheEntry->CacheLink); @@ -71,7 +71,7 @@ DnsIntCacheFlush(VOID) PLIST_ENTRY Entry; PRESOLVER_CACHE_ENTRY CacheEntry; - DPRINT("DnsIntCacheFlush\n"); + DPRINT("DnsIntCacheFlush()\n"); /* Lock the cache */ DnsCacheLock(); @@ -94,15 +94,19 @@ DnsIntCacheFlush(VOID) DnsCacheUnlock(); } -BOOL -DnsIntCacheGetEntryFromName(LPCWSTR Name, - PDNS_RECORDW *Record) +DNS_STATUS +DnsIntCacheGetEntryByName( + LPCWSTR Name, + WORD wType, + DWORD dwFlags, + PDNS_RECORDW *Record) { - BOOL Ret = FALSE; + DNS_STATUS Status = DNS_INFO_NO_RECORDS; PRESOLVER_CACHE_ENTRY CacheEntry; PLIST_ENTRY NextEntry; - DPRINT("DnsIntCacheGetEntryFromName %ws %p\n", Name, Record); + DPRINT("DnsIntCacheGetEntryByName(%S %hu 0x%lx %p)\n", + Name, wType, dwFlags, Record); /* Assume failure */ *Record = NULL; @@ -122,7 +126,7 @@ DnsIntCacheGetEntryFromName(LPCWSTR Name, { /* Copy the entry and return it */ *Record = DnsRecordSetCopyEx(CacheEntry->Record, DnsCharSetUnicode, DnsCharSetUnicode); - Ret = TRUE; + Status = ERROR_SUCCESS; break; } @@ -132,8 +136,7 @@ DnsIntCacheGetEntryFromName(LPCWSTR Name, /* Release the cache */ DnsCacheUnlock(); - /* Return */ - return Ret; + return Status; } BOOL @@ -143,7 +146,7 @@ DnsIntCacheRemoveEntryByName(LPCWSTR Name) PRESOLVER_CACHE_ENTRY CacheEntry; PLIST_ENTRY NextEntry; - DPRINT("DnsIntCacheRemoveEntryByName %ws\n", Name); + DPRINT("DnsIntCacheRemoveEntryByName(%S)\n", Name); /* Lock the cache */ DnsCacheLock(); @@ -179,7 +182,10 @@ DnsIntCacheAddEntry(PDNS_RECORDW Record) { PRESOLVER_CACHE_ENTRY Entry; - DPRINT("DnsIntCacheRemoveEntryByName %p\n", Record); + DPRINT("DnsIntCacheAddEntry(%p)\n", Record); + + DPRINT("Name: %S\n", Record->pName); + DPRINT("TTL: %lu\n", Record->dwTtl); /* Lock the cache */ DnsCacheLock(); diff --git a/base/services/dnsrslvr/dnsrslvr.c b/base/services/dnsrslvr/dnsrslvr.c index c0384050ca9..efcdcee0cce 100644 --- a/base/services/dnsrslvr/dnsrslvr.c +++ b/base/services/dnsrslvr/dnsrslvr.c @@ -101,6 +101,8 @@ ServiceMain( DnsIntCacheInitialize(); + ReadHostsFile(); + hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) diff --git a/base/services/dnsrslvr/hostsfile.c b/base/services/dnsrslvr/hostsfile.c new file mode 100644 index 00000000000..1f12b87455f --- /dev/null +++ b/base/services/dnsrslvr/hostsfile.c @@ -0,0 +1,396 @@ +/* + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS system libraries + * FILE: base/services/dnsrslvr/hostsfile.c + * PURPOSE: HOSTS file routines + * PROGRAMERS: Art Yerkes + * Eric Kohl + */ + +#include "precomp.h" + + +#define NDEBUG +#include + + +static +PWSTR +AnsiToUnicode( + PSTR NarrowString) +{ + PWSTR WideString; + int WideLen; + + WideLen = MultiByteToWideChar(CP_ACP, + 0, + NarrowString, + -1, + NULL, + 0); + if (WideLen == 0) + return NULL; + + WideString = HeapAlloc(GetProcessHeap(), + 0, + WideLen * sizeof(WCHAR)); + if (WideString == NULL) + return NULL; + + MultiByteToWideChar(CP_ACP, + 0, + NarrowString, + -1, + WideString, + WideLen); + + return WideString; +} + + +static +BOOL +ParseV4Address( + LPCSTR AddressString, + OUT PDWORD pAddress) +{ + CHAR *cp; + DWORD val, base; + unsigned char c; + DWORD parts[4], *pp = parts; + + cp = (CHAR *)AddressString; + + if (!AddressString) + return FALSE; + + if (!isdigit(*cp)) + return FALSE; + +again: + /* + * Collect number up to ``.''. + * Values are specified as for C: + * 0x=hex, 0=octal, other=decimal. + */ + val = 0; base = 10; + if (*cp == '0') + { + if (*++cp == 'x' || *cp == 'X') + base = 16, cp++; + else + base = 8; + } + + while ((c = *cp)) + { + if (isdigit(c)) + { + val = (val * base) + (c - '0'); + cp++; + continue; + } + + if (base == 16 && isxdigit(c)) + { + val = (val << 4) + (c + 10 - (islower(c) ? 'a' : 'A')); + cp++; + continue; + } + break; + } + + if (*cp == '.') + { + /* + * Internet format: + * a.b.c.d + */ + if (pp >= parts + 4) + return FALSE; + *pp++ = val; + cp++; + goto again; + } + + /* Check for trailing characters */ + if (*cp && *cp > ' ') + return FALSE; + + if (pp >= parts + 4) + return FALSE; + + *pp++ = val; + /* + * Concoct the address according to + * the number of parts specified. + */ + if ((DWORD)(pp - parts) != 4) + return FALSE; + + if (parts[0] > 0xff || parts[1] > 0xff || parts[2] > 0xff || parts[3] > 0xff) + return FALSE; + + val = (parts[3] << 24) | (parts[2] << 16) | (parts[1] << 8) | parts[0]; + + if (pAddress) + *pAddress = val; + + return TRUE; +} + + +static +VOID +AddV4HostEntries( + PWSTR pszHostName, + DWORD dwIpAddress) +{ + DNS_RECORDW ARecord, PtrRecord; + WCHAR szInAddrArpaName[32]; + + /* Prepare the A record */ + ZeroMemory(&ARecord, sizeof(DNS_RECORDW)); + + ARecord.pName = pszHostName; + ARecord.wType = DNS_TYPE_A; + ARecord.wDataLength = sizeof(DNS_A_DATA); + ARecord.dwTtl = 86400; + + ARecord.Data.A.IpAddress = dwIpAddress; + + swprintf(szInAddrArpaName, + L"%u.%u.%u.%u.in-addr.arpa", + (dwIpAddress >> 24) & 0xFF, + (dwIpAddress >> 16) & 0xFF, + (dwIpAddress >> 8) & 0xFF, + dwIpAddress & 0xFF); + + /* Prepare the PTR record */ + ZeroMemory(&PtrRecord, sizeof(DNS_RECORDW)); + + PtrRecord.pName = szInAddrArpaName; + PtrRecord.wType = DNS_TYPE_PTR; + PtrRecord.wDataLength = sizeof(DNS_PTR_DATA); + PtrRecord.dwTtl = 86400; + + PtrRecord.Data.PTR.pNameHost = pszHostName; + + DnsIntCacheAddEntry(&ARecord); + DnsIntCacheAddEntry(&PtrRecord); +} + + +static +FILE * +OpenHostsFile(VOID) +{ + PWSTR ExpandedPath; + PWSTR DatabasePath; + HKEY DatabaseKey; + DWORD RegSize = 0; + size_t StringLength; + FILE *pHostsFile; + DWORD dwError; + + ExpandedPath = HeapAlloc(GetProcessHeap(), 0, MAX_PATH * sizeof(WCHAR)); + if (ExpandedPath == NULL) + return NULL; + + /* Open the database path key */ + dwError = RegOpenKeyExW(HKEY_LOCAL_MACHINE, + L"System\\CurrentControlSet\\Services\\Tcpip\\Parameters", + 0, + KEY_READ, + &DatabaseKey); + if (dwError == ERROR_SUCCESS) + { + /* Read the actual path */ + RegQueryValueExW(DatabaseKey, + L"DatabasePath", + NULL, + NULL, + NULL, + &RegSize); + + DatabasePath = HeapAlloc(GetProcessHeap(), 0, RegSize); + if (DatabasePath == NULL) + { + HeapFree(GetProcessHeap(), 0, ExpandedPath); + RegCloseKey(DatabaseKey); + return NULL; + } + + /* Read the actual path */ + dwError = RegQueryValueExW(DatabaseKey, + L"DatabasePath", + NULL, + NULL, + (LPBYTE)DatabasePath, + &RegSize); + + /* Close the key */ + RegCloseKey(DatabaseKey); + + if (dwError != ERROR_SUCCESS) + { + HeapFree(GetProcessHeap(), 0, DatabasePath); + HeapFree(GetProcessHeap(), 0, ExpandedPath); + return NULL; + } + + /* Expand the name */ + ExpandEnvironmentStringsW(DatabasePath, ExpandedPath, MAX_PATH); + + HeapFree(GetProcessHeap(), 0, DatabasePath); + } + else + { + /* Use defalt path */ + GetSystemDirectoryW(ExpandedPath, MAX_PATH); + + StringCchLengthW(ExpandedPath, MAX_PATH, &StringLength); + if (ExpandedPath[StringLength - 1] != L'\\') + { + /* It isn't, so add it ourselves */ + StringCchCatW(ExpandedPath, MAX_PATH, L"\\"); + } + + StringCchCatW(ExpandedPath, MAX_PATH, L"drivers\\etc\\"); + } + + /* Make sure that the path is backslash-terminated */ + StringCchLengthW(ExpandedPath, MAX_PATH, &StringLength); + if (ExpandedPath[StringLength - 1] != L'\\') + { + /* It isn't, so add it ourselves */ + StringCchCatW(ExpandedPath, MAX_PATH, L"\\"); + } + + /* Add the database name */ + StringCchCatW(ExpandedPath, MAX_PATH, L"hosts"); + + /* Open the hosts file */ + pHostsFile = _wfopen(ExpandedPath, L"r"); + + HeapFree(GetProcessHeap(), 0, ExpandedPath); + + return pHostsFile; +} + + +BOOL +ReadHostsFile(VOID) +{ + CHAR szLineBuffer[512]; + FILE *pHostFile = NULL; + CHAR *Ptr, *NameStart, *NameEnd, *AddressStart, *AddressEnd; + DWORD Address; + PWSTR pszHostName; + + pHostFile = OpenHostsFile(); + if (pHostFile == NULL) + return FALSE; + + for (;;) + { + /* Read a line */ + if (fgets(szLineBuffer, sizeof(szLineBuffer), pHostFile) == NULL) + break; + + NameStart = NameEnd = NULL; + AddressStart = AddressEnd = NULL; + + /* Search for the start of the ip address */ + Ptr = szLineBuffer; + for (;;) + { + if (*Ptr == 0 || *Ptr == '#') + break; + + if (!isspace(*Ptr)) + { + AddressStart = Ptr; + Ptr = Ptr + 1; + break; + } + + Ptr = Ptr + 1; + } + + /* Search for the end of the ip address */ + for (;;) + { + if (*Ptr == 0 || *Ptr == '#') + break; + + if (isspace(*Ptr)) + { + AddressEnd = Ptr; + Ptr = Ptr + 1; + break; + } + + Ptr = Ptr + 1; + } + + /* Search for the start of the name */ + for (;;) + { + if (*Ptr == 0 || *Ptr == '#') + break; + + if (!isspace(*Ptr)) + { + NameStart = Ptr; + Ptr = Ptr + 1; + break; + } + + Ptr = Ptr + 1; + } + + /* Search for the end of the name */ + for (;;) + { + if (*Ptr == 0 || *Ptr == '#') + break; + + if (isspace(*Ptr)) + { + NameEnd = Ptr; + break; + } + + Ptr = Ptr + 1; + } + + if (AddressStart == NULL || AddressEnd == NULL || + NameStart == NULL || NameEnd == NULL) + continue; + + *AddressEnd = 0; + *NameEnd = 0; + + DPRINT("%s ==> %s\n", NameStart, AddressStart); + + if (ParseV4Address(AddressStart, &Address)) + { + DPRINT("IP4: %s ==> 0x%08lx\n", AddressStart, Address); + + pszHostName = AnsiToUnicode(NameStart); + if (pszHostName != NULL) + { + AddV4HostEntries(pszHostName, Address); + + HeapFree(GetProcessHeap(), 0, pszHostName); + } + } + } + + fclose(pHostFile); + + return TRUE; +} + +/* EOF */ diff --git a/base/services/dnsrslvr/precomp.h b/base/services/dnsrslvr/precomp.h index 3983d3100a3..c0bbeecd30e 100644 --- a/base/services/dnsrslvr/precomp.h +++ b/base/services/dnsrslvr/precomp.h @@ -2,6 +2,7 @@ #define _DNSRSLVR_PCH_ #include +#include #define WIN32_NO_STATUS #define _INC_WINDOWS @@ -9,15 +10,20 @@ #include #include +#include +#include #include #include #include +#define NTOS_MODE_USER #include #include #include +#include + typedef struct _RESOLVER_CACHE_ENTRY { LIST_ENTRY CacheLink; @@ -37,10 +43,22 @@ VOID DnsIntCacheInitialize(VOID); VOID DnsIntCacheRemoveEntryItem(PRESOLVER_CACHE_ENTRY CacheEntry); VOID DnsIntCacheFree(VOID); VOID DnsIntCacheFlush(VOID); -BOOL DnsIntCacheGetEntryFromName(LPCWSTR Name, - PDNS_RECORDW *Record); + +DNS_STATUS +DnsIntCacheGetEntryByName( + LPCWSTR Name, + WORD wType, + DWORD dwFlags, + PDNS_RECORDW *Record); + VOID DnsIntCacheAddEntry(PDNS_RECORDW Record); BOOL DnsIntCacheRemoveEntryByName(LPCWSTR Name); + +/* hostsfile.c */ + +BOOL +ReadHostsFile(VOID); + #endif /* _DNSRSLVR_PCH_ */ diff --git a/base/services/dnsrslvr/rpcserver.c b/base/services/dnsrslvr/rpcserver.c index 913d2b32a78..cb4b9476b04 100644 --- a/base/services/dnsrslvr/rpcserver.c +++ b/base/services/dnsrslvr/rpcserver.c @@ -41,30 +41,32 @@ RpcThreadRoutine(LPVOID lpParameter) return 0; } +/* Function: 0x04 */ DWORD __stdcall R_ResolverFlushCache( - DNSRSLVR_HANDLE pwszServerName) + _In_ DNSRSLVR_HANDLE pwszServerName) { DPRINT("R_ResolverFlushCache()\n"); // FIXME Should store (and flush) entries by server handle DnsIntCacheFlush(); - return 0; + return ERROR_SUCCESS; } +/* Function: 0x07 */ DWORD __stdcall R_ResolverQuery( - DNSRSLVR_HANDLE pszServerName, - LPCWSTR pszName, - WORD wType, - DWORD dwFlags, - DWORD *dwRecords, - DNS_RECORDW **ppResultRecords) + _In_ DNSRSLVR_HANDLE pszServerName, + _In_ LPCWSTR pszName, + _In_ WORD wType, + _In_ DWORD dwFlags, + _Inout_ DWORD *dwRecords, + _Out_ DNS_RECORDW **ppResultRecords) { PDNS_RECORDW Record; - DNS_STATUS Status; + DNS_STATUS Status = ERROR_SUCCESS; DPRINT("R_ResolverQuery(%S %S %x %lx %p %p)\n", pszServerName, pszName, wType, dwFlags, dwRecords, ppResultRecords); @@ -75,22 +77,41 @@ R_ResolverQuery( if ((dwFlags & DNS_QUERY_WIRE_ONLY) != 0 && (dwFlags & DNS_QUERY_NO_WIRE_QUERY) != 0) return ERROR_INVALID_PARAMETER; - if (DnsIntCacheGetEntryFromName(pszName, ppResultRecords)) - { - DPRINT("DNS cache query successful!\n"); - Status = ERROR_SUCCESS; - } - else + if (dwFlags & DNS_QUERY_WIRE_ONLY) { DPRINT("DNS query!\n"); Status = Query_Main(pszName, wType, dwFlags, ppResultRecords); - if (Status == ERROR_SUCCESS) + } + else if (dwFlags & DNS_QUERY_NO_WIRE_QUERY) + { + DPRINT("DNS cache query!\n"); + Status = DnsIntCacheGetEntryByName(pszName, + wType, + dwFlags, + ppResultRecords); + } + else + { + DPRINT("DNS cache query!\n"); + Status = DnsIntCacheGetEntryByName(pszName, + wType, + dwFlags, + ppResultRecords); + if (Status == DNS_INFO_NO_RECORDS) { - DPRINT("DNS query successful!\n"); - DnsIntCacheAddEntry(*ppResultRecords); + DPRINT("DNS query!\n"); + Status = Query_Main(pszName, + wType, + dwFlags, + ppResultRecords); + if (Status == ERROR_SUCCESS) + { + DPRINT("DNS query successful!\n"); + DnsIntCacheAddEntry(*ppResultRecords); + } } } @@ -125,6 +146,6 @@ void __RPC_USER midl_user_free(void __RPC_FAR * ptr) HeapFree(GetProcessHeap(), 0, ptr); } -void __RPC_USER WLANSVC_RPC_HANDLE_rundown(DNSRSLVR_HANDLE hClientHandle) +void __RPC_USER DNSRSLVR_RPC_HANDLE_rundown(DNSRSLVR_HANDLE hClientHandle) { } diff --git a/dll/win32/dnsapi/query.c b/dll/win32/dnsapi/query.c index d830e26f4a0..3ffaa41dffe 100644 --- a/dll/win32/dnsapi/query.c +++ b/dll/win32/dnsapi/query.c @@ -377,97 +377,6 @@ CHAR return p; } -HANDLE -OpenNetworkDatabase(LPCWSTR Name) -{ - PWSTR ExpandedPath; - PWSTR DatabasePath; - INT ErrorCode; - HKEY DatabaseKey; - DWORD RegType; - DWORD RegSize = 0; - size_t StringLength; - HANDLE ret; - - ExpandedPath = HeapAlloc(GetProcessHeap(), 0, MAX_PATH * sizeof(WCHAR)); - if (!ExpandedPath) - return INVALID_HANDLE_VALUE; - - /* Open the database path key */ - ErrorCode = RegOpenKeyExW(HKEY_LOCAL_MACHINE, - L"System\\CurrentControlSet\\Services\\Tcpip\\Parameters", - 0, - KEY_READ, - &DatabaseKey); - if (ErrorCode == NO_ERROR) - { - /* Read the actual path */ - ErrorCode = RegQueryValueExW(DatabaseKey, - L"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 = RegQueryValueExW(DatabaseKey, - L"DatabasePath", - NULL, - &RegType, - (LPBYTE)DatabasePath, - &RegSize); - - /* Close the key */ - RegCloseKey(DatabaseKey); - - /* Expand the name */ - ExpandEnvironmentStringsW(DatabasePath, ExpandedPath, MAX_PATH); - - HeapFree(GetProcessHeap(), 0, DatabasePath); - } - else - { - /* Use defalt path */ - GetSystemDirectoryW(ExpandedPath, MAX_PATH); - StringCchLengthW(ExpandedPath, MAX_PATH, &StringLength); - if (ExpandedPath[StringLength - 1] != L'\\') - { - /* It isn't, so add it ourselves */ - StringCchCatW(ExpandedPath, MAX_PATH, L"\\"); - } - StringCchCatW(ExpandedPath, MAX_PATH, L"DRIVERS\\ETC\\"); - } - - /* Make sure that the path is backslash-terminated */ - StringCchLengthW(ExpandedPath, MAX_PATH, &StringLength); - if (ExpandedPath[StringLength - 1] != L'\\') - { - /* It isn't, so add it ourselves */ - StringCchCatW(ExpandedPath, MAX_PATH, L"\\"); - } - - /* Add the database name */ - StringCchCatW(ExpandedPath, MAX_PATH, Name); - - /* Return a handle to the file */ - ret = CreateFileW(ExpandedPath, - FILE_READ_DATA, - FILE_SHARE_READ, - NULL, - OPEN_EXISTING, - FILE_ATTRIBUTE_NORMAL, - NULL); - - HeapFree(GetProcessHeap(), 0, ExpandedPath); - return ret; -} /* This function is far from perfect but it works enough */ IP4_ADDRESS @@ -609,118 +518,6 @@ again: return TRUE; } -/* This function is far from perfect but it works enough */ -IP4_ADDRESS -FindEntryInHosts(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(L"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 (!stricmp(name, DnsName) || !stricmp(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; - } - - if (!ParseV4Address(AddressStr, &Address)) - { - WSASetLastError(WSAEINVAL); - return 0; - } - - return Address; -} DNS_STATUS WINAPI DnsQuery_W(LPCWSTR Name, @@ -858,29 +655,6 @@ Query_Main(LPCWSTR Name, i++; } - if ((Options & DNS_QUERY_NO_HOSTS_FILE) == 0) - { - if ((Address = FindEntryInHosts(AnsiName)) != 0) - { - RtlFreeHeap(RtlGetProcessHeap(), 0, AnsiName); - *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 = (LPSTR)xstrsave(Name); - - return (*QueryResultSet)->pName ? ERROR_SUCCESS : ERROR_OUTOFMEMORY; - } - } - network_info_result = GetNetworkParams(NULL, &network_info_blen); network_info = (PFIXED_INFO)RtlAllocateHeap(RtlGetProcessHeap(), 0, (size_t)network_info_blen); if (NULL == network_info) @@ -1122,7 +896,7 @@ DnsFlushResolverCache(VOID) return (Status == ERROR_SUCCESS); } -DNS_STATUS +DWORD WINAPI GetCurrentTimeInSeconds(VOID) { diff --git a/sdk/include/reactos/idl/dnsrslvr.idl b/sdk/include/reactos/idl/dnsrslvr.idl index 2c0bf7b787d..cae2e196e62 100644 --- a/sdk/include/reactos/idl/dnsrslvr.idl +++ b/sdk/include/reactos/idl/dnsrslvr.idl @@ -10,6 +10,9 @@ cpp_quote("#ifndef _WINDNS_INCLUDED_") #include cpp_quote("#endif") +cpp_quote("#ifndef _WINDNS_UNDOC_H_") +#include +cpp_quote("#endif") typedef [handle, string] LPWSTR DNSRSLVR_HANDLE; diff --git a/sdk/include/reactos/windns_undoc.h b/sdk/include/reactos/windns_undoc.h index 56cc56d205c..1b07f61f94a 100644 --- a/sdk/include/reactos/windns_undoc.h +++ b/sdk/include/reactos/windns_undoc.h @@ -27,7 +27,7 @@ WINAPI DnsGetCacheDataTable( _Out_ PDNS_CACHE_ENTRY *DnsCache); -DNS_STATUS +DWORD WINAPI GetCurrentTimeInSeconds(VOID);